FIXTURES_REQUIRED

在 3.7 版本中添加。

指定测试所需的夹具列表。夹具名称区分大小写,且无需与测试名称有任何相似之处。

夹具是一种将设置和清理任务附加到一组测试的方法。如果测试需要给定夹具,那么标记为该夹具设置任务的所有测试将首先执行(仅对整组测试执行一次,而不是针对需要该夹具的每个测试执行一次)。在所有需要特定夹具的测试完成后,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 关系,因此它可以在任何固定装置的其他清理测试之前、之后或与之同时运行。

  • 准备和清理测试永远不会在它们自身