我需要知道如何告诉MSTEST到溶液中的文件中运行所有测试项目。 这需要通过命令行来完成。 现在,我要传递一个特定的项目文件,我试图把它从一个解决方案文件运行。
我希望这是可能的,因为在Visual Studio中,按Ctrl + R,A,运行在当前打开的解决方案的所有测试。
我interpretted的帮助文件的方式,你必须在每个DLL传递明确。
我想从从我CruiseControl.NET服务器的命令行中运行这个,所以我可以写其他工具来实现这一目标。 如果没有得到这个通过其他方法发生的一个奇怪的方式,让我知道。
我如何告诉MSTEST运行一个解决方案的所有测试项目?
<exec>
<!--MSTEST seems to want me to specify the projects to test -->
<!--I should be able to tell it a SOLUTION to test!-->
<executable>mstest.exe</executable>
<baseDirectory>C:\projects\mysolution\</baseDirectory>
<buildArgs>/testcontainer:testproject1\bin\release\TestProject1.dll
/runconfig:localtestrun.Testrunconfig
/resultsfile:C:\Results\testproject1.results.trx</buildArgs>
<buildTimeoutSeconds>600</buildTimeoutSeconds>
</exec>
为了阐述VladV的答案,使事情更加具体,运行测试,可以很容易地与自动化建议的命名惯例以下的MSBuild 。 从我的当前项目的MSBuild的文件下面的代码片段做了你问什么。
<Target Name="GetTestAssemblies">
<CreateItem
Include="$(WorkingDir)\unittest\**\bin\$(Configuration)\**\*Test*.dll"
AdditionalMetadata="TestContainerPrefix=/testcontainer:">
<Output
TaskParameter="Include"
ItemName="TestAssemblies"/>
</CreateItem>
</Target>
<!-- Unit Test -->
<Target Name="Test" DependsOnTargets="GetTestAssemblies">
<Message Text="Normal Test"/>
<Exec
WorkingDirectory="$(WorkingDir)\unittest"
Command="MsTest.exe @(TestAssemblies->'%(TestContainerPrefix)%(FullPath)',' ') /noisolation /resultsfile:$(MSTestResultsFile)"/>
<Message Text="Normal Test Done"/>
</Target>
此外使用CruiseControl集成的MSBuild是一块蛋糕。
编辑
下面是你可以从你的ccnet.config“叫”的MSBuild。
首先,如果你还没有使用的MSBuild为您构建自动化周围添加前面介绍的片段以下XML:
<Project DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
..... <insert snippet here> .....
</Project>
在如保存此RunTests.proj
旁边源代码树的解决方案。 现在,你可以修改的位ccnet.config
以上为以下内容:
<msbuild>
<executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
<workingDirectory>C:\projects\mysolution\</workingDirectory>
<baseDirectory>C:\projects\mysolution\</baseDirectory>
<projectFile>RunTests.proj</projectFile>
<targets>Test</targets>
<timeout>600</timeout>
<logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>
这是一个古老的线程,但我一直在挣扎了同样的问题,我意识到,你真的可以只在整个解决方案中每个DLL运行MSTest的,它并没有真正引起任何问题。 MSTest的是寻找标有[TestMethod的]属性的组件的方法,并没有被“测试”组件是不会有装饰与属性的任何方法组件。 所以,你得到一个“没有测试来执行。” 消息回来,没有做伤害。
因此,例如在南特,你可以这样做:
<target name="default">
<foreach item="File" property="filename">
<in>
<items>
<include name="**\bin\Release\*.dll" />
</items>
</in>
<do>
<echo message="${filename}" />
<exec program="C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe">
<arg value="/testcontainer: ${filename}" />
<arg value="/nologo" />
</exec>
</do>
</foreach>
</target>
它将运行在溶液中的每一个Bin \ Release文件每个DLL中的所有测试方法。 那些不考的dll会返回一个“没有测试来执行。” 而那些有测试将测试运行。 我还没有想出尚未的唯一部分是(在恶性)执行停止第一次命令返回一个非零值。 因此,如果任何单元测试失败,它不会继续下去,在随后的组件来执行任何测试。 这不是很大,但如果所有的测试都通过了,那么他们将所有的运行。
我只是最近解决这个问题。 这里是我的建议:MSTEST的使用testmetadata + testlist选项
- 首先,你应该创造testmetadata文件testlist(vsmdi)
- 命令行应该
mstest /testmetadata:....vsmdi /testlist:<name>
- 然后使用CCNET配置运行MSTEST
我知道这个线程是很老,但它仍然高在谷歌,所以我想我可能会帮助一个或两个。 总之,由于对此没有满意的解决方案。 我写了一个MSBuild任务这一点。 详细信息可以在这里找到: http://imistaken.blogspot.com/2010/08/running-all-tests-in-solution.html
你可以强制执行的测试项目的命名和定位的一些约定,那么你可以,比如说您的解决方案的位置下方运行MSTest的,所有的* Test.dll的。
据我所知,目前还没有办法从一个“正常”的DLL项目基于解决方案文件soleley告诉一个测试项目。 因此,另一种可能是分析项目文件和/或.vsmdi文件找到测试项目,但可能是相当棘手。
我不知道直接,但这正是VSMDI [FX:吐奶在一个角落里]可以提供帮助。 在解决方案中添加的所有测试的VSMDI。 然后通过VSMDI使用/ testmetadata到MSTest的。
不过我建议你按照上面的约定。 而且使用的命名惯例,并转储出使用说在命令脚本循环的SLN文件
我只想编写调用它,你想要的方式一个目标,然后掀起调用包含所有DLL的被测试对象的批处理文件。
除非你加入测试项目的时候,你会很少需要对其进行修改。
为什么不只是有MSBuild的输出所有的测试组件到一个文件夹。
尝试在设定的MSBuild OutputPath,OutputDir,OUTDIR属性来实现这一点。
再有MSTEST执行针对该文件夹中的所有组件。