6 有風險的測試
無用測試
什麼叫無用測試呢?未進行任何斷言的測試方法,就叫做無用測試。本來PHPUnit不會對這些測試進行限制,但是可以使用開啓一些配置,將這些測試方法標記爲有風險的。
- 命令行參數:
--report-useless-tests
- PHPUnit的XML配置文件中設置:
beStrictAboutTestsThatDoNotTestAnything="true"
意外的代碼覆蓋
@covers
和@uses
在測試代碼中用
@covers
標註來指明測試方法想要對哪些方法進行測試
標註方法暫時不在這一章裏面詳細介紹。
@uses
標註用來指明那些將會在測試中執行到但同時又不打算讓其被測試所覆蓋的代碼。
這裏實在沒有找到對應的例子,可能是因爲我半路跳過去的吧。所以以下就是我的猜想了,@uses
應該是標註了該測試中會用到的類,但是後面那句**“但同時又不打算讓其被測試所覆蓋的代碼”,我就不知道怎麼理解"覆蓋"**,這個詞的含義了,所以先空着吧。
PHPUnit 可以更嚴格對待意外的代碼覆蓋。此項檢查可以用命令行選項
--strict-coverage
或在 PHPUnit 的 XML 配置文件中設置beStrictAboutCoversAnnotation="true"
來啓用。在啓用本項檢查後,如果某個帶有 @covers 標註的測試執行了未在 @covers 或 @uses 標註中列出的代碼,它將被標記爲有風險。
測試執行期間產生的輸出
PHPUnit 可以更嚴格對待測試執行期間產生的輸出。 此項檢查可以用命令行選項
--disallow-test-output
或在 PHPUnit 的 XML 配置文件中設置beStrictAboutOutputDuringTests="true"
來啓用。
簡單來說就是不允許在測試執行期間有任何的輸出(print
,echo
等),否則就會標記爲有風險。
測試執行時長的超時限制
如果安裝了
PHP_Invoker
包並且pcntl
擴展可用,那麼可以對測試的執行時長進行限制。此時間限制可以用命令行選項--enforce-time-limit
或在 PHPUnit 的 XML 配置文件中設置beStrictAboutTestSize="true"
來啓用。帶有
@large
標註的測試如果執行時間超過60秒將視爲失敗。此超時限制可以通過XML配置文件中的timeoutForLargeTests
屬性進行配置。帶有
@medium
標註的測試如果執行時間超過10秒將視爲失敗。此超時限制可以通過XML配置文件中的timeoutForMediumTests
屬性進行配置。沒有
@medium
或@large
標註的測試都將視同爲帶有@small``標註,這類測試如果執行時間超過1秒將視爲失敗。此超時限制可以通過XML配置文件中的 ``timeoutForSmallTests
屬性進行配置。
上面的話總結起來就是:
- 需要安裝
PHP_Invoker
和pcntl
拓展 - 可以使用命令行參數
--enforce-time-limit
或者XML配置文件參數beStrictAboutTestSize="true
開啓 @large
參數默認60秒,可以通過timeoutForLargeTests
來修改@medium
參數默認10秒,可以通過timeoutForMediumTests
修改@small
是默認配置,默認1秒,可以通過timeoutForSmallTests
修改
全局狀態篡改
PHPUnit 可以更嚴格對待篡改全局狀態的測試。此項檢查可以用命令行選項
--strict-global-state
或在 PHPUnit 的 XML 配置文件中設置beStrictAboutChangesToGlobalState="true"
來啓用。
簡單來說開啓這個配置之後,如果測試類中有篡改全局狀態的代碼,就會被認定爲有風險的代碼。至於全局狀態,估計是$GLOBAL
之類的值吧。