unittest库
unittest库是python的内置库,用来对程序进行测试。
组成部分
名称 | 用途 |
---|---|
TestCase | 测试用例,执行测试时依次调用setUp() ,测试用例内部方法,tearDown()
|
TestSuite | 测试用例的集合,可以通过addTest() 来添加,顺序执行内部各个测试用例 |
TestRunner | 运行测试,可以执行TestCase 和TestSuite
|
TestFixture | 测试过程前的环境准备和后的清理,最常用的是setUp() 和tearDown()
|
使用方法
首先要导入unittest
模块,再新建一个继承unittest.TestCase
的测试类,测试用例用类方法的形式编写,注意命名必须以test开头。
import unittest
class TestXXX(unittest.TestCase):
def test_xxx(self):
pass
测试环境准备
需要准备和清理测试环境时,要用到setUp()
和tearDown()
,还有setUpClass()
和tearDownClass()
。
import unittest
class TestXXX(unittest.TestCase):
@classmethod
def setUpClass(self):
pass # prepare environment for all tests
@classmethod
def tearDownClass(self):
pass # clear environment for all tests
def setUp(self):
pass # prepare environment for each test
def tearDown(self):
pass # clear environment for the test
def test_xxx(self):
pass
setUp()
和tearDown()
会在每个测试用例执行前后各执行一遍,而setUpClass()
和tearDownClass()
只会执行一次,分别在整个测试流程开始和结束时。
执行测试
if __name__ == '__main__':
unittest.main()
这是最简单的执行测试的方法,会执行所有的测试用例。
TestSuite的使用
在测试类中我们可能定义多个测试用例,但是执行时他们不会按照定义时的顺序执行,而是按照方法名的顺序,可能不是我们想要的情况。这时就要用到TestSuite
来限制执行的顺序。它还能用来选择执行哪些测试用例。
if __name__ == '__main__':
suite = unittest.TestSuite()
tests = [
TestXXX('test_xxx'),
TestXXX('test_yyy'),
TestXXX('test_zzz')
]
suite.addTests(tests)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
这样我们就可以限定执行哪些测试,以什么顺序执行。还可以用addTest()
添加测试用例。这里还用到了TestRunner
,其中的verbosity
参数表示展示测试结果的详细程度,0最简略,2最详细。
跳过某些测试用例
如果我们希望在特定条件下跳过或执行某个测试用例,unittest提供了一些跳过测试用例的方法。
方法 | 用法 |
---|---|
@unittest.skip(reason) | 强制跳过,reason是跳过原因 |
@unittest.skipIf(condition, reason) | condition为True的时候跳过 |
@unittest.skipUnless(condition, reason) | condition为False的时候跳过 |
@unittest.expectedFailure | 如果test失败了,这个test不计入失败的case数目 |
import unittest
class TestXXX(unittest.TestCase):
@classmethod
def setUpClass(self):
pass # prepare environment for all tests
@classmethod
def tearDownClass(self):
pass # clear environment for all tests
def setUp(self):
pass # prepare environment for each test
def tearDown(self):
pass # clear environment for the test
def test_xxx(self):
pass
@unittest.skip('Skip this test case.')
def test_yyy(self):
pass # 这个测试用例不会被执行
def test_zzz(self):
pass
判定方法
unittest提供了很多断言,来判断测试是否成功。
断言 | 含义 |
---|---|
self.assertEqual(a,b) | a==b |
self.assertNotEqual(a,b) | a!=b |
self.assertTrue(x) | x is True |
self.assertFalse(x) | x is False |
self.assertIn(a,b) | a in b |
self.assertNotIn(a,b) | a not in b |
也可以直接
assert
接布尔表达式来判断,例如assert a==1
。