testbase.runner Package

TestRunner负责多个测试用例,目前提供三种方式:

  • 单线程执行 TestRunner
  • 多线程执行 ThreadingTestRunner
  • 多进程执行 MultiProcessTestRunner

整个执行逻辑可以用以下伪代码来理解:

for test in tests:
    report.begin_test(test)
    result = report.get_testresult_factory().create(test)
    report.end_test(test, result)
class testbase.runner.BaseTestRunner(report, resmgr_backend=None, execute_type='random')

基类:object

测试执行器基类

clean_up()

执行清理动作

classmethod get_parser()

获取命令行参数解析器(如果实现)

返回:解析器对象
返回类型:argparse.ArgumentParser
load(target)

加载测试用例

参数:target (list(TestCase) or list(string) or string or TestCaseSettings) -- 指定要执行的测试用例
返回:测试用例列表
classmethod parse_args(args_string, report, resmgr_backend, execute_type)

通过命令行参数构造对象

返回:测试报告
返回类型:cls
report

对应的测试报告

返回:ITestReport
resource_setup(plan)

资源初始化

参数:plan (TestPlan) -- 测试计划
resource_teardown(plan)

资源清理

参数:plan (TestPlan) -- 测试计划
run(target)

运行测试

参数:target (list(TestCase) or list(string) or string or TestCaseSettings or TestPlan) -- 指定要执行的测试
run_all_tests(tests)

执行全部的测试用例

参数:tests (list) -- 测试用例对象列表
run_test(test)

执行一个测试用例

参数:test (TestCase) -- 测试用例
返回:boolean - 测试是否通过
class testbase.runner.EnumProcessMsgType

基类:object

多进程间通信用的消息类型

class testbase.runner.MultiProcessTestRunner(report, process_cnt=0, retries=0, resmgr_backend=None, execute_type='random')

基类:testbase.runner.BaseTestRunner

使用多进程并发执行用例

多进程并发时,有两个特殊的问题需要处理:

1、测试执行工作进程需要通知TestReport测试用例的执行情况等, 解决方案是: 为每个工作进程提供一个TestReportProxy,TestReportProxy通过消息机制通知 真正的TestReport

2、TestReport需要访问在工作进程的TestResult对象, 解决方案是: 每个工作进程有一个TestResultStubManager,提供给TestReport的是一个TestResultProxy 对象,TestResultProxy通过消息机制和TestResultStubManager通信,来获取真正的TestResult 的信息

clean_up()

执行清理动作

classmethod get_parser()

获取命令行参数解析器(如果实现)

返回:解析器对象
返回类型:argparse.ArgumentParser
classmethod parse_args(args_string, report, resmgr_backend, execute_type)

通过命令行参数构造对象

返回:测试报告
返回类型:cls
run_all_tests(tests)

执行全部的测试用例

参数:test -- 测试用例对象列表
class testbase.runner.TestCaseSettings(names=None, excluded_names=None, priorities=None, status=None, owners=None, tags=None, excluded_tags=None, share_data={}, global_parameters={})

基类:object

目标测试用例配置

filter(testcase)

测试用例过滤函数

参数:testcase (TestCase) -- 测试用例
class testbase.runner.TestReportProxy(worker_id, ctrl_msg_queue, result_factory, result_manager)

基类:testbase.report.TestReportBase

测试报告代理

begin_report()

开始测试执行

end_report()

结束测试执行

参数:passed (boolean) -- 测试是否通过
get_testresult_factory()

获取对应的TestResult工厂

返回:ITestResultFactory
log_record(level, tag, msg, record)

增加一个记录

参数:
  • level (string) -- 日志级别
  • tag (string) -- 日志标签
  • msg (string) -- 日志消息
  • record (dict) -- 日志记录信息
log_test_result(testcase, testresult)

记录一个测试结果

参数:
  • testcase (TestCase) -- 测试用例
  • testresult (TestResult) -- 测试结果
class testbase.runner.TestResultFunctionProxy(from_worker, obj_id, func_name)

基类:object

测试结果函数代理

class testbase.runner.TestResultProxy(from_worker, obj_id, passed, testcase)

基类:object

测试结果代理

class testbase.runner.TestResultStubManager(rsp_queue)

基类:object

测试结果桩管理器

add_result(result)

增加一个测试结果

call_result_func(objid, funcname, args, kwargs)

调用一个测试结果的函数

参数:
  • objid (int) -- 对象ID
  • funcname (string) -- 函数名
  • args (tuple) -- 参数
  • kwargs (dict) -- 参数
get_result_attr(objid, attrname)

获取一个测试结果的属性值

参数:
  • objid (int) -- 对象ID
  • attrname (string) -- 属性名
class testbase.runner.TestRunner(report, retries=0, resmgr_backend=None, execute_type='random')

基类:testbase.runner.BaseTestRunner

测试执行器

classmethod get_parser()

获取命令行参数解析器(如果实现)

返回:解析器对象
返回类型:argparse.ArgumentParser
classmethod parse_args(args_string, report, resmgr_backend, execute_type)

通过命令行参数构造对象

返回:测试报告
返回类型:cls
run_all_tests(tests)

执行全部的测试用例

参数:test -- 测试用例对象列表
class testbase.runner.TestWorker(worker_id, ctrl_msg_queue, result_factory, resmgr, share_data_mgr=None)

基类:object

多进程执行用例时,执行测试的子进程

current_testcase()

当前正在执行的测试用例

返回:TestCase
recv_message(timeout=None)

接收工作者的答复消息

restart()

重新开始执行

run_testcase(testcase)

分配一个测试用例

参数:testcase (TestCase) -- 要执行的测试用例
send_message(msg)

发送消息到工作者

参数:msg (tuple) -- 消息
start()

开始执行

stop()

结束执行

class testbase.runner.ThreadSafetyReport(report)

基类:testbase.report.TestReportBase

TestReport修饰器,保证线程安全

begin_report()

开始测试执行

end_report()

结束测试执行

参数:passed (boolean) -- 测试是否通过
get_testresult_factory()

获取对应的TestResult工厂

返回:ITestResultFactory
log_filtered_test(loader, testcase, reason)

记录一个被过滤的测试用例 :param loader: 用例加载器 :type loader: TestLoader :param testcase: 测试用例 :type testcase: TestCase :param reason: 过滤原因 :type reason: str

log_load_error(loader, name, error)

记录一个加载失败的用例或用例集 :param loader: 用例加载器 :type loader: TestLoader :param name: 名称 :type name: str :param error: 错误信息 :type error: str

log_loaded_tests(loader, testcases)

记录加载成功的用例

参数:
  • loader (TestLoader) -- 用例加载器
  • testcases (list) -- 测试用例列表
log_record(level, tag, msg, record)

增加一个记录

参数:
  • level (string) -- 日志级别
  • msg (string) -- 日志消息
  • tag (string) -- 日志标签
  • record (dict) -- 日志记录信息
log_test_result(testcase, testresult)

记录一个测试结果

参数:
  • testcase (TestCase) -- 测试用例
  • testresult (TestResult) -- 测试结果
class testbase.runner.ThreadingTestRunner(report, thread_cnt=0, retries=0, resmgr_backend=None, execute_type='random')

基类:testbase.runner.BaseTestRunner

使用多线程并发执行用例

classmethod get_parser()

获取命令行参数解析器(如果实现)

返回:解析器对象
返回类型:argparse.ArgumentParser
classmethod parse_args(args_string, report, resmgr_backend, execute_type)

通过命令行参数构造对象

返回:测试报告
返回类型:cls
run_all_tests(tests)

执行全部的测试用例

参数:test -- 测试用例对象列表