使用 MSTEST 和 Selenium 在并行 Web 测试中中止线程

Posted

技术标签:

【中文标题】使用 MSTEST 和 Selenium 在并行 Web 测试中中止线程【英文标题】:Thread aborted in parallel web test with MSTEST and Selenium 【发布时间】:2012-07-28 15:03:46 【问题描述】:

我在最后一英里让这个工作。

通过更改 Local.testsettings 中的 parallelTestCount 设置,我的测试项目中同时运行了多个测试:

  <Execution parallelTestCount="5">
    <TestTypeSpecific />
    <AgentRule name="Execution Agents">
    </AgentRule>
  </Execution>

我安装了修补程序 KB2619410 来解决 VS 中的并行测试问题。

UnitTesting.AssemblyInitialize() 中,我启动了 Selenium Server 集线器和节点。我在UnitTesting.AssemblyCleanup() 中杀死了这些进程。

java -jar C:\...\selenium-server-standalone-2.25.0.jar -role hub
java -jar C:\...\selenium-server-standalone-2.25.0.jar -role node -hub http://localhost:4444/grid/register -browser browserName=chrome,maxInstances=5,platform=WINDOWS

我产生 5 个线程来创建 RemoteWebDriver 实例并登录到我的网站

    Dim desiredCapabilities As Remote.DesiredCapabilities = Remote.DesiredCapabilities.Chrome()
    Dim size As String = "--window-size=0,1"
    size = String.Format(size, browserWidth, browserHeight)
    Dim position As String = "--window-position=0,1"
    position = String.Format(position, browserWidth * index, 0)
    desiredCapabilities.SetCapability("chrome.switches", size, position)
    driver = New Remote.RemoteWebDriver(New System.Uri("http://localhost:4444/wd/hub"), desiredCapabilities)
    ...
    ...code to use driver to log into web site

我加入了线程,以便在它们全部登录之前不会开始测试。我创建了一个 DriverPoolManger 类来将可用的 Web 驱动程序分配给等待测试。每当我检查驱动程序是否可用或更改其状态时,我都会使用 ReaderWriterLock:

    _readerWriterLock.AcquireWriterLock(Threading.Timeout.Infinite)
    _locks(index) = False
    _readerWriterLock.ReleaseWriterLock()

此时,它并行运行了一段时间的测试,然后失败:

Type is not resolved for member 'OpenQA.Selenium.WebDriverException,WebDriver, Version=2.16.0.0, Culture=neutral, PublicKeyToken=1c2bd1631853048f'. 

经过一番研究,解决方案是将它要查找的 dll 复制到名为“C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\UnitTestAssemblies”的新文件夹中,然后更新 QTAgent32.exe .config 在 privatePath 中列出:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <probing privatePath="PrivateAssemblies;PublicAssemblies;DataCollectors;DataCollectors\x64;PrivateAssemblies\DataCollectors;PrivateAssemblies\DataCollectors\x64;UnitTestAssemblies;"/>
</assemblyBinding>

现在,测试运行了一段时间,然后我的UnitTesting.AssemblyCleanup() proc 意外运行并杀死了所有浏览器和 Selenium 服务器。 VSTTExecution 记录以下错误:

(QTAgent32.exe, PID 8444, Thread 15) Unit Test Adapter threw exception: System.Threading.ThreadAbortException: Thread was being aborted.
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.RunTestMethod()
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.ExecuteTest()
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.Execute(UnitTestResult result)
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestRunner.ExecuteSingleTest(UnitTestExecuter executer, UnitTestElement test, ITestContext testContext, UnitTestAdapterContext userContext, Boolean isLoadTest)
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestRunner.Run(UnitTestElement test, ITestContext testContext, Boolean isLoadTest, Boolean useMultipleCpus)

我将在没有驱动程序池的情况下尝试它,但这意味着启动一个新驱动程序并为每次测试登录。我在多线程方面没有大量经验,而且 VS 中的并行测试似乎存在很多问题。我的驱动程序池会导致这种情况吗?

更新: 我删除了我的驱动程序池,但仍然出现此问题。

【问题讨论】:

【参考方案1】:

我几乎放弃了,但这里是解决方案:

mstest /noisolation

这完全消除了 qtagent32.exe,从那以后我就再也没有遇到过问题。

【讨论】:

以上是关于使用 MSTEST 和 Selenium 在并行 Web 测试中中止线程的主要内容,如果未能解决你的问题,请参考以下文章

使用 selenium TestNG 和 selenium 进行并行测试

在Python中使用Selenium进行并行化

使用 selenium 的 Python 并行执行

在页面中找不到控件,但仅在通过 selenium-server 运行时

Selenium 网格 - 测试不是并行运行,而是在每个模拟器上运行两次

在 Azure 批处理上运行 Selenium 并行测试