unittest框架的使用

2020年11月26日 / 10次阅读 / Last Modified 2020年12月23日
unittest

python自带unittest这个单元测试框架,这是TDD实战的必需品!(貌似pyunit这个名称指向的就是unittest模块)

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

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top