简体   繁体   中英

Parallel test execution with SpecFlow, xUnit and Headless Chrome

I want to run some SpecFlow scenario tests in headless Chrome in parallel. I am using SpecFlow/xUnit and using Selenium to start up headless Chrome in my BeforeScenario method like this:

public class FeatureProperties : BaseSteps
{
    private static Object myLockObj = new Object();
    private static readonly Random Randomiser = new Random();

    private IObjectContainer Container { get; set; }

    public FeatureProperties(PageContext _context, IObjectContainer _container) : base(_context)
    {
        Container = _container;
    }

    [BeforeScenario]
    public void BeforeScenario()
    {
        var options = new ChromeOptions();
        options.AddArguments("--incognito", "--headless", "--window-size=1920,1080", "--disable-gpu", "--no-sandbox");

        options.AddArguments("--proxy-server='direct://'");
        options.AddArguments("--proxy-bypass-list=*");

        lock (myLockObj)
        {
            var rnd = Randomiser.Next(29700, 29900);
            Console.WriteLine("Randomised: " + rnd);
            var svc = ChromeDriverService.CreateDefaultService();
            svc.Port = rnd;
            svc.Start();
            Context.Driver = new ChromeDriver(svc, options);
        }
    }

I'm seeing this in the command line when I execute xunit.console.exe :

Starting ChromeDriver 2.37.543627 (63642262d9fb93fb4ab52398be4286d844092a5e) on port 29780
Only local connections are allowed.
Starting ChromeDriver 2.37.543627 (63642262d9fb93fb4ab52398be4286d844092a5e) on port 29780
Only local connections are allowed.
[1522066314.720][SEVERE]: bind() returned an error: Only one usage of each socket address (protocol/network address/port) is normally permitted. (0x2740)

I understand (?) that Chrome wants a different port to start up on, but I'm not sure how to configure that. Adding this did not help:

svc.Port = new System.Random().Next(29700, 29900);

For reference, here are the relevant parts of my packages.config:

<packages>
  <package id="Selenium.Support" version="3.11.0" targetFramework="net461" />
  <package id="Selenium.WebDriver" version="3.11.0" targetFramework="net461" />
  <package id="Selenium.WebDriver.ChromeDriver" version="2.37.0" targetFramework="net461" />
  <package id="SpecFlow" version="2.3.1" targetFramework="net461" />
  <package id="SpecFlow.xUnit" version="2.3.1" targetFramework="net461" />
  <package id="SpecFlow.xUnitAdapter" version="1.1.0" targetFramework="net461" />
  <package id="xunit" version="2.3.1" targetFramework="net461" />
  <package id="xunit.abstractions" version="2.0.1" targetFramework="net461" />
  <package id="xunit.analyzers" version="0.8.0" targetFramework="net461" />
  <package id="xunit.assert" version="2.3.1" targetFramework="net461" />
  <package id="xunit.core" version="2.3.1" targetFramework="net461" />
  <package id="xunit.extensibility.core" version="2.3.1" targetFramework="net461" />
  <package id="xunit.extensibility.execution" version="2.3.1" targetFramework="net461" />
  <package id="xunit.runner.visualstudio" version="2.3.1" targetFramework="net461" developmentDependency="true" />
</packages>

Try using one shared Random variable. new System.Random() initializes the Pseudo random number generator with the current time. In case of parallel execution, this can very well be the same time and Next will result in the same number for all calls.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM