データ駆動型のテストケースを使用したMbunit/Gallioによる並列テスト
-
30-10-2019 - |
質問
私はたくさん読んでいます RemoteWebDriver
Seleniumグリッドを使用したセレン2の場合。現時点では、私のテストはで生成されます Test()
を使用して [Test]
属性。
私は持っています TestCriteria
情報を入力してから、このデータがテストに入力される方法を「制御」する方法として、Selenium WebDriver「Page Object Design Pattern」を使用します。
したがって、たとえば、単純な基準オブジェクトがあります。
public class Credentials
{
public string Username { get; set; }
public string Password { get; set; }
}
次に、この情報をログインページオブジェクトで使用します。
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
}
}
現在、この種の構造により、テストデータ、資格情報オブジェクト、他のページに記入する必要があるデータなどがあると、テストでいくつかの優れたメソッドチェーンを作成できます。
[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();
しかし、これらの問題を無視して、私は本当にテストケースを複数回実行したいと思います...同時に。これにより、並行テストの問題になります。
MbunitがGallioの一部であるこれを処理できることを理解しています。また、Nunitの延長であるPunitを調べましたが、まだ長い道のりがあります。だから私はMbunitに固執することにしました。
これにより、属性を使用してtestfixturesを実行することができます [Parallelizable]
. 。したがって、プロジェクトをコンパイルしてプロジェクトにロードすると、Gallio TestRunner GUIに同時に4つのテストケースを実行できます。見返りに、各テストを同時に実行している4つのブラウザが開き、サイトにストレスをかけることもできます。 4つのテストがすべて実行されている間。 (明らかに、これは、セレングリッドを備えたセレンremotewebdriverを使用して、複数のマシンで数百のブラウザを実行するために増加します。
ここの誰かが、XMLシリアル化オブジェクトのコレクションをロードし、新しいtestfixtureオブジェクトを生成する方法を知っていますか? [Parallelizable]
属性はテストフィクスチャの上部に追加され、Aから1〜10 .xmlファイルをロードした後、それらはすべて同時に実行されます。たとえば、c: testcaseディレクトリ?
私のアイデアは、これらすべてをロードしてから、メインセレングリッドハブに接続された1〜5セレンノードを実行して、セレングリッドをブラウザセッションに処理させることです。
私は、私が生成できるフレームワークを見つけることができないときに、Seleniumグリッドを本当に利用するのに本当に困難を抱えています Test Fixture
, 、aを含む [SetUp]
[TearDown]
[Test]
テストケース.xmlファイルからロードされるものに応じて、特定のテスト条件をテスト属性に設定する機能。
たとえば、testcase .xmlファイルに故障した要素がある場合、この.xmlファイルをロードしてtestfixtureの[テスト]に属性を設定するにはどうすればよいか、テストのテストの.xml説明をテストにマッピングするにはどうすればよいですか。 [Test(Description = "")]
実行時に属性。
私はすでにSelenium WebDriver、Page Object Design Pattern、Seleniumの機能を知っています EventFiringWebDriver
スクリーンショットの機能。
複数のXMLシリアル化されたTestCasedataにロードする機能を利用して、これらがロードされた後に新しいTestFixtureオブジェクトを生成する方法をどのように利用できますか?
理想的には、各testfixtureの[セットアップ]をセットアップしたい IWebDriver
特定のURLはTestCase.xmlファイルに含まれるものによって異なるため、このテストの場合、UAT環境、テスト環境、プリプロダクション環境で実行されるため、テストを実行する前にこれをセットアップする必要があります。
複数のブラウザの実行のセレングリッド機能を利用してこれらのテストフィクスチャを並行して実行する機能を備えたSeleniumグリッド/セレンWebドライバーを使用して、これらの主要な概念を使用する基本的な例がありますか?
だから私が擬似コードで探しているもの。
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
}
}
たぶん私はこのデザインを間違った方法で行っています。これらを並列化するための最良の方法について何か提案はありますか?
正しい解決策はありません