我有一个基于 CMake 的项目,它同时使用 C++ 和 Python 源代码。通过 add_test
为文件夹结构中的所有 C++ 测试添加测试,例如:
src
mynamespace/foo.cpp
mypyspace/mypkg/__init__.py
mypyspace/mypkg/bar.py
test
mynamespace/testFoo.cpp
mypyspace/testBar.py
在 testBar.py
中,我有一个 import mypkg
并希望使用 add_test(... COMMAND pytest WORKING_DIRECTORY .../test)
当然它没有找到我的包,但我也不想安装它(它需要在构建过程中生成一些东西并且作为其他源的一部分积极开发)。
执行这些测试的正确/首选方法是什么?
注意事项:
- 我不想将源代码移出
src
或将测试移出test
set_tests_properties
可以设置环境变量。
我认为设置 PYTHONPATH=.../src/mypyspace
应该有效,但这也会忽略对用户 PYTHONPATH
的更改。
最佳答案
有两个选项:
- 使用
PYTHONPATH
add_test (NAME python-tests
COMMAND ${PYTHON_EXECUTABLE} -m pytest # Or just COMMAND pytest
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
set_tests_properties(python-tests
PROPERTIES ENVIRONMENT "PYTHONPATH=${PROJECT_SOURCE_DIR}/src/mypyspace:$ENV{PYTHONPATH}")
- 在src目录内部调用
add_test (NAME python-tests
COMMAND ${PYTHON_EXECUTABLE} -m pytest ${CMAKE_CURRENT_SOURCE_DIR}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src/mypyspace
)
第一种方法有一个缺点,即用户可能会配置并随后更改其环境以使 PYTHONPATH 不同(例如,在 HPC 集群中加载模块)并发现测试错误地成功。
第二个是最灵活的。它依赖于来自 https://docs.pytest.org/en/latest/pythonpath.html 的信息.最重要的部分:
the [python -m pytest] call will add the current directory to sys.path.
所以我们只需要在运行测试时将当前目录设置到源目录即可。
注意:对于特定于 unittest
(模块)的其他替代方案,您还可以在 Running unittest with typical test directory structure 中找到一些内容
关于python - 从 CMake 运行 pytest 测试,其中测试和源位于不同的文件夹中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52494425/