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