C# 在尝试并行运行测试时,如何正确传递webdriver?
我的工作任务是编写一个自动化框架,该框架包含带有c#/nunit的selenium webdriver。我们目前正在使用nunit 3.0。我最初的想法是提取足够多的框架内容,这样使用框架的团队就不必担心诸如设置/删除webdriver之类的问题 我们决定使用一个测试助手类,该类有一个setup/teardown,可以根据配置设置(chrome、ie等)实例化驱动程序,然后在每次测试后将其拆下。我们还添加了一个受保护的类驱动程序变量,该变量在调用安装程序时设置。这样,每个测试类都可以扩展TestHelper,并且可以免费获得驱动程序 当我们不并行运行测试时,这种方法非常有效,但当我们开始并行测试时,驱动程序每次都会被覆盖(这很有意义) 我的问题是,有没有更好的方法可以做到这一点,这样就可以保持在TestHelper中提供驱动程序的原始想法,并将大量的驱动程序操作排除在测试之外。我真的不想在每个测试中都有驱动程序声明/初始化,只想保留测试套件来测试特定的代码 下面是一些类似于正在发生的事情的测试类(我实际上无法发布生产代码,因为这方面的工作很有趣): 这是我的测试助手类:C# 在尝试并行运行测试时,如何正确传递webdriver?,c#,selenium,selenium-webdriver,nunit-3.0,C#,Selenium,Selenium Webdriver,Nunit 3.0,我的工作任务是编写一个自动化框架,该框架包含带有c#/nunit的selenium webdriver。我们目前正在使用nunit 3.0。我最初的想法是提取足够多的框架内容,这样使用框架的团队就不必担心诸如设置/删除webdriver之类的问题 我们决定使用一个测试助手类,该类有一个setup/teardown,可以根据配置设置(chrome、ie等)实例化驱动程序,然后在每次测试后将其拆下。我们还添加了一个受保护的类驱动程序变量,该变量在调用安装程序时设置。这样,每个测试类都可以扩展Test
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace AutomationTest
{
class TestHelper
{
protected IWebDriver driver;
[SetUp]
public void startBrowser()
{
driver = new ChromeDriver("C:\\Users\\james\\Desktop");
}
[TearDown]
public void closeBrowser()
{
driver.Close();
driver.Quit();
}
}
}
这是我的测试类(8个测试只是为了测试并行测试):
使用NUnit.Framework;
名称空间自动测试
{
类TestHelper
{
//受保护的IWebDriver;
受保护的无效浏览(操作)
{
var driver=new ChromeDriver(“C:\\Users\\james\\Desktop”);
行动(司机);
driver.Close();
driver.Quit();
}
[设置]
公共无效startBrowser()
{
//驱动程序=新的ChromeDriver(“C:\\Users\\james\\Desktop”);
}
[撕裂]
公共浏览器()
{
//driver.Close();
//driver.Quit();
}
}
[测试夹具]
[可并行化(ParallelScope.All)]
类ParallelTest:TestHelper
{
[测试]
公共void test1()
{
浏览((驱动程序)=>{
driver.Navigate().gotour(“http://www.google.com");
AreEqual(driver.Title,“Google”,“东西没用”);
});
}
[测试]
公共无效测试2()
{
浏览((驱动程序)=>{
driver.Navigate().gotour(“http://www.google.com");
AreEqual(driver.Title,“Google”,“东西没用”);
});
}
[测试]
公共无效测试3()
{
浏览((驱动程序)=>{
driver.Navigate().gotour(“http://www.google.com");
AreEqual(driver.Title,“Google”,“东西没用”);
});
}
[测试]
公共无效测试4()
{
浏览((驱动程序)=>{
driver.Navigate().gotour(“http://www.google.com");
AreEqual(driver.Title,“Google”,“东西没用”);
});
}
[测试]
公共无效测试5()
{
浏览((驱动程序)=>{
driver.Navigate().gotour(“http://www.google.com");
AreEqual(driver.Title,“Google”,“东西没用”);
});
}
[测试]
公共无效测试6()
{
浏览((驱动程序)=>{
driver.Navigate().gotour(“http://www.google.com");
AreEqual(driver.Title,“Google”,“东西没用”);
});
}
[测试]
公共无效测试7()
{
浏览((驱动程序)=>{
driver.Navigate().gotour(“http://www.google.com");
AreEqual(driver.Title,“Google”,“东西没用”);
});
}
[测试]
公共无效测试8()
{
浏览((驱动程序)=>{
driver.Navigate().gotour(“http://www.google.com");
AreEqual(driver.Title,“Google”,“东西没用”);
});
}
}
}
这将为每个测试实例化一个新的驱动程序,这很好,因为您需要单独的浏览器驱动程序和浏览器实例,以便您的测试能够并行运行且不受干扰。谢谢Cosmin!我正在尝试测试它,它在叫喊,因为Browse方法没有返回任何东西。我遗漏了什么吗?太好了,谢谢你,先生:)一旦我弄明白怎么做,我会把它标记为已回答。你真的要在一个方法调用中放入100行测试代码吗?这将是调试的噩梦,等等。什么方法有100行?我将它分为两个类:测试助手类和实际的测试套件类。如果使用页面对象模型,测试代码将分布在页面对象中,测试方法将包含主编排流。您可以进一步将其抽象为步骤/场景类,并将顶层代码减少到只调用特定测试场景的几行代码。简言之,你不必把所有的东西都写在动作中。
using NUnit.Framework;
namespace AutomationTest
{
[TestFixture]
[Parallelizable(ParallelScope.All)]
class ParallelTest : TestHelper
{
[Test]
public void test1()
{
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
}
[Test]
public void test2()
{
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
}
[Test]
public void test3()
{
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
}
[Test]
public void test4()
{
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
}
[Test]
public void test5()
{
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
}
[Test]
public void test6()
{
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
}
[Test]
public void test7()
{
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
}
[Test]
public void test8()
{
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
}
}
}
using NUnit.Framework;
namespace AutomationTest
{
class TestHelper
{
//protected IWebDriver driver;
protected void Browse(Action<IWebDriver> action)
{
var driver = new ChromeDriver("C:\\Users\\james\\Desktop");
action(driver);
driver.Close();
driver.Quit();
}
[SetUp]
public void startBrowser()
{
// driver = new ChromeDriver("C:\\Users\\james\\Desktop");
}
[TearDown]
public void closeBrowser()
{
// driver.Close();
// driver.Quit();
}
}
[TestFixture]
[Parallelizable(ParallelScope.All)]
class ParallelTest : TestHelper
{
[Test]
public void test1()
{
Browse( (driver) => {
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
});
}
[Test]
public void test2()
{
Browse( (driver) => {
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
});
}
[Test]
public void test3()
{
Browse( (driver) => {
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
});
}
[Test]
public void test4()
{
Browse( (driver) => {
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
});
}
[Test]
public void test5()
{
Browse( (driver) => {
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
});
}
[Test]
public void test6()
{
Browse( (driver) => {
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
});
}
[Test]
public void test7()
{
Browse( (driver) => {
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
});
}
[Test]
public void test8()
{
Browse( (driver) => {
driver.Navigate().GoToUrl("http://www.google.com");
Assert.AreEqual(driver.Title, "Google", "Stuff didn't work");
});
}
}
}