1

私は、RemoteWebDriverSelenium Grid を使用して Selenium 2 について多くのことを調べてきました。現時点では、属性Test()を使用してテストが生成されています。[Test]

クラスにTestCriteria情報を入力し、このデータをテストに入力する方法を「制御」する方法として、Selenium WebDriver の「ページ オブジェクト デザイン パターン」を使用します。

したがって、次のような単純な基準オブジェクトがあります。

public class Credentials
{ 
    public string Username { get; set; } 
    public string Password { get; set; }
}

次に、この情報を LoginPage オブジェクトで使用します。

public class LoginPage
{
    [FindsByAnnotation]
    public IWebElement UsernameField { get; set; }

    [FindsByAnnotation]
    public IWebelement PasswordField { get; set; }

    [FindsByAnnotation]
    public IWebelement SubmitButton { get; set; }

    public HomePage Login(Credentials cred)
    {
         UsernameField.SendKeys(cred.user);
         // code for login and return new HomePage object
    }
}

さて、この種の構造を使用して、テスト データ、Credentials オブジェクト、他のページで入力する必要があるデータなどを取得したら、テストで適切なメソッド チェーンを作成できます。

[TestFixture]
public class TestFixture
{
     private IWebDriver driver;
     private TestCaseData data; // Which contains a Credentials object etc etc

     [SetUp]
     public void SetUp()
     {
         data = new TestCaseData() 
         { 
              Credentials = new Credentials() 
              { 
                   Username = "username", 
                   Password = "password"
              }
             // Other test case data objects can be populated here 
         };

         driver = new FireFoxDriver();
     }

     [Test]
     public void Test()
     {
          new LoginPage().Login(data.Credentials)
                         .NavigateToSearchPage()
                         .EnterSearchCriteria(data.SearchCritiera)
          // etc
     }

}

これで問題ありませんが、XML から逆シリアル化できるシリアル化された TestData オブジェクトからこのテスト データをロードしたい場合はどうすればよいでしょうか。

を使用することにも興味がRemoteWebDriverありますが、これは既に使用していますが、単に を使用するのに比べてまだIWebDriver driver = new FireFoxDriver();不安定ですが、これらの問題を無視して、 TESTCASE を複数回実行したいと思います...同時に。これにより、並列テストの問題が発生します。

MBUnit は Gallio の一部であるこれを処理できることを理解しています。Nunit の拡張である PUnit も調べましたが、まだ長い道のりがあります。だから私はMbUnitに固執することにしました。

これにより、属性で TestFixtures を実行できるようになります[Parallelizable]。したがって、プロジェクトをコンパイルし、プロジェクト dll を Gallio TestRunner GUI にロードすると、4 つのテスト ケースを同時に実行できます。これにより、各テストを同時に実行する 4 つのブラウザーが開き、サイトに負荷をかけることもできます。 4 つのテストがすべて実行されている間。(明らかに、これは、Selenium Grid で Selenium RemoteWebDriver を使用して、複数のマシンで数百のブラウザーを実行するために増加します。

[Parallelizable]xml シリアル化されたオブジェクトのコレクションをロードし、テスト フィクスチャの上部に属性を追加して、ロード後にすべてを同時に実行できる新しい TestFixture オブジェクトを生成する方法を知っている人はいますか1 - 10たとえば、C:\TestCase ディレクトリの .xml ファイル?

私の考えは、これらをすべてロードしてから、メインのセレン グリッド ハブに接続されて実行されている 1 ~ 5 つの Selenium ノードでブラウザ セッションを Selenium Grid に処理させることです。

TestCase .xml からロードされる内容に応じて、特定のテスト条件をテスト属性に設定する機能をTest Fixture含むを生成できるフレームワークが見つからない場合、Selenium Grid を実際に活用するのが困難です。[SetUp] [TearDown] [Test]ファイル。

たとえば、TestCase .xml ファイルに失敗した要素が含まれている場合、この .xml ファイルをロードして TestFixture の [Test] に属性を設定する方法、またはテストの TestCase .xml Description を[Test(Description = "")]属性にマップする方法を教えてください。実行時間。

Selenium Webdriver の機能、ページ オブジェクトのデザイン パターン、EventFiringWebDriverスクリーンショットの Selenium 機能については既に知っています。

いくつかの XML シリアル化された TestCaseData をロードし、これらがロードされた後に新しい TestFixture オブジェクトを生成する機能を利用するにはどうすればよいですか?

理想的には、各 TestFixture の [SetUp] をセットアップする必要があります。IWebDriverこれは、特定の URL が TestCase.xml ファイルに含まれるものに応じて異なるためです。たとえば、このテストは UAT 環境、テスト環境、本番前の環境で実行することです。テストを実行する前にこれをセットアップする必要があります。

複数のブラウザを実行するSelenium Grid機能を利用するために、これらのテストフィクスチャを並行して実行する機能を備えたSelenium Grid / Selenium WebDriverでこれらの主な概念を使用する基本的な例はありますか?

だから私は疑似コードで探しているもの。

public class Main()
{
   // Load Testfixtures
   List<TestCase> testCases = Deserialise("\\Some\\FolderLocation");

   foreach(test in testCases)
   { 
      // create NEW testFixture, not [Test]
      // ability to attach parallel TestFixture
   }  
}

[Testfixture]
[Parallelizable]
public class TestFixture
{

     public TestCase testCase { get; set; }
     public IWebDriver driver { get; set; }

     [SetUp]
     public void SetUp()
     {
         if(testCase.Environment == "UAT")
         {
             driver = new FireFoxDrive()
             driver.NavigateTo("http://localhost/uat/Login");
         }

         // What if the testCase.ShouldPass is false?

         // How can i generate my [Test] with ExpectedException?

     }

      [Test]
      public void Test()
      {
          // code here with page object method chaining passing in testCase data objects  
      }
}

多分私はこのデザインを間違った方法で行っています。これらを並列化するための最良の方法について何か提案はありますか?

4

2 に答える 2

1

これはどう?

public class TestCase
{
    public string Name { get; set; }
}

public static class TestCaseFactory
{
    public static IEnumerable<TestCase> TestCases()
    {
        yield return new TestCase { Name = "one" };
        yield return new TestCase { Name = "two" };
    }
}

[Factory(typeof(TestCaseFactory), "TestCases"), Parallelizable]
public class DataDrivenFixture
{
    private readonly TestCase testCase;

    public DataDrivenFixture(TestCase testCase)
    {
        this.testCase = testCase;
    }

    [SetUp]
    public void SetUp()
    {
        Console.WriteLine("SetUp " + testCase.Name);
    }

    [Test]
    public void Test()
    {
        Console.WriteLine("Test " + testCase.Name);
    }
}
于 2012-02-24T11:49:46.520 に答える
0

良い解決策。しかし、異なるブラウザで並行してテストを実行するのはどうでしょうか? [FixtureSetUp] で IWebDriver を初期化すると、ブラウザーが開いてテストが実行されますが、エラー (基本的に NoSuchElement) が発生します。

public static IEnumerable<TestCase> TestCases()
        {
            yield return new TestCase { Name = "internet explorer" };
            yield return new TestCase { Name = "firefox" };
        }

[FixtureSetUp]
        public void SetUp()
        {
            Console.WriteLine("SetUp " + testCase.Name);
            switch (testCase.Name)
            {
                case "internet explorer":
                    driver = new InternetExplorerDriver();
                    break;
                case "chrome":
                    driver = new ChromeDriver();
                    break;
                case "firefox":
                    driver = new FirefoxDriver();
                    break;
            }
        }
于 2012-05-15T10:22:45.580 に答える