单元测试:
单元测试,是指对软件中的最小可测试单元进行检查和验证,是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
单元测试是用来对一个模块,一个函数或者一个类来进行正确性检验的测试工作。
编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。
以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。
对每一类测试都需要编写一个test_xxx()方法。由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEquals():
单元测试的意义:
1.减少bug
2.提高代码质量
3.快速定位bug、减少调试时间
4.放心重构
TDD是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只适用于XP(Extreme Programming),同样可以适用于其他开发方法和过程。
TDD好处:通过测试的执行代码,肯定满足需求,而且有助于接口编程,降低代码耦合,也极大降低bug出现几率(如果是极限编程,几乎是不可能有bug)。坏处:1.投入开发资源(时间和精力);2.由于测试用例在未进行代码设计前写;很有可能限制开发者对代码整体设计;3.可能引起开发人员不满情绪
**setUp与testDown:
可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。
setUp()和tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:
可以再次运行测试看看每个测试方法调用前后是否会打印出setup…和tearDown…**
总结:
单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。
单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。
单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。
单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。
示例:
在pycharm里面创建一个Test Python项目
分别创建 MathOp.py、MathOpTest.py、TestSuit.py 三个.py文件
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def add(a, b):
logging.info('test')
return a+b
def mul(a, b):
logging.info('Test')
return a*b
if __name__ == '__main__':
add(1, 2)
mul(1, 2)
import unittest
from MathOpTest import TestMathOp
if __name__ == '__main__':
suite = unittest.TestSuite()
tests = [TestMathOp('test_add'), TestMathOp('test_mul')]
suite.addTests(tests)
runner = unittest.TextTestRunner(verbosity=2)
with open('UnittestTextReport.txt', 'a') as f:
runner = unittest.TextTestRunner(stream=f, verbosity=2)
runner.run(suite)
import unittest
from MathOp import *
class TestMathOp(unittest.TestCase):
def setUp(self):
print('进行测试设置')
def tearDown(self):
print('进行测试清理')
def test_add(self):
self.assertEqual(3, add(1, 2))
def test_mul(self):
self.assertEqual(10, mul(2, 5))
if __name__ == '__main__':
print(1)
运行TestSuit.py文件,可以右键直接运行,也可以点击逐级运行。如图: