FIXTURES_REQUIRED

在版本 3.7 中新增。

指定測試所需的夾具列表。夾具名稱區分大小寫,且不一定與測試名稱相似。

夾具是一種將設定和清除任務附加到一組測試的方式。如果測試需要給定的夾具,則會先執行所有標記為該夾具設定任務的測試(針對整組測試執行一次,而不是每個需要夾具的測試執行一次)。在所有需要特定夾具的測試完成後,CTest 將確保接著執行所有標記為該夾具清除任務的測試。測試會使用 FIXTURES_SETUP 屬性標記為設定任務,並使用 FIXTURES_CLEANUP 屬性標記為清除任務。如果任何夾具的設定測試失敗,則不會執行在其 FIXTURES_REQUIRED 屬性中列出該夾具的所有測試。夾具的清除測試將始終執行,即使某些設定測試失敗也是如此。

當要求 CTest 僅執行一部分測試時(例如,透過使用正規表示式或使用 --rerun-failed 命令列選項執行時),它會自動新增執行集中任何測試所需的夾具的任何設定或清除測試。可以使用 -FS-FC-FA 命令列選項覆寫此行為,以便 ctest(1) 在需要時執行。

由於設定和清除任務也是測試,它們可以像其他任何測試一樣,使用 DEPENDS 測試屬性指定順序。可以利用此特性,使用單一夾具的多個測試來實作設定或清除,以模組化設定或清除邏輯。

夾具的概念與 RESOURCE_LOCK 指定的資源不同,但它們可以一起使用。夾具定義一組共享設定和清除要求的測試,而資源鎖定的作用是確保特定的一組測試不會並行執行。某些情況可能需要兩者,例如設定資料庫、序列化測試對該資料庫的存取,以及在最後再次刪除資料庫。在這種情況下,測試會同時填入 FIXTURES_REQUIREDRESOURCE_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)

此範例的重點

  • 定義了兩個夾具:DBFoo。測試可以像 fooOnlydbOnly 一樣,需要單一夾具,或者它們可以像 dbWithFoo 一樣,依賴多個夾具。

  • 設定了 DEPENDS 關係,以確保 setupUserscreateDB 之後發生,這兩者都是 DB 夾具的設定測試,因此將在 dbOnlydbWithFoo 測試之前自動執行。

  • 不需要明確的 DEPENDS 關係,即可讓設定測試在一般測試之前執行,或讓清除測試在一般測試之後執行。

  • Foo 夾具沒有定義任何設定測試,只有單一清除測試。

  • testsDoneDBFoo 夾具的清除測試。因此,它只會在兩個夾具的一般測試完成後執行(也就是在 fooOnlydbOnlydbWithFoo 之後)。沒有為 testsDone 指定 DEPENDS 關係,因此它可以自由地在任一夾具的其他清除測試之前、之後或同時執行。

  • 設定和清除測試絕不會在其自己的 FIXTURES_REQUIRED 屬性中列出它們所針對的夾具,因為這會導致它們依賴自身,並被視為錯誤。