希望获得有关使我的测试可并行化的一些帮助。我有一个硒c#设置,它结合使用NUnit,C#和硒来在我的机器或CI服务器上本地顺序运行测试。
我之前已经研究过测试的并行化,但是无法进行跳转,并且按顺序运行很好。
当我添加NUnit [Parallelizable]标记时,我收到一个“ OpenQA.Selenium.WebDriverException:无效的会话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....
}
}
}
第二个.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.Ditto.AI.RioPlatform/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();
}
}
}
}
答案 0 :(得分:2)
所有测试都使用相同的驱动程序,该驱动程序在TestBase中定义为静态。这两个装置将并行运行,并且都将影响驱动器的状态。如果要使两个测试并行运行,则除了恒定值或只读值外,它们不能都使用相同的状态。
要做的第一件事是使驱动程序成为实例成员,以便每个派生的灯具都在不同的驱动程序上工作。如果仍然不能解决问题,那么至少可以将您带到解决方案的下一步。
答案 1 :(得分:1)
不要使用静态,这应该有助于解决您的问题
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();
}
}
}
答案 2 :(得分:0)
我看到TestBase的设置方法之上没有[Setup]
。造成无效的会话,是因为您试图关闭一个不存在的窗口。同时尝试将driver.close()
替换为driver.quit();
答案 3 :(得分:0)
您应在每次测试中分别调用驱动程序,否则,nunit将为所有实例仅打开一个驱动程序。希望这对你有意义。