谷歌测试

在 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 测试名称相同(即 suite.testcase);另见 TEST_PREFIXTEST_SUFFIX

gtest_add_tests

通过扫描 Google 测试宏的源代码,使用 CTest 自动添加测试:

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

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

选项是:

目标目标

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

来源src1 ...

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

EXTRA_ARGS arg1 ...

在命令行上传递给每个测试用例的任何额外参数。

WORKING_DIRECTORY 目录

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

TEST_PREFIX 前缀

指定要添加到每个发现的测试用例的名称前的“前缀”。当在多次调用 gtest_add_test() 但使用不同的 EXTRA_ARGS 时,这会很有用。

TEST_SUFFIX 后缀

类似于 TEST_PREFIX 除了``后缀``被附加到每个发现的测试用例的名称。可以指定 TEST_PREFIXTEST_SUFFIX

跳过依赖

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

TEST_LIST 输出变量

outVar 命名的变量将在调用范围内填充已发现的测试用例列表。这允许调用者执行诸如操纵已发现测试的测试属性之类的事情。

使用示例:

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 目标的名称。

参数

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

文件...

用于搜索测试和测试装置的源文件列表。或者,使用 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 arg1...]
                     [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>]
)

在 3.10 版本加入.

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

此外,设置测试属性不太方便,因为测试在 CMake 时不可用。使用“PROPERTIES”选项,可以将其他测试属性作为一个整体分配给测试集。如果需要更细粒度的测试控制,可以使用 TEST_INCLUDE_FILES 目录属性通过外部 CTest 脚本提供自定义内容。这样的脚本可以通过“<target>_TESTS”变量访问已发现的测试集。

选项是:

目标

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

EXTRA_ARGS arg1 ...

在命令行上传递给每个测试用例的任何额外参数。

WORKING_DIRECTORY 目录

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

TEST_PREFIX 前缀

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

TEST_SUFFIX 后缀

类似于 TEST_PREFIX 除了``后缀``被附加到每个发现的测试用例的名称。可以指定 TEST_PREFIXTEST_SUFFIX

TEST_FILTER expr

在 3.22 版本加入.

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

NO_PRETTY_TYPES

默认情况下,类型参数化测试的类型索引替换为 CTest 测试名称中的实际类型名称。如果这种行为是不可取的(例如,因为类型名称很笨重),这个选项将抑制这种行为。

NO_PRETTY_VALUES

默认情况下,值参数化测试的值索引被替换为 CTest 测试名称中的实际值。如果这种行为是不可取的(例如,因为值字符串很笨重),这个选项将抑制这种行为。

属性 name1 value1 ...

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

TEST_LIST 变量

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

在 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() 时未被传递。这提供了一种机制,用于全局选择首选测试发现行为,而无需修改每个调用站点。