2012-05-31 13 views
12

PHP用のSeleniumテストケースを作成しました。私はこれらのテストケースを実行している間、コードカバレッジを取得したいと思います。私のテストケース:私は私がテストを実行した後、リンク「http://www.phpunit.de/manual/current/en/selenium.html」PHPUnitSeleniumTestcaseのコードカバレッジ

で述べた手順に従っている

<?php 
class Example extends PHPUnit_Extensions_SeleniumTestCase 
{ 
    protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php'; 

    protected function setUp() 
    { 
    $this->setBrowser("*firefox"); 
    $this->setBrowserUrl("http://applicationname"); 
    $this->setCollectCodeCoverageInformation(true); 
    $this->setTestId("10001"); 
    $this->setHost("applicationname"); 
    } 

    public function testMyTestCase() 
    { 
    $this->open("http://applicationame"); 
    $this->assertEquals("title", $this->getTitle()); 
    $this->type("id=ext-comp-1002", "testuser"); 
    $this->fireEvent("id=ext-comp-1002", "blur"); 
    $this->type("id=ext-comp-1003", "testpassword"); 
    $this->fireEvent("id=ext-comp-1003", "blur"); 
    $this->click("ext-gen45"); 
    $this->waitForPageToLoad("200000"); 
} 
} 
?> 

コードカバレッジを見つけることができません。 phpunit_coverage.phpでは、名前がPHPUNIT_SELENIUM_TEST_IDのクッキーを探しています。このCookieはDriver.phpで作成されており、Cookieが利用可能ですが、ホスト名はアプリケーション名ではなく「localhost」に設定されています。

クッキーライフタイムが設定されているのは、テストケースの実行直後です。つまり、このクッキーはもう使用できなくなり、phpunit_coverage.phpを起動しようとするとクッキーと情報が見つからないため、コードカバレッジは表示されません。私は理解していない

もの:

  1. protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php';
  2. クッキーは私が議論されているこの問題を見てきました。このクッキーは、アクセス可能な

ことができるアプリケーション以外の別のホストを持っていた場合多くのフォーラムがありましたが、具体的な回答がありました

多くのフォーラムでの代わりにlocalhostサーバー名として。私の場合は、すでにlocalhostです。

この点に関するご意見はお役に立ちます。彼らは行動をカバーしているよう

おかげで、セレンと Ravuri

+1

多分この質問に対する回答が役立つかもしれません:http://stackoverflow.com/questions/11270527/does-phpunit-selenium-code-coverage-work – Potherca

答えて

2

統合や機能テストは限りコードをカバーしていません。このようなテストのコードカバレッジレポートは、有用な情報を生成するものではありません。単体テストはより意味のあるコードカバレッジレポートを生成します。テストは、Seleniumとの間で提供される情報に基づいて実行されています。実際にあなたの "コード"をテストすることはありません。

1

私は霜の答えがさらに強くなると思っていますが、私はPHPUnitとSeleniumの両方で、私が言っていることを完全には分かりません。だから私はそれを言い、私が訂正されるかどうかを見ます。

ユニットテストでは、PHPUnitを直接制御してアプリケーションコードを実行します。呼び出すコードにPHPUnitメソッドを渡し、Xdebugでそのメソッドを呼び出してカバレッジ情報を収集します。私はPHPUnitと同じアドレス空間でコードを実行していると考えていますが、それは厳密には真実ではないかもしれませんが、誰かがそれを知っていますか?

テストがSeleniumで実行されている場合、コードはPHPUnitの管理下にありません。コード内のメソッドではなく、PHPUnitにURLを渡し、そのURLを実際のWebブラウザに送るように手配します。 Webブラウザ自体は、PHPUnitと同じホストマシン上で実行する必要はありません。そうであっても、テストされているアプリケーションコードはURLで指定されたWebサーバー上で実行されます。 PHPUnitは、リクエストを処理するとPHPを呼び出し、そのPHPコードをXdebugで実行し、応答とともにトレース出力を送り返すというリクエストを処理するようにFirefoxに指示することはできません。 PHPUnitは、指定したURLとリクエストを処理したWebブラウザからの出力のみを表示します。リクエストを処理しているWebサーバーが実際にどのコードを実行したかを調べる方法はありません。

前の答えは、これらのテストのためのコードカバレッジレポートは有用な情報を提供していないだろうと言って、そのユニットテストは、より意味のあるレポートを生成する場所だから、私はそれが可能ないことを言ってすべての道を行くだろうこれらのテストではコードカバレッジを測定するため、コードカバレッジレポートを実行したときにそのコードカバレッジレポートを要求しないでください。あるいは、セレンテストのコードカバレッジレポートを生成し、コードの1行でも実行されたと報告されている場合、設定に重大な問題があります。

+0

私は "どちらの場合でもPHPUnitによってコードが実行されているため、PHPUnitの制御下にあります。違いは、少なくとも私の考えでは、単体テストのコード単位をテストするための単体テストが存在するためです。 Selenium型テストは複数のコード単位の統合を処理します。これらのケースでは、コードカバレッジは実際には何も教えてくれません... – frosty

+0

2回目の試行:私には、「実行された」とは、ユニットテストと一貫しており、PHPUnitソースを解釈しているPHPインタプリタがあなたのソースコード。例えば。 PHPUnitのユニットテスト機構は、テストされているメソッドによってスローされた未処理の例外をキャッチできます。しかし、Seleniumテストでは、コードは他の手段で実行されており、PHPで記述する必要はありません。セレンを介して実行されるテストでは、アプリケーションによってスローされた例外をキャッチすることはできません。例外がブラウザの出力に及ぼした影響のみを見ることができます。私には、それは非常に異なっています。 – sootsnoot

+0

私は@Pothercaによるリンクを元の質問の注釈で読んでいなかった。それは私が「コントロールする」または「実行する」と思う方法を変えない。しかし、テスト対象のコードを実行しているWebサーバーを制御できれば、そのWebサーバー上でセレンを介して実行されるテストでカバレッジレポートに記録されるようにカバレッジを記録できることを指摘しています。私はそれが素晴らしいと思います!私は霜に賛成ですが、単体テストで良好なカバレッジを得ることがより価値があり意味がありますが、セレンテストによるカバレッジは価値がないわけではありません。 – sootsnoot

関連する問題