我正在尝试让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构建的知识让我失望了。有人能给我指点一下吗?
但是最初的错误基本上是说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来解决这个问题。整个过程现在运行得很完美。