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

Fla*_*ire 4 python cmake pytest python-3.x

我有一个使用 C++ 和 python 源代码的基于 CMake 的项目。测试是通过add_test为文件夹结构中的所有 C++ 测试添加的,例如:

src
  mynamespace/foo.cpp
  mypyspace/mypkg/__init__.py
  mypyspace/mypkg/bar.py
test
  mynamespace/testFoo.cpp
  mypyspace/testBar.py
Run Code Online (Sandbox Code Playgroud)

testBar.py我有一个import mypkg并且想要运行它add_test(... COMMAND pytest WORKING_DIRECTORY .../test)

当然它没有找到我的包,但我也不想安装它(它需要在构建过程中生成一些东西,并且作为其他源的一部分积极开发)。

执行这些测试的正确/首选方法是什么?

笔记:

  • 我不想将源移出src或测试移出test
  • set_tests_properties 可以设置环境变量。

我认为设置PYTHONPATH=.../src/mypyspace应该有效,但这也会忽略对用户的更改PYTHONPATH

Fla*_*ire 10

有2个选项:

  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}")

  2. 在 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 的信息 。最重要的部分:

[python -m pytest] 调用会将当前目录添加到 sys.path。

所以我们只需要在运行测试时将当前目录设置到源目录即可。

注意:对于特定于unittest(模块)的其他替代方案,您还可以在Running unittest 中找到具有典型测试目录结构的内容