FIXTURES_REQUIRED

在 3.7 版本中添加。

指定测试所需的 fixture 列表。Fixture 名称区分大小写,并且不需要与测试名称有任何相似之处。

Fixture 是一种将设置和清理任务附加到一组测试的方法。如果测试需要给定的 fixture,则首先执行标记为该 fixture 的设置任务的所有测试(对于整组测试执行一次,而不是每个需要 fixture 的测试执行一次)。在需要特定 fixture 的所有测试完成后,CTest 将确保执行标记为该 fixture 清理任务的所有测试。测试通过 FIXTURES_SETUP 属性标记为设置任务,并通过 FIXTURES_CLEANUP 属性标记为清理任务。如果任何 fixture 的设置测试失败,所有在其 FIXTURES_REQUIRED 属性中列出该 fixture 的测试将不会被执行。即使某些设置测试失败,fixture 的清理测试也将始终执行。

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

由于设置和清理任务也是测试,它们也可以像任何其他测试一样,通过 DEPENDS 测试属性指定顺序。这可以用于为单个 fixture 使用多个测试来实现设置或清理,以模块化设置或清理逻辑。

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

考虑以下示例,该示例表示类似于上述数据库测试场景

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)

此示例的要点

  • 定义了两个 fixture:DBFoo。测试可以像 fooOnlydbOnly 那样需要单个 fixture,或者它们可以像 dbWithFoo 那样依赖多个 fixture。

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

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

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

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

  • 设置和清理测试永远不会在其自身的 FIXTURES_REQUIRED 属性中列出它们所属的 fixture,因为这会导致依赖于自身并被视为错误。