1.单元测试的本质
单元测试的本质:测试函数,代码级别
接口测试的本质:测试类里面的函数
2. unittest 编写测试用例并生成测试报告
功能测试:(1)编写测试用例,(2)执行测试用例,(3)对比实际结果与期望结果,(4)出具测试报告
unittest测试思路:
(1)写用例:TestCase
(2)执行用例:TestSuite 存储用例,TestLoader 找用例,加载用例,存在(1)的TestSuite中
(3)对比结果:断言 Assert
(4)出具报告:TextTestRunner
已知math_method.py代码如下:
class MathMethod: def __init__(self,a,b): self.a = a self.b = b def add(self): return self.a + self.b def multiply(self): return self.a * self.b
-
编写测试用例test_testcase.py代码如下:
import unittest # python自带 from math_method import MathMethod # 测试的目标类 # 写一个测试类,对math_method模块里面的类进行单元测试 class TestAddMethod(unittest.TestCase): # 继承unitest中的TestCase,用来写测试用例 # 编写测试用例 # 1.一个用例就是一个方法,不能传参,只要self关键字 # 2.所有的用例(所用的函数/方法,必须以test开头 test_) def test_add_two_positive(self): # 两个正数相加 1+1 res = MathMethod(1,1).add() print('1+1的结果是:',res) # 加断言,判断期望值与实际结果的比对,一致通过;不一致失败 # self.assertEqual(2, res, '1+1的结果出错了') # 来自TestCase父类,第一个参数:期望值;第二个参数:实际结果;第三参数:失败返回结果 try: self.assertEqual(2,res) # 来自TestCase父类,第一个参数:期望值;第二个参数:实际结果;第三参数:失败返回结果 except AssertionError as e: print('出错啦!断言结果是{0}'.format(e)) raise e def test_add_two_zero(self): res = MathMethod(0,0).add() print('0+0的结果是:',res) # self.assertEqual(1,res,'不符合期望结果:0+0=1') try: self.assertEqual(1, res) except AssertionError as e: print('出错啦!断言结果是{0}'.format(e)) raise e def test_add_two_negative(self): res = MathMethod(-1,-2).add() print('-1+(-2)的结果是:',res) self.assertEqual(-3,res) class TestMultiMethod(unittest.TestCase): # 继承unitest中的TestCase,用来写测试用例 # 编写测试用例 # 1.一个用例就是一个方法,不能传参,只要self关键字 # 2.所有的用例(所用的函数/方法,必须以test开头 test_) def test_multi_two_positive(self): # 两个正数相乘 1+1 res = MathMethod(1,1).multiply() print('1*1的结果是:',res) self.assertEqual(1,res) def test_multi_two_zero(self): res = MathMethod(0,0).multiply() print('0*0的结果是:',res) self.assertEqual(0, res) def test_multi_two_negative(self): res = MathMethod(-1,-2).multiply() print('-1*(-2)的结果是:',res) self.assertEqual(2, res) if __name__ == '__main__': unittest.main()
注意:
(1)测试结果说明: .测试通过, E代码出错, F测试失败
(2)按方法名称的ascii值由小到大顺序执行用例方法
(3)鼠标放在方法旁边,只执行该鼠标位置的方法
# 执行setUp:每条测试用例执行前执行setUp[有操作必须在执行用例前准备好,例如:连接数据库]
# 执行tearDown:每条测试用例执行完毕后都会执行tearDown[有操作必须在执行用例完毕后要清除,例如:关闭数据库]
-
执行测试用例并生成测试报告
import unittest import HTMLTestRunner # 写好一个模块,可以直接调用 from test_testcase import TestAddMethod,TestMultiMethod suite = unittest.TestSuite() # 存储用例 # A class whose instances(实例) are single test cases. 这个类的实例是一个个测试用例。 # 方法1 addTest 加载测试用例 # 只执行一条,两个正数相加 # suite.addTest(TestAddMethod('test_add_two_positive')) # 测试为:方法名 # 方法2 TestLoader 加载测试用例 loader = unittest.TestLoader() # 创建一个加载器 # (1)方法i 加载类中的全部用例 # suite.addTest(loader.loadTestsFromTestCase(TestAddMethod)) #具体到类 # (2)方法ii 加载模块类中的全部用例 from auto_Testwork.class_unittest import class_unittest1 # 具体到模块 suite.addTest(loader.loadTestsFromModule(class_unittest1)) # 判断是否符合预期结果 assert(添加在测试用例中) # 出具测试报告 # 方法1:执行测试用例,上下文管理器:执行完毕后自动关闭 # runner = unittest.TextTestRunner() # with open('test.txt','w+',encoding='utf-8') as file: # file = open('test.txt','w+',encoding='utf-8') # runner = unittest.TextTestRunner(stream=file,descriptions=None,verbosity=2) # stream:保存文件的位置 verbosity:0没有..F,1有..F,2详细输出 # runner.run(suite) # 方法2:生成HTML报告 with open('test_report.html','wb') as file: runner = HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2, title='11.20MATH测试报告', description='MATH测试报告' ) runner.run(suite) # file.close() if'__name__' == '__main__': unittest.TestCase()