基于 Unittest 的功能测试
1.写用例 :TestCase
2.执行用例 :
①TestSuite 存储用例
②TestLoader 找用例,加载用例,存到TestSuite中
3.对比实际和期望结果 判断用例是否通过:断言 Assert
常用的断言函数:
assertEqual/assertNotEqual 判断a==b/a!b
asserIsNone/assertIsNotNone 判断a is(not)None
assertIn/assertNotIn 判断a (not)in b
4.出具测试报告 TextTestRunner
1:新建python file【math_method.py】,
新建【MathMethod】类并写几个简单的方法
class MathMethod:
def __init__(self,a,b):
self.a=a
self.b=b
def add(self):
return self.a+self.b
def multi(self):
return self.a * self.b
2:新建另一个python file【class_unittest_cases.py】
# 导入unittest 包
import unittest
# from 包名.文件名 import 函数(方法)名
from class_unittest.math_method import MathMethod
# 创建一个测试类【模块】,继承 TestCase 专门写用例(方法)
class TestMathMethod(unittest.TestCase):
# 编写测试用例
# 1:【一个用例就是一个函数 不能传参 只有self关键字】
# 2:【所有的用例(函数)都是test开头 test_否则无法识别为用例】
def test_add_two_xiangjia(self):
res = MathMethod(1,2).add()
print("1+2结果为",res)
# 捕捉异常
try:
# 断言 (期望值,实际值,错误提示msg信息)
self.assertEquals(3,res,"1+2计算出错了")
except AssertionError as e:
print("断言错误是{}".format(e))
# 异常处理结束后,抛出异常
raise e
def test_multi_two_xiangcheng(self):
res_multi = MathMethod(3,2).multi()
print("3*2乘法结果为",res_multi)
try:
# 断言 (期望值,实际值,错误提示msg信息)
self.assertEquals(3, res_multi, "3*2计算出错了")
except AssertionError as e:
print("断言错误是{}".format(e))
# 异常处理结束后,抛出异常
raise e
if __name__ == '__main__':
# 用例执行顺序按照函数名的 ASCII 码顺序
unittest.main() # 执行所有用例
# !!!注意:光标如果停留在某个用例(方法)上,则只执行单一用例
3:再次新建python file【class_unittest_run.py】
import unittest
# from 包名.文件名 import 方法名
from class_unittest.class_unittest_cases import TestMathMethod
# 方法一:
# 先用suite容器存储用例
suite = unittest.TestSuite()
# ①suite套件使用 .addTest 增加存储用例【用例较少使用】
# ②必须先创建实例,再调用方法 测试类名:TestMathMethod
# ---------- suite.addTest(TestMathMethod('方法名'))
suite.addTest(TestMathMethod('test_add_two_xiangjia'))
suite.addTest(TestMathMethod('test_multi_two_xiangcheng'))
# 方法二:TextTestRunner【用例较多使用 找到所有test开头的用例】
# 创建一个加载器,寻找所有的用例【方法】
loader = unittest.TestLoader()
# 用 suite.addTest 将所有的用例【方法】加载到suite容器中
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))
# 具体到【文件名所在】模块并加载所有的用例
# from 包名 import 文件名 【具体到类名则无法加载模块用例】
from class_unittest import class_unittest_cases
# 通过 Modules 模块加载所用用例通过 .addTest 把所有用例存储在suite容器中
suite.addTest(loader.loadTestsFromModule(class_unittest_cases))
# 执行代码
# 使用with open...as 上下文编辑器,就解决执行结束忘记 file.close()
with open("test.txt",'w+',encoding='utf-8') as file:
runner = unittest.TextTestRunner(stream=file,verbosity=2) # 2报告最详细
runner.run(suite)