单元测试
Python中自带的单元测试框架是unittest模块,它里面包括了一些校验返回结果的方法和一些用例执行前的初始化操作;
TestCase就是测试用例
TestSuite多个测试用例集合在一起
TestLoader用来加载TestCase到TestSuite中的
TestRunner就是用来执行测试用例的,测试的结果会保存在TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
简单的单元测试用例:
1 import unittest 2 def calc(x,y): 3 return x+y 4 class TestCalc(unittest.TestCase): 5 def test_pass_case(self): 6 '''这个是通过测试用例''' 7 print('这个是通过测试用例!') 8 res=calc(1,2) 9 self.assertEqual(3,res) 10 self.assertNotEqual(4,res)#返回的结果不一样 11 def test_a(self): 12 '''这个是普通的测试用例''' 13 print('a') 14 def test_fail_case(self): 15 '''这个是失败的测试用例''' 16 print('这个是失败的测试用例') 17 res=calc(3,4) 18 self.assertEqual(8,res) 19 if __name__=='__main__': 20 unittest.main()#运行所有的测试用例
1 import unittest 2 def calc(x,y): 3 return x+y 4 class TestCalc(unittest.TestCase): 5 def test_pass_case(self): 6 '''这个是通过测试用例''' 7 print('这个是通过测试用例!') 8 res=calc(1,2) 9 self.assertEqual(3,res) 10 self.assertNotEqual(4,res)#返回的结果不一样 11 def setUp(self): 12 #每个用例运行之前都会执行它 13 print('我是setup') 14 def tearDown(self): 15 #每个用例运行完之后都会执行它 16 print('我是tearDown') 17 @classmethod 18 def setUpClass(cls): 19 #所有的用例执行之前执行一次 20 print('我是setupClass') 21 @classmethod 22 def tearDownClass(cls): 23 #所有用例都运行完之后执行一次 24 print('我是tearDownClass') 25 def test_a(self): 26 '''这个是普通的测试用例''' 27 print('a') 28 def test_fail_case(self): 29 '''这个是失败的测试用例''' 30 print('这个是失败的测试用例') 31 res=calc(3,4) 32 self.assertEqual(8,res) 33 def test_haha(self): 34 '''哈哈哈''' 35 self.assertEqual(1,2) 36 if __name__=='__main__': 37 unittest.main()
生成测试报告,需要加入另一个模块:HTMLTestRunner。这个模块需要自己安装,执行测试用例后会生成一个html测试报告,会有每个测试用例的执行结果:
把HTMLTestRunner.py文件拷贝到pycharm中External Libraries—>site-packages里面
1 import unittest,HTMLTestRunner 2 def calc(x,y): 3 return x+y 4 class TestCalc(unittest.TestCase): 5 def test_pass_case(self): 6 '''这个是通过测试用例''' 7 print('这个是通过测试用例!') 8 res=calc(1,2) 9 self.assertEqual(3,res) 10 self.assertNotEqual(4,res)#返回的结果不一样 11 def setUp(self): 12 #每个用例运行之前都会执行它 13 print('我是setup') 14 def tearDown(self): 15 #每个用例运行完之后都会执行它 16 print('我是tearDown') 17 @classmethod 18 def setUpClass(cls): 19 #所有的用例执行之前执行一次 20 print('我是setupClass') 21 @classmethod 22 def tearDownClass(cls): 23 #所有用例都运行完之后执行一次 24 print('我是tearDownClass') 25 def test_a(self): 26 '''这个是普通的测试用例''' 27 print('a') 28 def test_fail_case(self): 29 '''这个是失败的测试用例''' 30 print('这个是失败的测试用例') 31 res=calc(3,4) 32 self.assertEqual(8,res) 33 def test_haha(self): 34 '''哈哈哈''' 35 self.assertEqual(1,2) 36 if __name__=='__main__': 37 suite=unittest.TestSuite()#定义一个测试套件 38 suite.addTest(TestCalc('test_pass_case'))#测试套件中添加测试用例 39 suite.addTest(TestCalc('test_a')) 40 suite.addTest(TestCalc('test_fail_case')) 41 f=open('report.html','wb')#打开一个测试报告的文件 42 runner=HTMLTestRunner.HTMLTestRunner(stream=f,title='wei测试结果',description='描述')#生成执行用例的对象 43 runner.run(suite)#执行测试套件
1 import unittest,HTMLTestRunner 2 def calc(x,y): 3 return x+y 4 class TestCalc(unittest.TestCase): 5 def test_pass_case(self): 6 '''这个是通过测试用例''' 7 print('这个是通过测试用例!') 8 res=calc(1,2) 9 self.assertEqual(3,res) 10 self.assertNotEqual(4,res)#返回的结果不一样 11 def setUp(self): 12 #每个用例运行之前都会执行它 13 print('我是setup') 14 def tearDown(self): 15 #每个用例运行完之后都会执行它 16 print('我是tearDown') 17 @classmethod 18 def setUpClass(cls): 19 #所有的用例执行之前执行一次 20 print('我是setupClass') 21 @classmethod 22 def tearDownClass(cls): 23 #所有用例都运行完之后执行一次 24 print('我是tearDownClass') 25 def test_a(self): 26 '''这个是普通的测试用例''' 27 print('a') 28 def test_fail_case(self): 29 '''这个是失败的测试用例''' 30 print('这个是失败的测试用例') 31 res=calc(3,4) 32 self.assertEqual(8,res) 33 def test_haha(self): 34 '''哈哈哈''' 35 self.assertEqual(1,2) 36 if __name__=='__main__': 37 suite=unittest.TestSuite()#定义一个测试套件 38 suite.addTest(unittest.makeSuite(TestCalc))#这个类里面的所有测试用例 39 f=open('report.html','wb')#打开一个测试报告的文件 40 runner=HTMLTestRunner.HTMLTestRunner(stream=f,title='wei测试结果',description='描述')#生成执行用例的对象 41 runner.run(suite)#执行测试套件
BeautifulReport:和HTMLTestRunner的作用一样,只是产生的报告更加美观与详尽。把BeautifulReport文件解压后拷贝到pycharm中的External Libraries—>site-packages里面
1 import unittest 2 from BeautifulReport import BeautifulReport 3 def calc(x,y): 4 return x+y 5 class TestCalc(unittest.TestCase): 6 def test_pass_case(self): 7 '''这个是通过测试用例''' 8 print('这个是通过测试用例!') 9 res=calc(1,2) 10 self.assertEqual(3,res) 11 self.assertNotEqual(4,res)#返回的结果不一样 12 def setUp(self): 13 #每个用例运行之前都会执行它 14 print('我是setup') 15 def tearDown(self): 16 #每个用例运行完之后都会执行它 17 print('我是tearDown') 18 @classmethod 19 def setUpClass(cls): 20 #所有的用例执行之前执行一次 21 print('我是setupClass') 22 @classmethod 23 def tearDownClass(cls): 24 #所有用例都运行完之后执行一次 25 print('我是tearDownClass') 26 def test_a(self): 27 '''这个是普通的测试用例''' 28 print('a') 29 def test_fail_case(self): 30 '''这个是失败的测试用例''' 31 print('这个是失败的测试用例') 32 res=calc(3,4) 33 self.assertEqual(8,res) 34 def test_haha(self): 35 '''哈哈哈''' 36 self.assertEqual(1,2) 37 if __name__=='__main__': 38 suite=unittest.TestSuite()#定义一个测试套件 39 suite.addTest(unittest.makeSuite(TestCalc))#这个类里面的所有测试用例 40 result=BeautifulReport(suite) 41 result.report(filename='xiaoReport',description='描述',log_path='.')
运行不是同一个.py文件里面的case:
1 cases:同一个目录下的文件夹,包含三个python文件 test_buy,test_login,test_reg 2 import unittest 3 4 class TestBuy(unittest.TestCase): 5 def test_a(self): 6 self.assertEqual(1,1) 7 8 def test_b(self): 9 self.assertEqual(1,2) 10 11 class TestBuy2(unittest.TestCase): 12 def test_buy_phone(self): 13 self.assertEqual(1,1) 14 15 16 17 import unittest 18 19 class TestLogin(unittest.TestCase): 20 def test_a(self): 21 self.assertEqual(1,1) 22 23 def test_b(self): 24 self.assertEqual(1,2) 25 26 27 import unittest 28 class TestReg(unittest.TestCase): 29 def test_a(self): 30 self.assertEqual(1,1) 31 32 def test_b(self): 33 self.assertEqual(1,2) 34 35 class TestReg2(unittest.TestCase): 36 def test_buy_phone(self): 37 self.assertEqual(1,1)
run_all_cases.py文件测试执行上述测试用例:
1 import unittest 2 from BeautifulReport import BeautifulReport 3 suite=unittest.TestSuite() 4 all_case=unittest.defaultTestLoader.discover('cases','test_*.py') 5 [suite.addTest(case) for case in all_case] 6 result=BeautifulReport(suite) 7 result.report(filename='Bea测试报告',description='描述',log_path='.')
后续进行持续集成时会用到Jenkins,让代码自动运行,但是Jenkins不认识html格式的测试报告。所以要生成Jenkins认识的格式的测试报告了,xml格式。所有需要用到xmlrunner模块,直接pip install xmlrunner 按照即可:
1 import unittest 2 import xmlrunner#为了以后给Jenkins看 3 suite=unittest.TestSuite() 4 all_case=unittest.defaultTestLoader.discover('cases','test_*.py') 5 # for case in all_case: 6 # suite.addTest(case) 7 [suite.addTest(case) for case in all_case]#列表生成式,和上面代码是一样的 8 runner=xmlrunner.XMLTestRunner('.')#这是是为了产生报告给Jenkins看
#runner=xmlrunner.XMLTestRunner(output='report1')#指定生成目录
9 runner.run(suite)#运行用例