httprunner逻辑分析
1、数据驱动实现核心代码分析:参考https://testerhome.com/topics/18875
def _add_tests(self, testcases):
""" initialize testcase with Runner() and add to test suite.
Args:
testcases (list): testcases list.
Returns:
unittest.TestSuite()
"""
def _add_test(test_runner, test_dict):
""" add test to testcase.
"""
def test(self):
.....
......
return test
test_suite = unittest.TestSuite() #初始化testsuite
for testcase in testcases:
config = testcase.get("config", {})
test_runner = runner.Runner(config)
#使用type动态创建TestSequense类,动态创建类详见httprunner源码文章
TestSequense = type('TestSequense', (unittest.TestCase,), {})
.....
for times_index in range(times):
# suppose one testcase should not have more than 9999 steps,
# and one step should not run more than 999 times.
test_method_name = 'test_{:04}_{:03}'.format(index, times_index)
#以下两行为TestSequense添加了测试方法名及测试方法实现,test_method及_add_test返回的test方法
test_method = _add_test(test_runner, test_dict)
setattr(TestSequense, test_method_name, test_method)
loaded_testcase = self.test_loader.loadTestsFromTestCase(TestSequense)
setattr(loaded_testcase, "config", config)
setattr(loaded_testcase, "teststeps", tests)
setattr(loaded_testcase, "runner", test_runner)
#将测试用例添加到testsuite中
test_suite.addTest(loaded_testcase)
return test_suite
总结:使用type创建一个继承unitest.TestCase的TestSequense,然后使用setattr添加测试方法test_method
2、parser.py用例解析的基本逻辑整理:

3、validate校验逻辑

浙公网安备 33010602011771号