FindCxxTest

查找 CxxTest,一个 C++ 单元测试框架套件,并提供一个辅助命令来创建测试运行器并将其与 CTest 集成。

结果变量

此模块定义了以下变量

CXXTEST_FOUND

布尔值,指示是否找到 CxxTest 框架。

CXXTEST_INCLUDE_DIRS

包含使用 CxxTest 所需头文件的目录。

CXXTEST_TESTGEN_EXECUTABLE

找到的 CxxTest 测试生成器脚本(基于 Perl 或 Python)的路径,根据找到的解释器或用户指定的偏好进行选择。

CXXTEST_TESTGEN_INTERPRETER

用于运行测试生成器脚本的 Perl 或 Python 解释器的路径(如果需要,例如在不支持脚本 shebang 行的平台上)。

缓存变量

以下缓存变量也可以设置

CXXTEST_PERL_TESTGEN_EXECUTABLE

基于 Perl 的 CxxTest 测试生成器脚本的路径。

CXXTEST_PYTHON_TESTGEN_EXECUTABLE

基于 Python 的 CxxTest 测试生成器脚本的路径。

提示

此模块在调用 find_package(CxxTest) 之前接受以下变量

CXXTEST_TESTGEN_ARGS

此变量可用于指定要传递给 CxxTest 代码生成器的命令行选项的以分号分隔的列表。如果未设置,默认值为 --error-printer

命令

如果找到 CxxTest,此模块提供以下命令

cxxtest_add_test

创建 CxxTest 运行器并将其添加到 CTest 测试套件

cxxtest_add_test(<test-name> <gen-source-file> <input-files-to-testgen>...)

参数

<test-name>

要创建并注册为 CTest 套件中测试的测试可执行目标名称。

<gen-source-file>

由 CxxTest 代码生成器生成的源文件名称。这必须是相对路径。它相对于当前二进制目录 (CMAKE_CURRENT_BINARY_DIR) 进行解释。

<input-files-to-testgen>

一个头文件列表,其中包含派生自 C++ 类 CxxTest::TestSuite 的测试套件类,要包含在测试运行器中。这些必须以绝对路径给出。

已弃用变量

以下变量已弃用,并为了向后兼容而提供

CXXTEST_USE_PYTHON

自版本 2.8.3 弃用:在早期版本的 CMake 中,此提示变量用于强制使用基于 Python 的测试生成器而不是基于 Perl 的测试生成器,无论安装了哪种脚本语言。现在只有在同时找到 Perl 和 Python 解释器时才考虑它。

一个布尔提示变量,当设置为 true 时,如果同时找到 Perl 和 Python 解释器,则优先选择 Python 代码生成器而不是 Perl 代码生成器。此变量仅在使用 CxxTest 版本 3 时才相关。

示例

以下示例演示了如何在 CMake 中使用此模块使用 CxxTest。如果找到 CxxTest

  • 在项目中手动创建附加的接口导入目标,以封装 CxxTest 使用要求并将其链接到指定的测试。此目标很有用,例如,在处理多个测试时。

  • 调用测试生成器,根据位于当前源目录中的输入头文件 foo_test.h 在当前二进制目录中创建 foo_test.cc

  • 构建名为 unit_test_foo 的可执行文件并将其注册为 CTest 中的测试。

CMakeLists.txt
find_package(CxxTest)

# Create interface imported target:
if(CXXTEST_FOUND AND NOT TARGET CxxTest::CxxTest)
  add_library(CxxTest::CxxTest INTERFACE IMPORTED)
  set_target_properties(
    CxxTest::CxxTest
    PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CXXTEST_INCLUDE_DIRS}"
  )
endif()

# Add test:
if(CXXTEST_FOUND)
  enable_testing()

  cxxtest_add_test(
    unit_test_foo
    foo_test.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/foo_test.h
  )

  target_link_libraries(
    unit_test_foo
    PRIVATE
      CxxTest::CxxTest
      # Link any project targets as needed, if test depends on them:
      foo
  )
endif()
foo_test.h
#include <cxxtest/TestSuite.h>

class MyTestSuite : public CxxTest::TestSuite
{
public:
  void testAddition(void)
  {
    TS_ASSERT(1 + 1 > 1);
    TS_ASSERT_EQUALS(1 + 1, 2);
  }
};