1

Seleniumを使用してWebアプリケーションをテストするNUnitテストケースを作成しました。そして、異なる環境(QA、ステージング、本番など)に対して同じテストケースを実行したいと思います。それを達成するための最も簡単な方法は何ですか?

4

2 に答える 2

5

NUnitは、パラメータ化されたテストフィクスチャとパラメータ化されたテストをサポートします。それで、最初に、異なる環境に対して特定のテストを実行したいのでしょうか、それともテストフィクスチャ全体が両方の環境で再実行されるのでしょうか。

これに対する答えが、パラメータ(環境)を渡す場所を決定するので、私は尋ねます。テストフィクスチャ全体を再実行したいだけの場合は、テストフィクスチャレベルで環境を渡す必要があります。つまり、パラメータ化されたテストフィクスチャを作成します。それらの環境に対して特定のテストのみを実行する場合は、個々のテストケースに渡す必要があります。以下に、私が同じようなことを行った例を示します。

まず、テストが「アタッチできる」環境を定義する方法を作成します。おそらくこれをapp.configに押し込み、「Settings」クラスとそれに対応する列挙型を用意することをお勧めします。

public enum Environment
{
    QA,
    Production,
    Hotfix,
    Development
}

public class Settings
{   
    public static string QAUrl { get { return "some url"; } }

    public static string ProductionUrl { get { return "some url"; } }

    public static string HotfixUrl { get { return "some url"; } }

    public static string DevUrl { get { return "some url"; } }
}

上記の「いくつかのURL」は、構成ファイルから読み取られるか、ハードコーディングされますが、どうぞよろしくお願いします。

これで環境の概念ができました。これはURLですが、相互にリンクされたり、関連付けられたりすることはありません。理想的には、列挙型の「QA」値を指定すると、URLが分類されます。

次に、すべてのテストフィクスチャが継承できるベーステストフィクスチャを作成します。これにより、現在の環境が保持されます。また、環境値をそのURLに関連付けるを作成しDictionaryます。

public class BaseTestFixture
{
    private Dictionary<Environment, string> PossibleEnvironments 
    {
        get
        {
            return new Dictionary<Environment, string>()
            {
                { Environment.QA, Settings.QAUrl },
                { Environment.Production, Settings.ProductionUrl },
                { Environment.Hotfix, Settings.HotfixUrl },
                { Environment.Development, Settings.DevelopmentUrl },
            }
        }
    }

    private Environment CurrentEnvironment { get; set; }

    public BaseTestFixture(Environment environment)
    {
        CurrentEnvironment = environment;
    }
}

おそらく、Reflectionを使用して、どのURLがどのenum値にマップされているかを判断することができます。

とてもかっこいい、私たちは私たちが立ち向かうことができる環境を持っています。管理者としてサイトにログインするためのサンプルテスト:

public class LoginToSite
{
    [Test]
    public void CanAdministratorSeeAdministratorMenu()
    {
        // go to the site
        driver.Navigate().GoToUrl("production site");
        // login as administrator
    }
}

これを特定のURLに移動するにはどうすればよいですか?基本クラスを少し変更してみましょう...

public class BaseTestFixture
{
    private Dictionary<Environment, string> PossibleEnvironments 
    {
        get
        {
            return new Dictionary<Environment, string>()
            {
                { Environment.QA, Settings.QAUrl },
                { Environment.Production, Settings.ProductionUrl },
                { Environment.Hotfix, Settings.HotfixUrl },
                { Environment.Development, Settings.DevelopmentUrl },
            }
        }
    }

    private Environment CurrentEnvironment { get; set; }

    protected string CurrentEnvironmentURL 
    { 
        get 
        { 
            string url;
            if (PossibleEnviroments.TryGetValue(CurrentEnviroment, out url))
            {
                return url;
            }

            throw new InvalidOperationException(string.Format("The current environment ({0}) is not valid or does not have a mapped URL!", CurrentEnviroment));
        }
    }

    public BaseTestFixture(Environment environment)
    {
        CurrentEnvironment = environment;
    }

            public BaseTestFixture()
            {
            }
}

私たちの基本クラスは、私たちがいる環境に応じて、どのページに移動するかを教えてくれます...

これで、ベースから継承したこのテストができました。

public class LoginToSite : BaseTestFixture
{
    [Test]
    public void CanAdministratorSeeAdministratorMenu()
    {
        // go to the site
        driver.Navigate().GoToUrl(CurrentEnvironmentURL);
        // login as administrator
    }
}

しかし、それは素晴らしいことですが、上記はコンパイルされません...なぜですか?実際にはまだ環境を提供していないので、1つ渡す必要があります...

[TestFixture(Environment.QA)]
public class LoginToSite : BaseTestFixture
{
    [Test]
    public void CanAdministratorSeeAdministratorMenu()
    {
        // go to the site
        driver.Navigate().GoToUrl(CurrentEnvironmentURL);
        // login as administrator
    }
}

これは素晴らしいことです。環境が渡され、URLのチェックなどがすべてバックグラウンドで実行されるようになりました...ただし、これはまだコンパイルされません。継承を使用しているので、継承を渡すためのコンストラクターが必要です。

    public LoginToSite(Environment currentEnvironment)
    {
        CurrentEnvironment = currentEnvironment;
    }

Etvoilà。

特定のテストケースに関しては、これは少し簡単です。以前のテストケースを使用します。

public class LoginToSite
{
    [TestCase(Environment.QA)]
    public void CanAdministratorSeeAdministratorMenu(Environment environment)
    {
        // go to the site
        driver.Navigate().GoToUrl("production site");
        // login as administrator
    }
}

これは、環境をその特定のテストケースに渡します。次に、環境チェックを行うために、ある種の新しいSettingsクラスが必要になります(以前と同様の方法で)。

public class EnvironmentHelper
{
    private static Dictionary<Environment, string> PossibleEnvironments 
    {
        get
        {
            return new Dictionary<Environment, string>()
            {
                { Environment.QA, Settings.QAUrl },
                { Environment.Production, Settings.ProductionUrl },
                { Environment.Hotfix, Settings.HotfixUrl },
                { Environment.Development, Settings.DevelopmentUrl },
            }
        }
    }

    public static string GetURL(Environment environment)
    {
        string url;
        if (PossibleEnviroments.TryGetValue(environment, out url))
        {
            return url;
        }

        throw new InvalidOperationException(string.Format("The current environment ({0}) is not valid or does not have a mapped URL!", environment));
    }
}
于 2013-03-27T12:53:58.603 に答える
0

最善の方法は、すべての関数にハードコードされたリンクの代わりに変数を使用することです。環境を変更する必要があるときに変更できるようにします。より簡単なアプローチは、メモ帳/Excelファイルからリンクを読み取ることです。

于 2013-03-27T03:58:24.307 に答える