如何使用Nunit,C#-ThreadSafe驱动程序在单个类中运行并行测试方法

时间:2017-09-13 17:17:28

标签: c# .net selenium selenium-webdriver nunit

我是C#的新手,我无法使驱动程序线程安全。我可以在第二个浏览器打开后立即打开两个浏览器,第一个驱动程序丢失其引用。

下面是我的代码我有三个班级

namespace TestAutomation{
[TestFixture]
[Parallelizable(ParallelScope.Children)]
public class UnitTest1 : Setup
{
    [Test, Property("TestCaseID","123")]
    public void TestMethod1(this IWebDriver driver1)
    {
        driver1.Navigate().GoToUrl("https://www.google.com");
        driver1.FindElement(By.Name("q")).SendKeys("test1");
        Thread.Sleep(10000);
    }


    [Test, Property("TestCaseID", "234")]
    public void TestMethod2()
    {
        driver.Navigate().GoToUrl("https://www.google.com");
        driver.FindElement(By.Name("q")).SendKeys("test2");
        Thread.Sleep(15000);

    }
}}

设置类

namespace TestAutomation{
public class Setup:WebDriverManager
{


    [SetUp]
    public void  setupBrowser()
    {

        driver = new ChromeDriver("C:\\Users\\Downloads\\chromedriver_win32");


    }

    [TearDown]
    public  void CloseBrowser()
    {
        driver.Close();
        driver.Quit();
       // driver.Close();
        //driver.Quit;
    }
}}

Webdrivermanager

namespace TestAutomation{
 public class WebDriverManager
{
    public  IWebDriver driver { get; set; }
}
}

我正在寻找像ThreadLocal injava这样的解决方案,我可以在设置方法中获取并设置每个线程的驱动程序

2 个答案:

答案 0 :(得分:0)

你正在做两件相互矛盾的事情:

  1. 为每个测试使用新浏览器。
  2. 在测试之间共享浏览器属性。
  3. 你应该做一个或另一个。如果您想为每个测试创建一个新浏览器,请不要在其他测试也访问它的地方存储对它的引用。

    或者,使用FutureOneTimeSetUp并仅创建一次浏览器。但是,在这种情况下,您无法并行运行测试。

答案 1 :(得分:0)

删除SetUp& TearDown方法的属性并显式调用它们。当您使用这些方法属性时,它会开始在同一个类或继承类中的测试之间共享资源。

以下解决方案完美无缺。我开发了一个项目,您可以在其中并行执行浏览器测试(方法级并行化)。您可以根据需要修改项目。

项目链接:www.github.com/atmakur

[TestFixture]
class Tests
{
        [Test]
        public void Test1
        {
            using(var testInst = new TestCase())
            {
            testInst
               .Init()
               .NavigateToHomePage();
            }
        }
}

public class TestBase:IDisposable
{
        private IWebDriver BaseWebDriver;
        private TestContext _testContext;
        public NavigatePage Init()
        {
            _testContext = TestContext.CurrentTestContext;
            BaseWebDriver = new ChromeDriver();
            .
            .
            .
        }

        public override void Dispose()
        {
            //Kill Driver here
            //TestContext instance will have the AssertCounts
            //But The Testcontext instance will have the result as Inconclusive.
        }
}