如何汇总多次pytest运行结果 实现多数据库测试统一报告
pytest多数据库测试统一汇总解决方案
方案1:保留现有循环调用逻辑,手动生成总摘要
适合不想改现有测试逻辑、必须分开多次调用pytest的场景:
- 借助pytest内置的
--junitxml参数,每次运行输出单数据库的测试结果xml文件 - 跑完所有数据库后,统一解析所有xml文件生成总统计和总报告
首先安装结果解析依赖:pip install junitparser
改造后的执行代码:
import pytest from junitparser import JUnitXml databases = ["postgresql", "sqlite"] all_results = [] for db in databases: print(f"Running tests for DB: {db}...") report_path = f"./{db}_test_result.xml" # 调用pytest时指定输出junit格式报告 pytest.main([f"--{db}", "tests", f"--junitxml={report_path}"]) # 存储本次运行结果 all_results.append(JUnitXml.fromfile(report_path)) # 汇总统计 total_tests = sum(res.tests for res in all_results) total_failures = sum(res.failures for res in all_results) total_errors = sum(res.errors for res in all_results) total_skipped = sum(res.skipped for res in all_results) # 打印总摘要 print("\n===== 多数据库测试总汇总 =====") print(f"总执行用例数:{total_tests}") print(f"通过用例数:{total_tests - total_failures - total_errors - total_skipped}") print(f"失败用例数:{total_failures}") print(f"错误用例数:{total_errors}") print(f"跳过用例数:{total_skipped}") # 可选:生成统一的总结果文件 total_xml = JUnitXml() for idx, res in enumerate(all_results): db = databases[idx] for suite in res: # 给测试套件加数据库前缀,避免重名 suite.name = f"{db}_{suite.name}" total_xml.add_testsuite(suite) total_xml.write("./all_db_test_total.xml")
方案2:改用pytest原生参数化运行,自动输出统一汇总
更推荐的方案,不需要循环调用pytest,pytest原生支持多参数串行/并行运行,天然生成统一汇总:
改造步骤:
- 修改
conftest.py,将独立的数据库开关参数改为统一的多值--db参数,用fixture参数化所有要测试的数据库:
import pytest def pytest_addoption(parser): parser.addoption( "--db", action="append", default=["sqlite"], help="指定测试的数据库,可传多次:--db postgresql --db sqlite" ) def pytest_generate_tests(metafunc): # 对所有依赖db_conn fixture的测试用例,按指定的数据库列表参数化 if "db_conn" in metafunc.fixturenames: target_dbs = metafunc.config.getoption("db") metafunc.parametrize("db_conn", target_dbs, indirect=True) @pytest.fixture def db_conn(request): db_type = request.param # 替换为你自己的数据库连接初始化逻辑 if db_type == "postgresql": conn = init_postgresql_connection() elif db_type == "sqlite": conn = init_sqlite_connection() else: raise ValueError(f"不支持的数据库类型:{db_type}") yield conn # 测试结束后清理连接 conn.close()
- 直接执行命令跑所有数据库的测试,pytest会自动生成统一的运行结果和汇总:
pytest --db postgresql --db sqlite tests
这个方案的优势是完全复用pytest原生的所有能力,不需要自己写汇总逻辑,支持所有pytest报告插件直接生成统一的html、json、xml等格式的总报告。
内容的提问来源于stack exchange,提问作者Subhash
相关产品推荐
相关产品推荐

