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,因為那樣會導致對自身的依賴,並被視為錯誤。