如何让pytest-cpp使用fixture提供的路径运行多平台C++单元测试
可行实现方案
以下两种方案均可实现你的需求,无需修改pytest-cpp核心源码:
方案1:复用pytest-cpp执行逻辑,自行参数化测试用例(最易落地)
pytest的fixture参数化和测试收集是两个独立阶段,pytest_collect_file钩子运行在fixture实例化之前,确实无法直接绑定fixture参数,所以可以绕过原生收集逻辑,用你现有的fixture直接调用pytest-cpp的测试执行能力:
- 你已经实现的编译fixture可以直接返回不同平台的C++测试二进制路径、对应的仿真命令前缀(比如
qemu-aarch64) - 写一个参数化的测试函数,直接调用pytest-cpp内置的测试执行器上报结果,示例代码如下:
import pytest from pytest_cpp.catch2 import Catch2Test # 你可以把参数列表换成从fixture动态生成,或者从配置文件读取 @pytest.mark.parametrize("platform, emulator, cpp_test_bin", [ ("x86_64", None, "build/x86/test_cpp"), ("arm64", "qemu-aarch64", "build/arm64/test_cpp"), ]) def test_cpp_unit(cpp_build_fixture, platform, emulator, cpp_test_bin): # 你的cpp_build_fixture已经完成对应平台二进制的编译,此处直接执行 run_cmd = [] if emulator: run_cmd.append(emulator) run_cmd.append(str(cpp_test_bin)) # 复用pytest-cpp的Catch2测试解析逻辑,结果会自动上报到pytest的测试统计中 test_case = Catch2Test(parent=None, path=cpp_test_bin) test_case.run()
- 优势:完全复用你已有的fixture逻辑,测试结果和pytest-cpp原生运行完全一致,每个平台的测试都会生成独立的测试条目,支持pytest原生的过滤、统计能力。
方案2:重写收集钩子,保留原生pytest-cpp使用体验
如果你希望保留pytest命令直接自动发现所有C++测试的体验,可以按以下步骤实现:
- 在
conftest.py中注册优先级高于pytest-cpp的pytest_collect_file钩子,先于原生插件扫描所有C++测试二进制 - 预生成所有需要测试的平台、仿真配置组合,为每个组合生成独立的测试收集项,把仿真前缀、二进制路径等参数存在测试项的
user_properties属性中 - 重写pytest-cpp的测试执行逻辑,运行时读取测试项存储的参数,加上仿真前缀后再执行
额外优化
如果需要支持命令行过滤运行的平台,可以在conftest.py中添加自定义命令行参数--cpp-test-platform,在收集或者参数化阶段读取参数过滤配置,完全兼容pytest原生的命令行使用习惯。
内容的提问来源于stack exchange,提问作者cube
相关产品推荐
相关产品推荐

