GoogleTest

在 3.9 版本中添加。

此模块定义了帮助使用 Google Test 基础设施的函数。提供了两种添加测试的机制。gtest_add_tests() 已经存在一段时间了,最初是通过 find_package(GTest) 实现的。gtest_discover_tests() 在 CMake 3.10 中引入。

(较旧的)gtest_add_tests() 扫描源文件以识别测试。这通常是有效的,但有一些注意事项,包括在交叉编译环境中,并且使在测试上设置其他属性更方便。但是,它对参数化测试的处理不太全面,并且需要重新运行 CMake 以检测测试列表的更改。

(较新的)gtest_discover_tests() 通过要求编译后的测试可执行文件枚举其测试来发现测试。这更健壮,并提供更好的参数化测试处理,并且在测试更改时不需要重新运行 CMake。但是,它可能在交叉编译环境中不起作用,并且设置测试属性不太方便。

更多详细信息可以在各个函数的文档中找到。

这两个命令都旨在取代使用 add_test() 注册测试,并将为每个 Google Test 测试用例创建一个单独的 CTest 测试。请注意,在某些情况下,这效率较低,因为公共的设置和拆卸逻辑无法在同一实例中执行的多个测试用例之间共享。但是,它为 CTest 提供了更细粒度的通过/失败信息,这通常被认为更有益。默认情况下,CTest 测试名称与 Google Test 名称相同(即 suite.testcase);另请参见 TEST_PREFIXTEST_SUFFIX

gtest_add_tests

通过扫描源代码中的 Google Test 宏自动添加 CTest 测试

gtest_add_tests(TARGET target
                [SOURCES src1...]
                [EXTRA_ARGS args...]
                [WORKING_DIRECTORY dir]
                [TEST_PREFIX prefix]
                [TEST_SUFFIX suffix]
                [SKIP_DEPENDENCY]
                [TEST_LIST outVar]
)

gtest_add_tests 尝试通过扫描源文件来识别测试。虽然这通常是有效的,但它仅使用基本的正则表达式匹配,这可能会被非典型的测试声明击败,并且无法完全“拆分”参数化测试。此外,它要求重新运行 CMake 以发现任何新添加、删除或重命名的测试(默认情况下,这意味着当任何测试源文件更改时会重新运行 CMake,但请参见 SKIP_DEPENDENCY)。但是,它具有在 CMake 时声明测试的优点,这在某种程度上简化了在测试上设置其他属性,并且始终在交叉编译环境中工作。

选项包括

TARGET target

指定 Google Test 可执行文件,它必须是已知的 CMake 可执行目标。CMake 将在运行测试时替换构建的可执行文件的位置。

SOURCES src1...

如果提供,则仅扫描列出的文件以查找测试用例。如果未提供此选项,则将使用指定 targetSOURCES 属性来获取源列表。

EXTRA_ARGS args...

要传递给每个测试用例的任何额外参数。

在 3.31 版本中更改:保留 args... 中的空值,请参见 CMP0178

WORKING_DIRECTORY dir

指定运行发现的测试用例的目录。如果未提供此选项,则使用当前二进制目录。

TEST_PREFIX prefix

指定要添加到每个发现的测试用例名称前面的 prefix。当相同的源文件在多次调用 gtest_add_test() 中使用但具有不同的 EXTRA_ARGS 时,这可能很有用。

TEST_SUFFIX suffix

TEST_PREFIX 类似,除了 suffix 被附加到每个发现的测试用例的名称之后。可以同时指定 TEST_PREFIXTEST_SUFFIX

SKIP_DEPENDENCY

通常,该函数创建一个依赖项,如果任何被扫描的源文件发生更改,将导致重新运行 CMake。这是为了确保更新发现的测试列表。如果不希望这样做(在实际编写测试用例时可能是这种情况),则可以使用此选项来防止添加依赖项。

TEST_LIST outVar

outVar 命名的变量将在调用作用域中填充发现的测试用例列表。这允许调用者执行诸如操作发现的测试的测试属性之类的操作。

在 3.31 版本中更改:保留 TEST_LAUNCHERCROSSCOMPILING_EMULATOR 目标属性中的空值,请参见策略 CMP0178

用法示例

include(GoogleTest)
add_executable(FooTest FooUnitTest.cxx)
gtest_add_tests(TARGET      FooTest
                TEST_SUFFIX .noArgs
                TEST_LIST   noArgsTests
)
gtest_add_tests(TARGET      FooTest
                EXTRA_ARGS  --someArg someValue
                TEST_SUFFIX .withArgs
                TEST_LIST   withArgsTests
)
set_tests_properties(${noArgsTests}   PROPERTIES TIMEOUT 10)
set_tests_properties(${withArgsTests} PROPERTIES TIMEOUT 20)

为了向后兼容,还支持以下形式

gtest_add_tests(exe args files...)
exe

测试可执行文件的路径或 CMake 目标的名称。

args

要传递给可执行文件的额外参数的 ;-list。整个列表必须作为单个参数传递。将其括在引号中,或者传递 "" 以表示没有参数。

files...

要搜索测试和测试 fixtures 的源文件列表。或者,使用 AUTO 指定 exe 是 CMake 可执行目标的名称,应扫描其源文件。

include(GoogleTest)
set(FooTestArgs --foo 1 --bar 2)
add_executable(FooTest FooUnitTest.cxx)
gtest_add_tests(FooTest "${FooTestArgs}" AUTO)
gtest_discover_tests

通过查询编译后的测试可执行文件以获取可用测试来自动添加 CTest 测试

gtest_discover_tests(target
                     [EXTRA_ARGS args...]
                     [WORKING_DIRECTORY dir]
                     [TEST_PREFIX prefix]
                     [TEST_SUFFIX suffix]
                     [TEST_FILTER expr]
                     [NO_PRETTY_TYPES] [NO_PRETTY_VALUES]
                     [PROPERTIES name1 value1...]
                     [TEST_LIST var]
                     [DISCOVERY_TIMEOUT seconds]
                     [XML_OUTPUT_DIR dir]
                     [DISCOVERY_MODE <POST_BUILD|PRE_TEST>]
                     [DISCOVERY_EXTRA_ARGS args...]
)

在 3.10 版本中添加。

gtest_discover_tests() 在测试可执行文件上设置一个构建后或测试前命令,该命令通过解析使用 --gtest_list_tests 参数运行测试可执行文件的输出来生成测试列表。与 gtest_add_tests() 的源解析方法相比,这确保了获得完整的测试列表,包括参数化测试的实例化。由于测试发现发生在构建或测试时,因此当测试列表更改时,无需重新运行 CMake。但是,它要求正确设置 CROSSCOMPILING_EMULATOR 才能在交叉编译环境中工作。

此外,设置测试属性有点不太方便,因为测试在 CMake 时不可用。可以使用 PROPERTIES 选项将其他测试属性分配给整套测试。如果需要更细粒度的测试控制,则可以使用 TEST_INCLUDE_FILES 目录属性通过外部 CTest 脚本提供自定义内容。发现的测试集可以通过 <target>_TESTS 变量访问到这样的脚本(有关进一步讨论和限制,请参见下面的 TEST_LIST 选项)。

选项包括

target

指定 Google Test 可执行文件,它必须是已知的 CMake 可执行目标。CMake 将在运行测试时替换构建的可执行文件的位置。

EXTRA_ARGS args...

要传递给每个测试用例的任何额外参数。

在 3.31 版本中更改:保留 args... 中的空值,请参见 CMP0178

WORKING_DIRECTORY dir

指定运行发现的测试用例的目录。如果未提供此选项,则使用当前二进制目录。

TEST_PREFIX prefix

指定要添加到每个发现的测试用例名称前面的 prefix。当相同的测试可执行文件在多次调用 gtest_discover_tests() 中使用但具有不同的 EXTRA_ARGS 时,这可能很有用。

TEST_SUFFIX suffix

TEST_PREFIX 类似,除了 suffix 被附加到每个发现的测试用例的名称之后。可以同时指定 TEST_PREFIXTEST_SUFFIX

TEST_FILTER expr

在 3.22 版本中添加。

过滤器表达式,在测试发现期间作为 --gtest_filter 参数传递。请注意,该表达式是一种基于通配符的格式,它与 gtest 使用的原始测试名称匹配。对于类型或值参数化测试,这些名称可能与 ctest 使用的可能经过美化的测试名称不同。

NO_PRETTY_TYPES

默认情况下,类型参数化测试的类型索引将替换为 CTest 测试名称中的实际类型名称。如果不需要此行为(例如,因为类型名称笨拙),则此选项将禁止此行为。

NO_PRETTY_VALUES

默认情况下,值参数化测试的值索引将替换为 CTest 测试名称中的实际值。如果不需要此行为(例如,因为值字符串笨拙),则此选项将禁止此行为。

PROPERTIES name1 value1...

指定要在此 gtest_discover_tests() 调用发现的所有测试上设置的其他属性。

TEST_LIST var

使测试列表在变量 var 中可用,而不是默认的 <target>_TESTS。当相同的测试可执行文件在多次调用 gtest_discover_tests() 中使用时,这可能很有用。请注意,此变量仅在 CTest 中可用。

由于 CMake 解析规则的限制,名称中带有方括号的任何测试都将从存储在此变量中的测试列表中省略。但是,此类测试仍将由 ctest 正常定义和执行。

DISCOVERY_TIMEOUT num

在 3.10.3 版本中添加。

指定 CMake 将等待测试枚举可用测试的时间(以秒为单位)。如果测试花费的时间超过此时间,则发现(和您的构建)将失败。大多数测试可执行文件将非常快速地枚举其测试,但在某些特殊情况下,测试可能需要更长的超时时间。默认值为 5。另请参见 execute_process()TIMEOUT 选项。

注意

在 CMake 3.10.1 和 3.10.2 版本中,此选项称为 TIMEOUT。这与 TIMEOUT 测试属性冲突,后者是通常使用 PROPERTIES 关键字设置的常见属性之一,通常导致合法但意外的行为。关键字在 CMake 3.10.3 中更改为 DISCOVERY_TIMEOUT 以解决此问题。3.10.1 和 3.10.2 中 TIMEOUT 关键字的歧义行为未被保留。

XML_OUTPUT_DIR dir

在 3.18 版本中添加。

如果指定,该参数将与 --gtest_output=xml: 一起传递给测试可执行文件。实际文件名与测试目标相同,包括前缀和后缀。应使用此选项代替 EXTRA_ARGS --gtest_output=xml,以避免在使用并行测试执行时写入 XML 结果输出时出现竞争条件。

DISCOVERY_MODE

在 3.18 版本中添加。

提供对 gtest_discover_tests() 何时执行测试发现的更大控制。默认情况下,POST_BUILD 设置一个构建后命令以在构建时执行测试发现。在某些情况下,例如交叉编译,这种 POST_BUILD 行为是不希望的。相比之下,PRE_TEST 将测试发现延迟到测试执行之前。这样,测试发现在目标环境中进行,在该环境中,测试更有可能找到适当的运行时依赖项。

DISCOVERY_MODE 默认为 CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE 变量的值,如果调用 gtest_discover_tests() 时未传递该变量。这提供了一种全局选择首选测试发现行为的机制,而无需修改每个调用站点。

DISCOVERY_EXTRA_ARGS args...

在 3.31 版本中添加。

要传递给发现命令的命令行上的任何额外参数。

在 3.29 版本中添加:在测试发现和测试执行期间,TEST_LAUNCHER 目标属性受到尊重。

在 3.31 版本中更改:保留 TEST_LAUNCHERCROSSCOMPILING_EMULATOR 目标属性中的空值,请参见策略 CMP0178