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