簡體   English   中英

如何使用 PHPUnit 獲得 100% 的代碼覆蓋率

[英]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% 的覆蓋率,但對於這些類,以下一項或多項是正確的:

  • class 非常簡單。
  • 測試需要非凡的工作來編寫。 例如,復雜的設置代碼可以創建條件來執行所有晦澀的極端情況。 查看我為 Zend_Db 編寫的單元測試,盡管強迫自己測試這些極端案例是有益的。 因為我保證它會引導您找到需要修復的代碼。
  • class 必須被重構為更“可測試”。 無論如何,這通常是一件好事,因為您最終會得到更好的 OO 代碼、更少的耦合、更少的 static 元素等。請參閱 Zend_Log 的類和測試。

但我們也意識到 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM