Selenium NUnit并行测试重用浏览器实例

时间:2017-05-23 18:32:07

标签: c# multithreading selenium nunit

我使用C#和NUnit并行运行Selenium测试。当前运行测试的方式最多可以并行运行4个测试(可能还需要1或2个,具体取决于系统运行的核心数量),其余测试排队。一旦完成一个测试,就会运行排队测试。目前,排队测试不是打开新浏览器并在每次单独测试后关闭该浏览器,而是使用其中一个打开的浏览器。问题是当我在测试后处理驱动程序时,它会关闭浏览器,因此每个后续排队测试都会失败。

每个测试都在自己的类中,每个测试类都继承自SetupTeardown类。

我的问题是:有没有办法可以修改DriverFactory类或继承的SetupTeardown类,以便那些排队的测试不重用最初的四个测试浏览器实例?我真的希望每个测试都在Setup上打开自己的浏览器并在Teardown关闭。

这是我的驱动程序类:

    public class DriverFactory
    {

    private DriverFactory()
    {
        //Do nothing
    }

    private static DriverFactory instance = new DriverFactory();

    public static DriverFactory getInstance()
    {
        return instance;
    }

    ThreadLocal<IWebDriver> driver = BuildThreadLocal();

    private static ThreadLocal<IWebDriver> BuildThreadLocal()
    {
        return new ThreadLocal<IWebDriver>(() =>
        {
                return new ChromeDriver(PathToChromeDriver);
        });
    }

    public IWebDriver getDriver()
    {
        return driver.Value;
    }

    public void removeDriver()
    {
        driver.Value.Dispose();
    }


}

这是我的SetupTeardown类,每个测试类都继承自:

    [TestFixture]
public class SetupTeardown
{
    public string testname;
    public IWebDriver driver;

    [OneTimeSetUp]
    public static void AssemblyInitialize()
    {
        //Code to initialize test reporting
    }


    [SetUp]
    public void Setup()
    {
        driver = DriverFactory.getInstance().getDriver();
        driver.Navigate().GoToUrl(url);
    }

    [TearDown]
    public void TearDown()
    {
        var status = TestContext.CurrentContext.Result.Outcome.Status;

        if (status == TestStatus.Failed)
        {
            //Code to add failure status to reporting
        }
        else
        {
            //Code to add pass status to reporting
        }

    }

    [OneTimeTearDown]
    public static void AssemblyCleanup()
    {
        //Code that aggregates test data run and places it in a report
    }

以下是我的测试类的设置方法:

    class TestClass1
{
    [Parallelizable]
    public class _TestClass1 : SetupTeardown
    {
        [Test]
        public void 
        {
            //Test code 

        }
    } 
}

1 个答案:

答案 0 :(得分:0)

我也使用TextFixture并使用OneTimeSetUp - 和OneTimeTearDown - 属性。

在OneTimeSetUp中,我打开浏览器并在OneTimeTearDown中关闭它。