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