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

如何使用Nunit,C#-线程安全驱动程序在单个类中运行并行测试方法,c#,.net,selenium,selenium-webdriver,nunit,C#,.net,Selenium,Selenium Webdriver,Nunit,我是C#新手,我无法使驱动程序线程安全。我能够在第二个浏览器打开时立即打开两个浏览器,第一个驱动程序将丢失其引用 下面是我的代码,我有三个类 namespace TestAutomation{ [TestFixture] [Parallelizable(ParallelScope.Children)] public class UnitTest1 : Setup { [Test, Property("TestCaseID","123")] public void TestMeth

我是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这样的解决方案,在这里我可以在设置方法中获取并设置每个线程的驱动程序

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

  • 为每个测试使用新浏览器
  • 在测试之间共享浏览器属性
  • 你应该这样做或那样做。如果要为每个测试创建新浏览器,请不要在其他测试也访问它的位置存储对它的引用


    或者,使用
    OneTimeSetUp
    onetimeeardown
    只创建一次浏览器。但是,在这种情况下,您不能并行运行测试。

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

  • 为每个测试使用新浏览器
  • 在测试之间共享浏览器属性
  • 你应该这样做或那样做。如果要为每个测试创建新浏览器,请不要在其他测试也访问它的位置存储对它的引用


    或者,使用
    OneTimeSetUp
    onetimeeardown
    只创建一次浏览器。但是,在这种情况下,您不能并行运行测试。

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

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

    项目链接:


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

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

    项目链接:


    是的,但我想运行并行测试,这是我的项目需求。所以不可能并行运行测试用例?还有其他方法可以使所有测试用例并行运行并且驱动程序线程安全吗?那么请使用我的第一个建议。停止使用公共属性存储当前驱动程序,因为您有两个不同的“当前”驱动程序。是的,但我想运行并行测试,这是我的项目要求。所以不可能并行运行测试用例?还有其他方法可以使所有测试用例并行运行并且驱动程序线程安全吗?那么请使用我的第一个建议。停止使用公共属性存储当前驱动程序,因为您有两个不同的“当前”驱动程序。
    [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.
            }
    }