使用 CMake + make 只运行一个测试

ein*_*ica 11 testing cmake

如果我的项目有一堆测试,我可以运行它们 - 在cmakeing 和makeing 构建、构建之后 - 使用make test.

但是,如果我只想运行其中一项测试怎么办?也就是说,我add_test()在测试中拥有的项目之一CMakeFile.txt

ein*_*ica 22

tl;dr - 这样做:

cd $YOUR_BUILD_DIRECTORY
ctest -R name_of_your_test
Run Code Online (Sandbox Code Playgroud)

解释

以下是您可能感到困惑的方式:

  1. 你试图用 来做这件事make,因为make test它为你运行了所有的测试。这不适用于单个测试(尽管有解决方法 - 请参阅@danger89 的答案)。ctest是跨平台的方式来做到这一点。

  2. 您开始使用ctest, 例如在您的主项目目录中,您可能会得到如下内容:

     *********************************
     No test configuration file found!
     *********************************
     Usage
    
       ctest [options]
    
    Run Code Online (Sandbox Code Playgroud)

    这没有帮助。

  3. ... 所以你想“好吧,也许ctest有一个-C开关,比如 CMake 和 GNU Make”——事实上,它有一个-C开关!但这并没有达到您的预期:

     [joeuser:/home/joeuser/src/myproj]$ ctest -C build
     Test project /home/joeuser/src/myproj
     No tests were found!!!
    
    Run Code Online (Sandbox Code Playgroud)

你实际需要做的:

  cd $YOUR_BUILD_DIRECTORY
  ctest -R name_of_your_test
Run Code Online (Sandbox Code Playgroud)

(注意-R匹配正则表达式。)这应该有效。请注意,您可以列出要运行的测试,而不是通过传递-N到 来实际运行它们ctest


感谢@RTsyvarev 为我指明了正确的方向


dan*_*r89 6

einpoklum 并不完全正确。make test其实只要你喜欢就可以用。CMake 将生成一个 Makefile,我发现它接受一个ARGS变量。

这意味着您可以通过 -R(正则表达式)参数运行特定测试。使用 make test 时将如下所示:

make test ARGS="-R '^test_'"
Run Code Online (Sandbox Code Playgroud)

test_这将仅运行文件名中以 开头的测试用例文件。

注意: -R上面只是一个示例,它也将接受命令将接受的所有参数ctest

无论如何,上面的 make test 示例将与运行完全相同:

ctest -R '^test_'
Run Code Online (Sandbox Code Playgroud)