2

最近、NUnit フレームワークを使用してブラウザー テストを実行するために、WebDriver (Selenium 1 を優先) の使用を開始しました。さまざまなブラウザーでテストを実行したいので、それぞれのドライバーを定義し、フィクスチャーのセットアップ中にそれらをリストに入れます。

[TestFixtureSetUp]
public void SetupTest()
{
    // Load drivers
    Drivers = new List<IWebDriver>
            {
                new ChromeDriver(),
                ...
            };

すべてのテストで、次のようにリストを反復処理します。

[Test]
public void SomeTest()
{
    foreach (var driver in Drivers)
    {
        driver.Navigate().GoToUrl("...");
...

すべてのテストメソッドでこれを行うのは間違っていると感じます。テスト メソッドは、どのドライバーで動作するかを気にする必要はありません。理想的には、次のようになります。

public void SomeTest(IWebDriver driver)
{
    driver.Navigate().GoToUrl("...");
...

これを解決する方法の 1 つは、TestCases を使用することです。

[TestCase(new ChromeDriver())]
[TestCase(new FireFoxDriver())]
...

しかし、これは多くの重複であり、ドライバーの正しい初期化の問題をすべてのテストの属性に移します。本当に利益ではありません。

テストのスイート全体を実行し、実行ごとに個々のテストに異なるパラメーターを挿入するように NUnit フレームワークに指示する方法はありますか? または、これに対する他の良い解決策はありますか?

4

3 に答える 3

6

TestCaseSourceAttributeを使用できるはずです。最初に、Web ドライバーのコレクションを提供する一般的にアクセス可能なクラスを作成します。

public static class WebDriverFactory
{
    public static IWebDriver[] Drivers =
    {
        new ChromeDriver(),
        new FirefoxDriver(),
        ...
    };
}

次に、Web ドライバーに依存する単体テストを次のように実装します。

[Test, TestCaseSource(typeof(WebDriverFactory), "Drivers")]
public void SomeTest(IWebDriver driver)
{
    driver.Navigate().GoToUrl("...");
    ...
}

必要に応じて、各単体テストを実装するときに入力を減らすために、から継承し、デフォルトのコンストラクターのみを実装する新しいAttributeクラスも定義します。TestCaseSourceAttribute

public class WebDriverSourceAttribute : TestCaseSourceAttribute
{
    public WebDriverSourceAttribute() : base(typeof(WebDriverFactory), "Drivers")
    {            
    }
}

inheritedWedDriverSource属性を使用して、単体テストを次のように簡略化できるようになりました。

[Test, WebDriverSource]
public void SomeTest(IWebDriver driver)
{
    driver.Navigate().GoToUrl("...");
    ...
}
于 2012-09-11T15:14:45.857 に答える
4

これを行う「最善の」方法はありませんが、私がこれを達成した方法は次のとおりです。

列挙型を作成しました:

/// <summary>
/// Enum that holds references to different browsers used in testing.
/// </summary>
public enum BrowserTypeEnum
{
    /// <summary>
    /// Google Chrome.
    /// </summary>
    Chrome, 

    /// <summary>
    /// Mozilla Firefox.
    /// </summary>
    Firefox, 

    /// <summary>
    /// Internet Explorer.
    /// </summary>
    InternetExplorer
}

次のように TestFixture で呼び出します。

/// <summary>
/// Tests related to browsing Google
/// </summary>
[TestFixture(BrowserTypeEnum.Chrome)]
[TestFixture(BrowserTypeEnum.Firefox)]
public class GoogleTests : AbstractTestFixture
{
}

AbstractTestFixture では:

    /// <summary>
    /// Create's the browser used for this test fixture. 
    /// <para>
    /// Must always be called as part of the test fixture set up.
    /// </para>
    /// <para>
    /// It is the actual test fixture's responsibility to launch the browser. (Usually in the test fixture setup)
    /// </para>
    /// </summary>
    protected override void CreateBrowser()
    {
        switch (BrowserType)
        {
            case BrowserTypeEnum.Chrome:
                Browser = new ChromeDriver();
                break;
            case BrowserTypeEnum.Firefox:
                Browser = new FirefoxDriver();
                break;
            case BrowserTypeEnum.InternetExplorer:
                Browser = new IEDriver();
                break;
            default:
                break;
        }
    }

最善の解決策ではないかもしれませんが、かなり読みやすいことがわかりました。別の方法は、Selenium Grid などを使用するか、ドライバーのタイプを NUnit に渡して直接作成することです。あなたはすでにこれを試しました(直接タイプのドライバーを渡します)が、あなたが求めているものではないようです。唯一の違いは、実際のテストではなく、ドライバーのタイプをテスト フィクスチャに渡すことです。

もう 1 つの方法は、CI サーバー ソリューションを使用する場合、構成設定を作成して、テストに使用するブラウザーを示すことです。CI ドライバーにテストを 3 回繰り返させ、そのたびにその構成設定を編集します。

私は同意します。彼らがどのような種類のドライバーを使用しているかを知ることは、実際のテストの責任ではありません。これが、私がその責任をテスト フィクスチャに押し上げた理由です。私がやっている方法は、最も「エレガントな」方法ではないかもしれませんが、少なくとも私にとっては最も読みやすい方法です。私のコードを見ている人は、このテスト フィクスチャが繰り返されていること、およびどのブラウザーがその手順を繰り返しているかを簡単に確認できます。

私にとっては、ドライバーの作成は常に実際の TestFixture (ベース テスト フィクスチャではなく) で行う必要があります。その理由は、ブラウザーを開く前に実行したいロジックが少しあるためです。このロジックが (Setup または TestFixtureSetup メソッドで) 失敗した場合、NUnit はティアダウン メソッドを実行しません。そのため、ブラウザ ウィンドウは開いたままになります。

これを改善するために、テストが実行される前に TestFixtureSetup で行う最後の処理は、"CreateBrowser" と呼ばれます。

于 2012-09-11T15:09:13.630 に答える