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_REQUIRED
和 RESOURCE_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:
DB
和Foo
。测试可以像fooOnly
和dbOnly
那样需要单个 fixture,或者它们可以像dbWithFoo
那样依赖多个 fixture。设置了
DEPENDS
关系以确保setupUsers
在createDB
之后发生,这两者都是DB
fixture 的设置测试,因此将在dbOnly
和dbWithFoo
测试之前自动执行。无需显式的
DEPENDS
关系即可使设置测试在常规测试之前运行,或使清理测试在常规测试之后运行。Foo
fixture 没有定义设置测试,只有一个清理测试。testsDone
是DB
和Foo
fixture 的清理测试。因此,它只会在两个 fixture 的常规测试完成后执行一次(即在fooOnly
、dbOnly
和dbWithFoo
之后)。没有为testsDone
指定DEPENDS
关系,因此它可以自由地在任一 fixture 的其他清理测试之前、之后或同时运行。设置和清理测试永远不会在其自身的
FIXTURES_REQUIRED
属性中列出它们所属的 fixture,因为这会导致依赖于自身并被视为错误。