代码之家  ›  专栏  ›  技术社区  ›  Flamefire

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

  •  1
  • Flamefire  · 技术社区  · 6 年前

    我有一个基于CGED的项目,它同时使用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 回复  |  直到 6 年前
        1
  •  1
  •   Flamefire    6 年前

    有两种选择:

    1. 使用Python路径 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 with typical test directory structure