Entropy 是一個函式庫,提供用於在 PHPUnit 中進行隨機測試以及測試使用 PHP 隨機函數(例如rand
和shuffle
的系統的工具。
有時單元測試需要變更全域狀態,或覆寫改變該狀態的功能。雖然這絕不是理想的情況,但這通常會導致無意中創建對其他測試的依賴關係。
啟用 Entropy 的測試改組功能會隨機化測試的順序,有助於突顯這些依賴。
Entropy 的測試洗牌也避免使用 PHPUnit 的@depends
功能更改測試順序;未來的工作將努力確保在適當的時候仍然可以對這些測試進行改組。
有時,您可能會發現自己處於這樣一種情況:函數的輸入範圍如此之大,以至於採用這些輸入的橫截面可以更有效地利用您的資源。但是,如果該橫截面有孔洞,導致測試可能失敗,會發生什麼情況?
解決這個問題的一種方法是使用隨機輸入,其中輸入的產生方式是為了獲得範圍的隨機橫截面。換句話說,使用rand
或其他此類非確定性方法。
對此的擴展,基於屬性的測試是將隨機輸入應用於應用程式或函數,並觀察輸出是否遵守某些規則或具有相對於輸入的某些屬性,而不是精確測試與已知結果的相等性放。
透過管理測試的隨機種子,熵不僅允許使用這些方法,而且還可以透過接受固定種子或從上次失敗的運行中恢復它直到測試套件通過來使它們可重複。
您可以使用 Composer 將此庫新增到您的專案中:
$ composer require datto/phpunit-entropy
配置完成後,您可以正常執行測試套件;聽者會照顧自己。在測試錯誤或失敗時,使用的種子將儲存在臨時檔案中,以便在下次運行時將重複使用它,而不是產生新的種子。
隨機數產生器的種子由最多四個位置提供,此處按優先順序呈現。
如果設置, SEED
環境變數將用於覆蓋任何其他設置。它可以通過export
設置,但建議的用途是僅將其設置為當前運行:
SEED=123456 phpunit -c phpunit.xml tests
種子可以透過配置固定;請參閱下面的配置部分。
如果測試運行失敗,則使用的種子將儲存在暫存檔案中。然後將其加載到後續測試中,並將持續到套件再次成功為止。
如果透過上述方法沒有設定種子,最後的方法是使用 PHP 的rand
函數。
通過 Composer 安裝後,設定測試監聽器只需更改 PHPUnit 設定檔(通常是phpunit.xml
):
< phpunit xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi : noNamespaceSchemaLocation = " http://schema.phpunit.de/4.1/phpunit.xsd "
backupGlobals = " false "
colors = " true "
bootstrap = " bootstrap.php "
>
< listeners >
< listener class = " DattoPHPUnitEntropyListener " >
< arguments >
< array >
< element key = " seeding " >
< array >
< element key = " enabled " >
< boolean >true</ boolean >
</ element >
< element key = " seed " >
< integer >1234567</ integer >
</ element >
< element key = " file " >
< string >/tmp/phpentropy-seed</ string >
</ element >
</ array >
</ element >
< element key = " shuffle " >
< boolean >true</ boolean >
</ element >
</ array >
</ arguments >
</ listener >
</ listeners >
</ phpunit >
如果設定為 true,隨機數產生器將由偵聽器播種。
如果透過此參數設定種子,則只有此值將用於為隨機數產生器提供種子。請參閱下面有關種子優先順序的部分。
如果設置,該檔案將用於儲存最後一次失敗的隨機種子;它預設為[TMPDIR LOCATION]/phpunit-entropy-seed
。
如果設定為 true,單元測試的執行順序將是隨機的(使用@depends
的套件除外)。這對於確定和識別測試間依賴性很有用。
克里斯多福‧霍爾特 <[email protected]>