首页 > 技术文章 > selenium - unittest 单元测试用例的组织

xiaochongc 2020-03-29 12:02 原文

本文按照循序渐进的方法介绍测试用例的组织方式,实际工作中,可以借鉴方法三

 

待测文件:

calculate.py文件
1
# 计算器类 2 class Count: 3 def __init__(self, a, b): 4 self.a = a 5 self.b = b 6 7 # 计算加法 8 def add(self): 9 return self.a + self.b 10 11 # 计算减法 12 def sub(self): 13 return self.a - self.b

 

测试文件:

方法一:直接创建测试类,进行对应功能的测试

 1 from calculate import Count
 2 import unittest
 3 
 4 class TestAdd(unittest.TestCase):   # 创建TestAdd类,测试add()功能
 5     def setUp(self):
 6         print('test add start------------')
 7 
 8     def tearDown(self):
 9         print('test add end--------------')
10 
11     def test_add_1(self):
12         print('add 1')
13         self.assertEqual(Count(2, 4).add(), 6)
14 
15     def test_add_2(self):
16         print('add 2')
17         self.assertEqual(Count(200, 400).add(), 600)
18 
19 class TestSub(unittest.TestCase):    # 创建TestSub类,测试sub()功能
20     def setUp(self):
21         print('test sub start------------')
22 
23     def tearDown(self):
24         print('test sub end--------------')
25 
26     def test_sub_1(self):
27         print('sub 1')
28         self.assertEqual(Count(2, 4).sub(), -2)
29 
30     def test_sub_2(self):
31         print('sub 1')
32         self.assertEqual(Count(200, 400).sub(), -200)
33 
34 
35 if __name__ == '__main__':
36     # 构造测试集
37     suite = unittest.TestSuite()
38     suite.addTest(TestAdd('test_add_1'))
39     suite.addTest(TestAdd('test_add_2'))
40     suite.addTest(TestSub('test_sub_1'))
41     suite.addTest(TestSub('test_sub_2'))
42 
43     # 运行测试集合
44     runner = unittest.TextTestRunner()
45     runner.run(suite)

setUp()和tearDown()方法作用于每个测试用例的开始与结束,执行结果如下:

test add start------------
add 1
test add end--------------
test add start------------
add 2
test add end--------------
test sub start------------
sub 1
test sub end--------------
test sub start------------
sub 2
test sub end--------------


Ran 4 tests in 0.008s

OK

 

方法二:将共同的setUp()和tearDown()提取出来

如果每个类中的setUp()和tearDown()所做的事情都是一样的,就可以封装一个自己的测试类,如下:

将注意力放在具体测试用例的编写上,无须关注setUp()和tearDown()所做的事情

 1 from calculate import Count
 2 import unittest
 3 
 4 class MyTest(unittest.TestCase):  # 封装自己的测试类,继承TestCase类
 5     def setUp(self):
 6         print('test start------------')
 7 
 8     def tearDown(self):
 9         print('test end--------------')
10 
11 class TestAdd(MyTest):   # 继承MyTest类
12     def test_add_1(self):
13         print('add 1')
14         self.assertEqual(Count(2, 4).add(), 6)
15 
16     def test_add_2(self):
17         print('add 2')
18         self.assertEqual(Count(200, 400).add(), 600)
19 
20 class TestSub(MyTest):   # 继承MyTest类
21     def test_sub_1(self):
22         print('sub 1')
23         self.assertEqual(Count(2, 4).sub(), -2)
24 
25     def test_sub_2(self):
26         print('sub 2')
27         self.assertEqual(Count(200, 400).sub(), -200)
28 
29 
30 if __name__ == '__main__':
31     # 构造测试集
32     suite = unittest.TestSuite()
33     suite.addTest(TestAdd('test_add_1'))
34     suite.addTest(TestAdd('test_add_2'))
35     suite.addTest(TestSub('test_sub_1'))
36     suite.addTest(TestSub('test_sub_2'))
37 
38     # 运行测试集合
39     runner = unittest.TextTestRunner()
40     runner.run(suite)

 

方法三:将不同功能的测试用例,分散到不同的测试文件中

随着软件功能的不断增加,对应的测试用例,也会呈指数级增长。如果测试用例达到上百个,把所有测试用例都写在一个测试文件中,那么这个文件会越来越臃肿,后期维护也比较麻烦。需要将这些用例,按照所测试的功能进行拆分,分散到不同的测试文件中。

不仅可以分散到不同的文件,甚至可以分散到不同的测试目录中,测试文件中还可以将不同的小功能划分为不同的测试类,在类下编写测试用例,整体结构更加清晰。(建议:一个测试类,对应一个被测功能)

上例中,拆分后的目录结构如下:

 实现代码如下:

 testadd.py
1
from testpro.calculate import Count 2 import unittest 3 4 class TestAdd(unittest.TestCase): 5 def setUp(self): 6 print('add start') 7 8 def test_add_1(self): 9 print('add 1') 10 self.assertEqual(Count(2, 4).add(), 6) 11 12 def test_add_2(self): 13 print('add 2') 14 self.assertEqual(Count(1, 2).add(), 3) 15 16 def tearDown(self): 17 print('add end') 18 19 20 if __name__ == '__main__': 21 unittest.main()
 testsub.py
1
from testpro.calculate import Count 2 import unittest 3 4 class TestSub(unittest.TestCase): 5 def setUp(self): 6 print('sub start') 7 8 def test_sub_1(self): 9 print('sub 1') 10 self.assertEqual(Count(2, 4).sub(), -2) 11 12 def test_sub_2(self): 13 print('sub 2') 14 self.assertEqual(Count(1, 2).sub(), -1) 15 16 def tearDown(self): 17 print('sub end') 18 19 20 if __name__ == '__main__': 21 unittest.main()
 runtest.py
1
from testpro.testadd import TestAdd 2 from testpro.testsub import TestSub 3 import unittest 4 5 6 if __name__ == '__main__': 7 suite = unittest.TestSuite() 8 suite.addTest(TestAdd("test_add_1")) 9 suite.addTest(TestAdd("test_add_2")) 10 suite.addTest(TestSub("test_sub_1")) 11 suite.addTest(TestSub("test_sub_2")) 12 13 runner = unittest.TextTestRunner() 14 runner.run(suite)

执行结果如下:

add start
add 1
add end
add start
add 2
add end
sub start
sub 1
sub end
sub start
sub 2
sub end
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s

OK

 

推荐阅读