FIXTURES_REQUIRED

3.7 版本中新增。

指定测试所需的测试固件(fixtures)列表。固件名称区分大小写,且不必与测试名称有任何相似之处。

固件是为一组测试附加设置(setup)和清理(cleanup)任务的一种方式。如果某个测试需要给定的固件,那么所有被标记为该固件设置任务的测试将首先执行(针对整组测试执行一次,而不是为每个需要该固件的测试各执行一次)。在所有需要特定固件的测试完成后,CTest 将确保执行所有被标记为该固件清理任务的测试。测试可以通过 FIXTURES_SETUP 属性标记为设置任务,通过 FIXTURES_CLEANUP 属性标记为清理任务。如果固件的任何设置测试失败,所有在其 FIXTURES_REQUIRED 属性中列出该固件的测试将不会执行。无论设置测试是否失败,固件的清理测试总会被执行。

当要求 CTest 仅执行测试的子集(例如使用正则表达式,或在运行命令行选项 --rerun-failed 时),它会自动添加执行集中任何测试所必需的固件的设置或清理测试。如果需要,此行为可以通过 ctest(1) 的命令行选项 -FS-FC-FA 来覆盖。

由于设置和清理任务本身也是测试,它们可以像其他任何测试一样,通过 DEPENDS 测试属性来指定执行顺序。这可以用来利用多个测试实现单个固件的设置或清理,从而模块化设置或清理逻辑。

固件的概念与 RESOURCE_LOCK 指定的资源不同,但它们可以一起使用。固件定义了一组共享设置和清理要求的测试,而资源锁的作用是确保一组特定的测试不会并行运行。某些情况可能两者都需要,例如设置数据库、序列化对此数据库的测试访问,并在最后删除数据库。对于此类情况,测试将同时填充 FIXTURES_REQUIREDRESOURCE_LOCK 以结合这两种行为。用于 RESOURCE_LOCK 的名称与固件名称无关,因此请注意,资源锁并不隐含固件,反之亦然。

考虑以下示例,它展示了一个类似于上述提到的数据库测试场景

add_test(NAME testsDone   COMMAND emailResults)
add_test(NAME fooOnly     COMMAND testFoo)
add_test(NAME dbOnly      COMMAND testDb)
add_test(NAME dbWithFoo   COMMAND testDbWithFoo)
add_test(NAME createDB    COMMAND initDB)
add_test(NAME setupUsers  COMMAND userCreation)
add_test(NAME cleanupDB   COMMAND deleteDB)
add_test(NAME cleanupFoo  COMMAND removeFoos)

set_tests_properties(setupUsers PROPERTIES DEPENDS createDB)

set_tests_properties(createDB   PROPERTIES FIXTURES_SETUP    DB)
set_tests_properties(setupUsers PROPERTIES FIXTURES_SETUP    DB)
set_tests_properties(cleanupDB  PROPERTIES FIXTURES_CLEANUP  DB)
set_tests_properties(cleanupFoo PROPERTIES FIXTURES_CLEANUP  Foo)
set_tests_properties(testsDone  PROPERTIES FIXTURES_CLEANUP  "DB;Foo")

set_tests_properties(fooOnly    PROPERTIES FIXTURES_REQUIRED Foo)
set_tests_properties(dbOnly     PROPERTIES FIXTURES_REQUIRED DB)
set_tests_properties(dbWithFoo  PROPERTIES FIXTURES_REQUIRED "DB;Foo")

set_tests_properties(dbOnly dbWithFoo createDB setupUsers cleanupDB
                     PROPERTIES RESOURCE_LOCK DbAccess)

该示例的关键点

  • 定义了两个固件:DBFoo。测试可以像 fooOnlydbOnly 那样仅需要单个固件,也可以像 dbWithFoo 那样依赖多个固件。

  • 设置了 DEPENDS 关系以确保 setupUserscreateDB 之后发生,这两个测试都是 DB 固件的设置测试,因此它们将自动在 dbOnlydbWithFoo 测试之前执行。

  • 不需要显式的 DEPENDS 关系来使设置测试在常规测试之前运行,或使清理测试在常规测试之后运行。

  • Foo 固件没有定义设置测试,只有一个清理测试。

  • testsDoneDBFoo 两个固件的清理测试。因此,它只会在两个固件的常规测试完成后执行(即在 fooOnlydbOnlydbWithFoo 之后)。没有为 testsDone 指定 DEPENDS 关系,因此它可以自由地在任一固件的其他清理测试之前、之后或同时运行。

  • 设置和清理测试绝不会在其自身的 FIXTURES_REQUIRED 属性中列出它们所服务的固件,因为这会导致对自身产生依赖,并被视为错误。