5

SauceLabs を使用してブラウザーのテストをセットアップしています。ローカルおよび Sauce 経由でテストを実行できるようになったので、Jenkins インストールと統合して、ビルドとブラウザー テストを自動的にトリガーしようとしています。

これのほとんどはすべて機能していますが、小さな問題が 1 つあります。テストをローカルで Sauce 経由で実行できるように、ハードコーディングするのではなく、phpUnit の setup() 関数で $browsers 静的プロパティを設定したいと考えています。これは不可能のようです。

私は Sausage バインディングを使用しています。私の TestCase は次のデモにかなり似ています: https://github.com/jlipps/sausage/blob/master/WebDriverDemo.php

setUp() で $browsers 配列を更新しようとしましたが、効果がないようです。例えば。

public function setUp()
{   
    self::$browsers = array(
        'browserName' => getenv('SELENIUM_BROWSER'),
        'desiredCapabilities' => array(
            'version' => getenv('SELENIUM_VERSION'),
            'platform' => getenv('SELENIUM_PLATFORM'),
         )
     );
}

テスト ケースがより柔軟になるように、Jenkins からブラウザの詳細を渡す方法はありますか? ここで簡単なものが欠けているような気がしますか?

4

3 に答える 3

5

ソースを掘り下げるのにかなりの時間を費やした後、「複数のブラウザー」シナリオの解決策を見つけました。複数のブラウザーに関する chapmatic の主張と与えられた答えは確かに正しかった: $browsers 配列に複数のブラウザーが定義されている場合、並列テストでは機能せず、同じブラウザーを数回実行します。このソリューションでは引き続き環境変数を使用しますが、$browsers 配列を引き続き使用する必要があります。

したがって、まず抽象テスト クラスで $browsers 配列を定義してください。次に、env var BROWSER を定義し、テストするブラウザを割り当てたとします。Sauce\Sausage\WebDriverTestCase を拡張する抽象テスト クラスで、次の静的関数を設定できます。

    public static function browserSetup()
    {   
        switch (getenv('BROWSER')) {
            case 'firefox':
                self::$browsers = array(
                    array(
                        'browserName' => 'firefox',
                        'desiredCapabilities' => array(
                            'platform' => 'self::WIN_VERSION',
                            'version' => self::FIREFOX_VERSION,
                        )   
                    )   
                );  
                break;

            case 'safari':
                //safari desiredCapabilities
               break;

            case 'explorer':
                //ie desiredCapabilities
               break;

           case 'chrome':
             //chrome desiredCapabilities

           default: //This will just use the default $browsers array you defined
         return;
    }

browserSetup() が定義されたので、BROWSER 環境変数で指定したブラウザーでのみテストが実行されるように設定されるように、テスト スイートがセットアップされる前に呼び出されることを確認する必要があります。Sauce\Sausage\WebDriverTestCase によって消費される PHPUnit_Extensions_Selenium2TestCase を見てみましょう。PHPUnit_Extensions_Selenium2TestCase は、次のメソッドを定義します。

public static function suite($className)
{   
    return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
} 

このメソッドは、$browsers 配列で指定したすべてのブラウザーでテスト スイートをセットアップするために呼び出されます。そのため、抽象テスト クラスでこのメソッドをオーバーライドする必要があります。

public static function suite($className)
{   
    self::browserSetup();
    return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
} 

ここで、テストしたいブラウザーで環境変数 BROWSER を定義すると、テスト スイートを開始でき、$browsers 配列は、BROWSER 環境変数で定義された単一のブラウザーに指定した設定で適切にオーバーライドされます。Build->Execute shellセクションでjenkinsがこの環境変数を適切に設定していることを確認してください。

于 2013-07-30T00:42:31.353 に答える
1

わかりましたので、これを解決しました。他の誰かが同じ問題を抱えている場合、これが私が解決した方法です。

Jenkins が実行し、PHPUnit を実行する ANT スクリプトに、config.xml ファイルを含めました。sauceこれにより、呼び出される構成 (環境) 変数が設定されます。true

<phpunit> 
    <php>
        <env name="sauce" value="true" />
    </php>
</phpunit>

ここでのコツは、実際には $browsers 静的配列を使用するのではなく、setupSpecificBrowserメソッドを使用することです。したがって、テストの setUp() 関数で、source env 変数をオンにするだけで、それが存在する場合は、Jenkins から実行していることがわかるので、そこから提供された変数を使用します。

    if( getenv('sauce') == true) {
        $browser =  array(
                'browserName' => getenv('SELENIUM_BROWSER'),
                'desiredCapabilities' => array(
                        'version' => getenv('SELENIUM_VERSION'),
                        'platform' => getenv('SELENIUM_PLATFORM'),
                )
        );
    } else {
        $browser =  array(
                'browserName' => 'firefox',
                'local' => true,
                'sessionStrategy' => 'isolated'
        );
    }
    $this->setupSpecificBrowser($browser);

私の知る限り、これに関するドキュメントはないようです。コードを見てから作業しました。楽しい。

于 2012-12-22T09:45:35.537 に答える
0

また、事後にブラウザを設定すると、並列テストが停止することに注意してください。さらに、($browsers 静的配列で) 開始する 3 つの異なるブラウザーがあり、ブラウザーを chrome に設定すると、3 台のマシンで chrome が実行されます。

于 2013-06-18T15:15:07.140 に答える