[英]How to get 100% Code Coverage with PHPUnit
我正在編寫一個 Zend Framework 應用程序並使用 PHPUnit 對其進行單元測試。 總的來說,事情進展順利,但是我在 PHPUnit 和代碼覆蓋率方面有一個小但令人討厭的問題 - 它有時告訴我沒有測試特定的行,我不知道如何強制它進行測試。
例如,在下面的代碼中,我啟動了兩個測試:一個帶有 GET 請求,一個帶有 POST 請求。 測試通過了,這一切都很好。 然而,當我查看代碼覆蓋率時,它告訴我“else”行沒有被執行。
public function editAction()
{
if ($request->isPost()) {
// do actions related to POST
} else {
// do action related to GET
}
}
有任何想法嗎? 作為一個附帶問題,您是否通常會堅持進行單元測試,直到獲得 100% 的代碼覆蓋率? 或者這不是很實用?
非常感謝...
幾年前,通過 ZF 1.0 的發布,我是 Zend 框架的項目負責人。 我非常努力地提高所有組件的測試覆蓋率,並且我們制定了一項政策,即組件必須具有一定的最低代碼覆蓋率才能從孵化器中采用到 ZF。
但是,您是對的,試圖從所有類的測試中獲得 100% 的代碼覆蓋率並不實際。 ZF 中的一些類具有 100% 的覆蓋率,但對於這些類,以下一項或多項是正確的:
但我們也意識到 100% 的代碼覆蓋率有時是一個人為的目標。 然而,達到 100% 覆蓋率的測試套件可能就足夠了。 覆蓋率達到 100% 的測試套件並不一定能保證質量。
以下 function 很容易獲得 100% 的代碼覆蓋率。 但是我們是否測試了除以零?
function div($numerator, $denominator) {
return $numerator / $denominator;
}
因此,您應該將代碼覆蓋率作為測試的一項指標,而不是最終目標。
您只有注釋的代碼才是最重要的。 如果塊的右大括號有可能出現在代碼覆蓋率報告中,則它會在代碼覆蓋率報告中顯示為可執行文件。 尋找一個你實際上沒有測試的分支。
if ($request->isPost()) {
if ($x < 5) {
return '<';
}
elseif ($x > 5) {
return '>';
}
// Do you have a test for $x == 5?
}
至於 100% 的代碼覆蓋率目標,我完全同意 Bill。 對於我編寫的一些框架類,我會努力做到 100%,但我知道這並不意味着我已經真正測試了每一種可能性。 通常,當我發現自己為了達到 100% 的覆蓋率而努力工作時,可能是強迫症開始了。:)
只是。 . . 一。 . . 更多的。 . . 測試。 . .
如果這就是您的測試的全部內容,那么我會假設您的測試看起來像 Matthew 所描述的:
class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase {
// [...]
public function testSomething()
{
$this->request
->setMethod('POST')
->setPost(array(
'username' => 'foobar',
'password' => 'foobar'
));
$this->editAction();
// assertThatTheRightThingsHappend
}
}
在那種情況下,我看不出有任何理由為什么不容易獲得 100% 的代碼覆蓋率。
但是是的:測試 Zend 框架控制器非常困難,有時您必須非常努力地從控制器中獲取所有應用程序邏輯,或者只是忍受它。
不過,同樣的事情不適用於您的模型。 這些應該很容易測試,即使在 ZF 應用程序中也是如此。
代碼覆蓋的目的是告訴您代碼庫的哪些部分甚至沒有被執行。 它不會告訴您真正測試了什么,只能作為了解測試套件質量的“最低限度”(如果您不使用@covers,即使這可能會欺騙您)。
簡而言之:如果您有大型控制器並且不太容易更改架構,只需使用某某測試控制器進行設置,但不要將相同的邏輯應用於您的模型。 ZF 中的任何內容都不會阻止您正確測試這些
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.