abdstime 2019-12-31
1、写用例:TestCase 类
2、加载用例:TestSuite 类 TestLoader 类
3、对比结果(执行结果/期望结果):assert函数
4、执行并出结果:TextTestRunner 类
5、报告:HtmlTestReport 类
1)首先建一个math_method.py文件,用来存在被测试函数
# 被测类函数 class MathMethod(): def add(self, a, b): return a + b def sub(self, a, b): return a - b
2)新建一个test_case1.py文件,用来存放测试用例代码
# from unittest.case import TestCase #在文件unittest文件下面case文件中存在TestCase模块 # class TestAdd(TestCase): import unittest from test_unittest.math_method import MathMethod # 导入被测试类 class TestAdd(unittest.TestCase): # 测试类 专门测试加法类 # 写用例 每一条用例都是一个类函数 # 用例 def test_后缀(self) :用例函数必须test开头 def setUp(self): # 测试环境的搭建 print("我要开始测试咯") self.t = MathMethod() def tearDown(self): # 测试环境的销毁 print("我测试完成咯") def test_add_two_zero(self): # 测试两个零相加的用例 # t = MathMethod() # 创建实例 # res = t.add(0, 0) res = self.t.add(0, 0) # 断言函数的调用,注意:为啥用self,因为调用父类的方法 self.assertEqual(1, res) print("测试的结果是:{0}".format(res)) def test_add_two_positive(self): # 测试两个整数相加的用例 # t = MathMethod() # 创建实例 # res = t.add(4, 5) res = self.t.add(4, 5) print("测试的结果是:{0}".format(res)) def test_add_two_negative(self): # 测试两个负数相加的用例 # t = MathMethod() # 创建实例 # res = t.add(-4, -5) res = self.t.add(-4, -5) print("测试的结果是:{0}".format(res)) class TestSub(unittest.TestCase): # 测试类 专门测试减法 # 写用例 每一条用例都是一个类函数 # 用例 def test_后缀(self) :用例函数必须test开头 def test_sub_two_zero(self): # 测试两个零相减的用例 t = MathMethod() # 创建实例 res = t.sub(0, 0) print("测试的结果是:{0}".format(res)) def test_sub_two_positive(self): # 测试两个整数相减的用例 t = MathMethod() # 创建实例 res = t.sub(4, 5) print("测试的结果是:{0}".format(res)) def test_sub_two_negative(self): # 测试两个负数相减的用例 t = MathMethod() # 创建实例 res = t.sub(-4, -5) print("测试的结果是:{0}".format(res)) if __name__ == ‘__main__‘: unittest.main()
3)新建一个test_suite.py文件,用来存放加载用例,执行用例,生成报告的代码
import unittest from test_unittest.test_case1 import TestAdd # 测试类 from test_unittest.test_case1 import TestSub # 测试类 from test_unittest import test_case1 # 测试模块 import HTMLTestRunnerNew # 生成html文件测试报告,这个文件放在lib文件里面 from test_unittest.test_case2 import TestAdd # 测试类 from test_unittest import test_case2 # 测试模块 from test_unittest.read_config import ReadConfig # 配置文件 from test_unittest.do_excel import DoExcel # 加载测试用例 # suite:测试套件/测试用例的容器,这边suite是一个实例 suite = unittest.TestSuite() # 怎么把测试用例放到测试套件suite里面去,以实例的形式添加进去 # # 方法一 # # suite.addTest()是suite实例调用父类的addTest的方法 # suite.addTest(TestAdd(-4, -5, 0, "test_add")) # suite.addTest(TestAdd(‘test_add_two_positive‘)) #test_add_two_positive必须要加因为是父类的初始化参数 ## 优化测试数据,方法1:参数化-测试数据列出来 # test_data = [[0, 0, 0, ‘两个0相加‘], # [1, 2, 3, ‘两个正数相加‘], # [-1, -4, -5, ‘两个负数相加‘], # [1, 0, 1, ‘一正一0相加‘], # [-1, 0, -1, ‘一负一0相加‘]] # for item in test_data: # suite.addTest(TestAdd(item[0], item[1], item[2], item[3], ‘test_add‘)) # # 优化测试数据,方法2:调用测试数据,列表嵌套列表形式 # test_data=DoExcel().do_excel() # for item in test_data: # suite.addTest(TestAdd(item[2], item[3], item[4], item[1], ‘test_add‘)) # # 优化测试数据,方法3:调用测试数据,列表嵌套字典形式 # test_data=DoExcel().do_excel() # for item in test_data: # suite.addTest(TestAdd(item[‘Param_a‘], item[‘Param_b‘], item[‘ExceptedResult‘], item[‘title‘], ‘test_add‘)) # # 优化测试数据,方法4:调用测试数据,列表嵌套字典形式,但是要写回测试结果 # test_data=DoExcel().do_excel() # for item in test_data: # suite.addTest(TestAdd(item[‘Param_a‘], item[‘Param_b‘], item[‘ExpectedResult‘], item[‘title‘], item[‘id‘] ,‘test_add‘)) # # 优化测试数据,方法5:结合配置文件,执行测试用例 # test_data = DoExcel().do_excel() # # # 实例化,获取mode和case_id_list # mode = ReadConfig().read_config("case.config", "FLAG", "mode") # case_id_list = eval(ReadConfig().read_config("case.config", "FLAG", "case_id_list")) # # if mode == "on": # final_data = test_data # else: # final_data = [] # for item in test_data: # if item[‘id‘] in case_id_list: # final_data.append(item) # # for item in final_data: # suite.addTest( # TestAdd(item[‘Param_a‘], item[‘Param_b‘], item[‘ExpectedResult‘], item[‘title‘], item[‘id‘], ‘test_add‘)) # 优化测试数据,方法6:结合配置文件,执行测试用例,判断放在读取文件中do_excel # 实例化,获取mode和case_id_list mode = ReadConfig().read_config("case.config", "FLAG", "mode") case_id_list = eval(ReadConfig().read_config("case.config", "FLAG", "case_id_list")) test_data = DoExcel().do_excel(mode, case_id_list) for item in test_data: suite.addTest( TestAdd(item[‘Param_a‘], item[‘Param_b‘], item[‘ExpectedResult‘], item[‘title‘], item[‘id‘], ‘test_add‘)) # 方法二 # loader = unittest.TestLoader() # 直接加载某个测试类里面的所有用例 # suite.addTest(loader.loadTestsFromTestCase(TestAdd)) # suite.addTest(loader.loadTestsFromTestCase(TestSub)) # 直接加载某个测试模块里面的用例 # suite.addTest(loader.loadTestsFromModule(test_case2)) # # 执行用例TextTestRunner 类 专门来执行suite测试套件里面的用例 # runner = unittest.TextTestRunner() # 实例化 # # 使用实例化的run方法 # runner.run(suite) # # 使用TextTestRunner可执行用例并且返回结果,优化生成txt格式报告 # with open("test_result.txt", ‘w+‘, encoding="utf-8") as f: # runer = unittest.TextTestRunner(f, verbosity=2) # runer.run(suite) # 使用HTMLTestRunnerNew生成html格式的测试报告 # 优化生成html格式报告 使用二进制形式写入,不支持utf-8格式,故不需要写 with open(‘test_result.html‘, "wb+") as f: runer = HTMLTestRunnerNew.HTMLTestRunner(f, verbosity=2, title="测试报告", description=None, tester="xxx") runer.run(suite)
备注:
执行结果,如果鼠标放在某一个测试用例函数后面则只执行这个用例;若放在最后一行测试用例的下面则执行所有测试用例
执行结果顺序按照函数名ASCII码排序A-Z,0-9 test_add_two_negative test_add_two_positive test_add_two_zero
使用main函数则也是执行整个所有用例