テストを並列化可能にするためのヘルプを探しています。私は、NUnit、C#、Seleniumの組み合わせを使用して、自分のマシンまたはCIサーバーでローカルに順次テストを実行するSelenium c#セットアップを持っています。
私は以前にテストの並列化を調査しましたが、ジャンプすることができず、シーケンスで実行することは問題ありませんでした。
NUnit [Parallelizable]タグを追加した時点で、「OpenQA.Selenium.WebDriverException:invalid session id」エラーが発生しました。これは、行った読み取りに基づいて、呼び出す各ドライバーを一意にする必要があります。ただし、これを行う方法がわかりませんか?それとも、そのことについて始めましょう...これは私の現在のセットアップ内でも可能ですか?
私のテストは現在限られたスモークテストを行っており、複数のブラウザーに対する反復回帰テストを削除しているだけですが、テスト機能の範囲を大幅に拡大する必要があると考えています。
私はおそらく長期的にはBrowserstackまたはSauselabを取得することを検討していますが、明らかに資金調達が必要であり、サインオフする必要があるため、今のところローカルで実行することを検討しています。
ここに私のコードの基本的なセットアップを見てください
テストファイル:
最初の.csテストファイル
{
[TestFixture]
[Parallelizable]
public class Featur2Tests1 : TestBase
{
[Test]
[TestCaseSource(typeof(TestBase), "TestData")]
public void test1(string BrowserName, string Environment, string System)
{
Setup(BrowserName, Environment, System);
//Run test steps....
}
[Test]
[TestCaseSource(typeof(TestBase), "TestData")]
public void test2(string BrowserName, string Environment, string System)
{
Setup(BrowserName, Environment, System);
//Run test steps....
}
}
}
2番目の.csテストファイル
{
[TestFixture]
[Parallelizable]
public class FeatureTests2 : TestBase
{
[Test]
[TestCaseSource(typeof(TestBase), "TestData")]
public void test1(string BrowserName, string Environment, string System)
{
Setup(BrowserName, Environment, System);
//Run test steps....
}
[Test]
[TestCaseSource(typeof(TestBase), "TestData")]
public void test2(string BrowserName, string Environment, string System)
{
Setup(BrowserName, Environment, System);
//Run test steps....
}
}
}
TestBase.csで各テストを設定
{
public class TestBase
{
public static IWebDriver driver;
public void Setup(string BrowserName, string Environment, string System)
{
Driver.Intialize(BrowserName);
//do additional setup before test run...
}
[TearDown]
public void CleanUp()
{
Driver.Close();
}
public static IEnumerable TestData
{
get
{
string[] browsers = Config.theBrowserList.Split(',');
string[] Environments = Config.theEnvironmentList.Split(',');
string[] Systems = Config.theSystemList.Split(',');
foreach (string browser in browsers)
{
foreach (string Environment in Environments)
{
foreach (string System in Systems)
{
yield return new TestCaseData(browser, Environment, System);
}
}
}
}
}
}
}
IEnumerable TestDataはconfig.resxと呼ばれるファイルから取得され、次のデータが含まれています。
これは、Driver.csでドライバーを作成する場所です。
{
public class Driver
{
public static IWebDriver Instance { get; set; }
public static void Intialize(string browser)
{
string appDirectory = Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.Parent.FullName;
string driverFolder = $"{appDirectory}/Framework.Platform/bin/debug";
if (browser == "Chrome")
{
ChromeOptions chromeOpts = new ChromeOptions();
chromeOpts.AddUserProfilePreference("safebrowsing.enabled", true);
chromeOpts.AddArgument("start-maximized");
chromeOpts.AddArgument("log-level=3");
Instance = new ChromeDriver(driverFolder, chromeOpts);
}
else if (browser == "IE")
{
var options = new InternetExplorerOptions { EnsureCleanSession = true };
options.AddAdditionalCapability("IgnoreZoomLevel", true);
Instance = new InternetExplorerDriver(driverFolder, options);
Instance.Manage().Window.Maximize();
}
else if (browser == "Edge")
{
EdgeOptions edgeOpts = new EdgeOptions();
Instance = new EdgeDriver(driverFolder, edgeOpts);
Instance.Manage().Window.Maximize();
Instance.Manage().Cookies.DeleteAllCookies();
}
else if (browser == "Firefox")
{
FirefoxOptions firefoxOpts = new FirefoxOptions();
Instance = new FirefoxDriver(driverFolder, firefoxOpts);
Instance.Manage().Window.Maximize();
}
else { Assert.Fail($"Browser Driver; {browser}, is not currently supported by Initialise method"); }
}
public static void Close(string browser = "other")
{
if (browser == "IE")
{
Process[] ies = Process.GetProcessesByName("iexplore");
foreach (Process ie in ies)
{
ie.Kill();
}
}
else
{
Instance.Quit();
}
}
}
}
すべてのテストで、TestBaseで静的として定義されている同じドライバーを使用します。 2つのフィクスチャは並行して実行され、どちらもドライバーの状態に影響します。 2つのテストを並行して実行する場合、定数または読み取り専用の値を除いて、両方が同じ状態を使用することはできません。
最初にすることは、ドライバーをインスタンスメンバーにして、派生した各フィクスチャが異なるドライバーで動作するようにすることです。それでも問題が解決しない場合は、少なくとも次のステップに進みます。
静的を使用しないでください。これは問題の解決に役立ちます。
public IWebDriver Instance { get; set; }
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace Nunit_ParalelizeTest
{
public class Base
{
protected IWebDriver _driver;
[TearDown]
public void TearDown()
{
_driver.Close();
_driver.Quit();
}
[SetUp]
public void Setup()
{
_driver = new ChromeDriver();
_driver.Manage().Window.Maximize();
}
}
}
TestBaseのセットアップメソッドの上に_[Setup]
_がないようです。存在しないウィンドウを閉じようとしているため、無効なセッションが発生しています。また、driver.close()
をdriver.quit();
に置き換えてみてください