unittest–python单元测试–用例执行顺序
上一次我们说到使用unittest进行简单的单元测试,其中有这样一个问题,当针对一个函数或者接口的测试用例有多条时,执行的先后问题,在某些有数据依赖关系的场景下,case的执行顺序显得尤为重要。
默认的case执行顺序
当使用unittest.main()方法执行时,默认会按照ASCII码的顺序加载测试用例,先后顺序为0-9,A-Z,a-z
下面举例说明,将上一节中的calculator.py再次定义如下:
# -*- coding: utf-8 -*-
class Count:
def __init__(self, a, b):
self.a = int(a)
self.b = int(b)
def add(self):
return self.a + self.b
def sub(self):
return self.a - self.b
重新编写一个针对add和sub函数的测试文件如下:
test.py
# -*- coding: utf-8 -*-
import unittest
from calculator import Count
class TestSub(unittest.TestCase):
def setUp(self):
print "set up test sub---"
def tearDown(self):
print "tear down test sub---"
def test_subB(self):
c = Count(1, 2)
print "test_subB"
self.assertEqual(c.sub(), -1)
def test_subA(self):
c = Count(-1, 2)
print "test_subA"
self.assertEqual(c.sub(), -3)
class TestAdd(unittest.TestCase):
def setUp(self):
"""set up"""
print "set up test add...."
def tearDown(self):
"""tear down"""
print "tear down test add...."
def test_add2(self):
c = Count(1, 2)
print "test_add2"
self.assertEqual(c.add(), 3)
def test_add1(self):
c = Count(-1, 2)
print "test_add1"
self.assertEqual(c.add(), 1)
if __name__ == '__main__':
unittest.main()
执行结果如下图所示:
从结果我们可以看到,虽然TestSub类先于TestAdd类定义,但是根据默认的执行顺序,A(TestAdd)在S(TestSub)之前,而在每个测试类中同样按照上面提到的顺序进排序执行,所以最后几个case的执行顺序是test_add1,test_add2,test_subA,test_subB。
调整case执行顺序
有时因为业务需要或者因为依赖关系需要某些特定case先于其他case执行,这时我们就需要按照自己的需要设置case的执行顺序,这里介绍两种方法
1. 通过合理设置case命名调整顺序
因为默认按照0-9A-Za-z的顺序执行测试用例,因此最容易想到的就是通过设置case的名字来调整用例执行顺序,比如test_add_1, test_add2…,该种方式比较简单,在此不做过多介绍
2. 通过suite控制用例执行顺序
TestSuite的实例可以添加一组测试用例,测试用例会按照添加的顺序依次执行,具体实例如下,前半部分代码与test.py相同,main函数部分修改如下:
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTests([TestSub("test_subB"), TestSub("test_subA")])
suite.addTest(TestAdd("test_add2"))
suite.addTest(TestAdd("test_add1"))
runner = unittest.TextTestRunner()
runner.run(suite)
通过suite依次添加用例test_subB,test_subA,test_add2,test_add1,执行结果如下:
可以看出用例是按照suite添加的顺序依次执行,由此可以起到控制用例执行顺序的作用。