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

Posted

技术标签:

【中文标题】从 CMake 运行 pytest 测试,其中测试和源位于不同的文件夹中【英文标题】:Running a pytest test from CMake where the test and sources are in different folders 【发布时间】:2019-02-28 20:32:55 【问题描述】:

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

【问题讨论】:

嗯,你问如何从 CMake 运行这些测试,但是如何test/mypyspace/testBar.py 脚本旨在从命令行运行?应该如何设置环境变量才能正常运行? 不知道。我假设存在我可以设置的东西(比如PYTHONPATH),这在 CMake 中可能并不容易。 你不知道测试应该如何运行,但问我们如何在 CMake 中做到这一点,真的吗? 是的。在文件夹中分离 src 和 test 的方法非常普遍(尤其是在 CMake 项目中),我认为有人已经这样做了。查看相关问题:***.com/questions/47859986/…(但答案类似于:“pytest 需要安装 src”) set_tests_properties 中,您可以为PYTHONPATH 变量赋值等于其当前值加上其他路径,例如:$ENVPYTHONPATH:$CMAKE_CURRENT_SOURCE_DIR/../src。请注意,PYTHONPATH 变量的当前值是在运行 cmake 时获取的,但用户不太可能在运行测试时更改该路径。 【参考方案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:$ENVPYTHONPATH")

    在 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 with typical test directory structure 中找到一些内容

【讨论】:

以上是关于从 CMake 运行 pytest 测试,其中测试和源位于不同的文件夹中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pytest 中保持单元测试和集成测试分开

如何使用 pytest 加快大型测试套件的运行时间?

一篇教程精通pytest

一篇教程精通pytest

pytest 运行命令

10_Pytest框架