2020年11月26日 / 10次阅读 / Last Modified 2020年12月23日
unittest
python自带unittest这个单元测试框架,这是TDD实战的必需品!(貌似pyunit这个名称指向的就是unittest模块)
每一个继承自unittest.TestCase的类,都是一个测试集(test suite)!
在这个测试集内,可以通过setUp和tearDown函数,来设置每一个属于这个测试集的初始化条件和测试后的清理。即,每一个以test_开头的单元测试函数,在被调用之前,都会执行setUp,执行结束后,都会执行tearDown。
测试集的setUpClass和tearDownClass函数,属于整个测试集的初始化和清理,它们只会在测试集运行前和运行后,被执行一次。注意:这两个成员函数,需要被定义为classmethod(用@classmethod装饰器)。
看一段示例代码:
class test_sort_c(unittest.TestCase):
@classmethod
def setUpClass(cls):
shell('gcc -fPIC -shared sort.c -o sort.so')
cls.sort = ctypes.CDLL('./sort.so')
@classmethod
def tearDownClass(cls):
os.remove('sort.so')
def get_sort(self):
return test_sort_c.sort
def setUp(self):
self.a01 = (1,2,3,4,5,6,7,8,9)
self.ca01 = (ctypes.c_int*9)(*self.a01)
self.dca01 = ctypes.byref(self.ca01)
self.a02 = (9,8,7,6,5,4,3,2,1)
self.ca02 = (ctypes.c_int*9)(*self.a02)
self.dca02 = ctypes.byref(self.ca02)
def tearDown(self):
...
def test_bubble(self):
sort = self.get_sort()
sort.bubble(self.dca01, 9)
self.assertEqual(tuple(self.ca01), self.a01)
sort.bubble(self.dca02, 0)
self.assertEqual(tuple(self.ca02), self.a02)
sort.bubble(self.dca02, -1)
self.assertEqual(tuple(self.ca02), self.a02)
sort.bubble(self.dca02, 9)
self.assertEqual(tuple(self.ca02), self.a01)
setUpClass制作sort.so文件,tearDownClass删除这个文件。这两个动作都需要在整个测试集开始之前和执行后进行,而且只做一次。
setUp函数用于给每个测试单元准备数据,tearDown函数什么都不需要做,留空(用...代替pass)。
在一个.py测试文件中,很可能不止一个测试集,每一个测试集都有不同的启动条件,因此实际上也需要将不同的接口,封装到不同的测试集中。unittest框架可以实现在执行测试的时候,只执行某一个测试集:
$ python3 -m unittest test.test_sort_c
$ python3 test.py test_sort_c
上面的命令,只执行test_sort_c这个测试集。(test_sort_c包含在test.py文件中)
unittest框架还可以提供只执行某一个具体的单元测试函数:
$ python3 -m unittest test.test_common_py.shex
这条命令只执行test.py文件中的test_common_py测试集中的shex单元。
unittest框架常用命令行参数:
-v, 显示详细信息,用这个参数。你会发现unittest对于每个测试集中的测试用例,是按照字典顺序调用的,如果想要控制单元测试的执行顺序,可以直接修改测试函数的名称,只要保证这些函数前面4个字母是test即可,比如test_%d_*。
-f, --failfast, 当发生错误的,停止。
如何控制按顺序执行部分单元测试用例?
比如有一个测试集内有几十个test case,现在只需要将其中的某几个按某种顺序来执行,可以采用自己创建test suite的方法,代码如下:
if __name__ == '__main__':
#unittest.main()
suite = unittest.TestSuite()
suite.addTest(test_common_py('test_shex'))
suite.addTest(test_common_py('test_sbin'))
unittest.main(defaultTest='suite')
#unittest.TextTestRunner(verbosity=2).run(suite)
创建一个suite,然后添加需要的测试用例,测试添加顺序就是测试的执行顺序,然后执行测试。test_common_py是一个测试集(继承自unittest.TestCase)。
控制测试集
下面的示例代码,可以用来控制执行一个测试文件中的部分测试集,也许有一些测试集我们希望通过在命令行直接输入的方式执行,默认不执行,就可以用这个方法:
unittest.main(defaultTest='test_common_py', exit=False)
unittest.main(defaultTest='test_sort_c')
exit=False,表示执行完后不退出(默认退出),代码就会继续后面的测试集。
-- EOF --
本文链接:https://www.pynote.net/archives/2915
前一篇:用XOR(异或)做数值交换
后一篇:7bit压缩编码
Ctrl+D 收藏本页
©Copyright 麦新杰 Since 2019 Python笔记