在unittest框架的基础使用中,创建测试用例类的时候,其中的每条测试用例都为其编写了一个方法
但其实每个方法下面的运行逻辑都是一样的:即准备数据、传参获取实际结果、实际结果与预期结果比对
这样,当测试用例较多时,工作就会陷入大量重复和冗余,下面通过重写测试用例类所继承的unittest.TestCase类中的__init__方法,来实现只需定义一次测试用例方法
下面例子中使用的功能函数依旧为前一篇中的login_check,重写__init__方法时,通过super使其保持有父类中的功能:
#创建测试用例类 import unittest from exercise02_unittest基本使用.funcdemo_unittest import login_check class LoginTestCase(unittest.TestCase): def __init__(self, methodName, case_data): super().__init__(methodName) self.case_data = case_data def test_login(self): expected = self.case_data["expected"] data = self.case_data["data"] res = login_check(*data) self.assertEqual(expected, res)
然后在创建测试套件并加载用例时,通过for循环结合“一条一条加载用例”的方式实现参数的传入:
#创建测试套件并加载用例 import unittest from exercise03_重写测试用例类__init__方法.testcases_unittest import LoginTestCase cases = [{"expected": {"code": 0, "msg": "登陆成功"}, "data": ["python", "123456"]}, {"expected": {"code": 1, "msg": "账号或密码不正确"}, "data": ["python", "12345"]}, {"expected": {"code": 1, "msg": "账号或密码不正确"}, "data": ["pyth", "123456"]}, {"expected": {"code": 1, "msg": "所有参数不能为空"}, "data": [None, "123456"]}, {"expected": {"code": 1, "msg": "所有参数不能为空"}, "data": ["python", None]}, ] suite = unittest.TestSuite() for case_data in cases: case = LoginTestCase("test_login", case_data) suite.addTest(case) runner = unittest.TextTestRunner() runner.run(suite)