python - 从 CMake 运行 pytest 测试,其中测试和源位于不同的文件夹中

标签 python python-3.x cmake pytest

我有一个基于 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 的更改。

最佳答案

有两个选项:

  1. 使用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}")
  1. 在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/

相关文章:

python - 干净的完成方式——如果 x 在 [(0, 1, 2), (2, 0, 1), (1, 2, 0)] :?

静态库的c++链接器错误

python - 合并字典中具有公共(public)元素的列表

python - UnboundLocalError:分配前已引用本地变量“已按下”

c++ - Cmake 中的资源文件夹

c++ - 如何在 RelWithDebInfo 模式下构建依赖于 opencv 3.4.0 的项目

Python Flask 解析输出中的 JSON 内容

python - 在 setup.py 中需要什么选项才能在正确的目录中创建包?

python - trie 的快速序列化

python - pyparsing - 如何使用比较运算符解析字符串?