本文按照循序渐进的方法介绍测试用例的组织方式,实际工作中,可以借鉴方法三
待测文件:
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