提问者:小点点

specflow插件与nunit和TFS构建


我正在尝试让specflow UI测试与TFS构建一起工作,我已经非常非常接近了。

我希望能够在多个浏览器上运行相同的测试,因此经过一些研究,我发现:

http://www.baseclass.ch/blog/lists/beitraege/post.aspx?id=4&mobile=0

对于本地的测试来说,它的工作就像做梦一样。下一步是在TFS2010构建期间调用selenium网格。

在将nunit community build任务添加到我的构建模板中之后,我现在遇到了一个似乎无法解决的错误。生成报告以下错误:

错误:系统找不到指定的文件。堆栈跟踪:在D:\Projects\CodePlex\TeamBuild2010Contrib\CustomActivities\Legacy\VS2010\Source\Activities\CodeQuality\NUnit\nUnit.cs:D:\Projects\CodePlex\TeamBuild2010Contrib\CustomActivities\CodeQuality\nUnit.cs:TfsBuildExtensions.Activities.CodeQuality.nUnit.PublishmStestResults(String ResulttTrxFile,String collectionUrl,String buildNumber,D:\Projects\CodePlex\TeamBuild2010Contrib\CustomActivities\Legacy\VS2010\Source\Activities\CodeQuality\nUnit\nUnit.cs:d:\Projects\CodePlex\TeamBuild2010Contrib\CustomActivities\Legacy\VS2010\Source\Common\BaseCodeActivity.cs:67行中tfsBuildExtensions.Activities.BaseCodeActivity.execute中的ternalExecute()第299行。

然而,这似乎掩盖了一个更深层次的错误,因为在我看来,它只是说nunit不能加载自定义程序集。因此,我查看了构建服务器上的binaries文件夹中的nunit日志,在我的test run.xml文件中,我确实发现了另一个错误:

System.Configuration.ConfigurationErrorsException:找不到类型“Openqa.Selenium.Remote.RemoteWebDriver,BaseClass.Contrib.SpecFlow.Selenium.NUnit.SpecFlowPlugin”。它可能需要程序集限定,例如“MyType,MyAssembly”。

在Autofac.Configuration.ConfigurationRegistrar.LoadType(String typeName,Assembly defaultAssembly)在Autofac.Configuration.ConfigurationRegistrar.RegisterConfigurredComponents(ContainerBuilder builder,SectionHandler configurationSection)在Autofac.Configuration.core.ConfigurationModule.Load(ContainerBuilder builder)在Autofac.Module.Configuration(IComponentRegistry componentRegistry,Boolean

由此,我开始查看自定义程序集的路径。这是在项目的app.config文件中指定的(该文件在构建过程中被转换。我还检查了该文件是否被转换,并且在构建服务器上的二进制目录中是这样)。文件的相关部分是这样的。

 <specFlow>
<stepAssemblies>
  <stepAssembly assembly="SpecFlow.Assist.Dynamic" />
  <stepAssembly assembly="Baseclass.Contrib.SpecFlow.Selenium.NUnit.Bindings" />
</stepAssemblies>
<unitTestProvider name="SeleniumNUnit" />
<plugins>
  <add name="Baseclass.Contrib.SpecFlow.Selenium.NUnit" path="..\packages\Baseclass.Contrib.SpecFlow.Selenium.NUnit.1.2.0\tools" />
</plugins>

null

在本地工作。我想我只需要更改转换文件中的路径。一开始,我假设工作目录是二进制目录,因此在转换文件中我有以下内容:

<specFlow>
<plugins xdt:Transform="Replace">
  <add name="Baseclass.Contrib.SpecFlow.Selenium.NUnit" path="." />
</plugins>

null

dll在同一个目录(二进制文件)中,所以我尝试了“。”,“。”,“。”-这些都不起作用。因此,经过更多的思考和更仔细地阅读错误之后,我认为我需要查看构建服务器上的Sources文件夹。Dll在packages文件夹中(nuget package restore),因此路径应该与我在本地使用的路径相同。这也不管用。那么相对于抛出错误的“。feature”文件的路径呢?这只是需要一个额外的“。。。”--还是没有运气。

所以我有点不知所措,我觉得我已经尝试了我能想到的所有途径,但是我对specflow插件和TFS构建的知识让我失望了。有人能给我指点一下吗?


共2个答案

匿名用户

但是最初的错误基本上是说TFSs nunit支持在调用CreateProcess时找不到文件,正如您所说的,它适用于本地测试运行,那么它是不是就像运行测试的机器上没有安装nunit那么简单?

匿名用户

我终于到了!

因此,按照设置的思路,我在app.config中得到了如下内容:

 <component
          name="IE"
          type="Baseclass.Contrib.SpecFlow.Selenium.NUnit.RemoteWebDriver, Baseclass.Contrib.SpecFlow.Selenium.NUnit.SpecFlowPlugin"
          service="OpenQA.Selenium.Remote.RemoteWebDriver, WebDriver"
          instance-scope="per-dependency">
    <parameters>
      <parameter name="browser" value="InternetExplorer" />
      <parameter name="url" value="http://192.168.1.3:4444/wd/hub" />
    </parameters>
  </component>

问题(正如它在错误中所说的)是它找不到openqa.selenium.remote.RemoteWebDriver。我相信我在bassclass页面上找到的一个例子中看到了这一点。在将其更改为openqa.selenium.IWebDriver之后,一切都运行良好,nUnit能够在TFS 2010 build服务器上运行specFlow测试。我遇到了另一个问题,当构建试图解析结果时,它试图使用MSTest 11而不是10(因为我使用的是VS2012,所以有问题)。然而,这台TFS机器只是一个概念验证,是运行在windows 7上的虚拟PC上的windows 2008 32位版本。(我可能无法运行64位,因此无法在构建服务器上安装VS2012)。我通过为MStest 11创建一个新的环境变量并将其指向MStest 10来解决这个问题。整个过程现在运行得很完美。