单元测试
单元测试简介
在软件开发中,单元测试是一种测试方法,用来测试程序的最小单元,通常是一个函数或一个类。单元测试的目的是验证程序的正确性,确保程序的每一个部分都能正常工作。但是在实际开发中,很多程序员并不重视单元测试,认为它是一种浪费时间的行为,但是单元测试是重要的,可以提高程序的质量,减少复工。
单元测试框架
在 Python 中,有很多单元测试框架,这里我们主要介绍 unittest
单元测试框架。
unittest 单元测试框架
Person
类:
1 | class Person: |
unittest
编码:
1 | # test_person.py |
运行测试:
1 | $ python -m unittest test_person.py |
断言
断言指的是在程序中判断一个条件是否满足,如果满足就继续执行,如果不满足就抛出异常。
在单元测试中,我们通常使用断言来验证程序的正确性,unittest
框架提供了很多断言方法,常用方法包括:
assertEqual(a, b)
:判断 a 和 b 是否相等assertNotEqual(a, b)
:判断 a 和 b 是否不相等assertTrue(x)
:判断 x 是否为 TrueassertFalse(x)
:判断 x 是否为 FalseassertIs(a, b)
:判断 a 和 b 是否是同一个对象assertIsNot(a, b)
:判断 a 和 b 是否不是同一个对象assertIsNone(x)
:判断 x 是否为 NoneassertIsNotNone(x)
:判断 x 是否不为 None
如上面的例子中,我们使用了 assertEqual
方法来判断两个值是否相等。
框架流程方法
在单元测试的过程中,unittest
框架提供了一些流程方法,可以在测试用例执行之前或之后执行一些操作,这些方法包括:
setUp
方法:在测试用例执行之前执行tearDown
方法:在测试用例执行之后执行setUpClass
方法:在测试类执行之前执行tearDownClass
方法:在测试类执行之后执行
比如,我们可以在 setUp
方法中创建测试对象,然后在 tearDown
方法中销毁测试对象。
1 | # test_person.py |
在
setUp
方法中创建了一个Person
对象,这样就可以在测试用例中直接使用这个对象,而不需要在每个测试用例中都创建一个对象。
由于setUp
方法是在测试用例执行之前执行的,所以是每个测试用例执行之前都会执行一次setUp
方法,即使在测试用例中修改了对象的属性,也不会影响其他测试用例。
1 | # test_person.py |
如果将
setUp
方法改为setUpClass
方法,那么这个方法就是在测试类执行之前执行的,也就是说,这个方法只会执行一次,而不是每个测试用例执行之前都会执行一次。这样如果在测试用例中修改了对象的属性,会影响其他测试用例。
单元测试通常测试的内容
通常情况下,单元测试应当覆盖一个类的公开方法,每一个方法都应当有一组测试用例,这些测试用例应当覆盖所有可能的情况,包括正常情况和异常情况。多使用等价类划分法和边界值分析法。