我需要知道如何告诉MSTEST在解决方案文件中运行所有测试项目。这需要从命令行完成。现在我必须传递一个特定的项目文件,我试图让它从一个解决方案文件运行。
我希望这是可能的,因为在Visual Studio中,按Ctrl + R,A,在当前打开的解决方案中运行所有测试。
我解释帮助文件的方式,你必须专门传递每个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>
答案 0 :(得分:10)
要详细说明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>
此外,将MsBuild与CruiseControl集成是一件小事。
修改强>
以下是如何从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>
答案 1 :(得分:2)
这是一个老线程,但我一直在努力解决同样的问题,我意识到你真的可以在整个解决方案中的每个dll上运行MSTest,它并没有真正导致任何问题。 MSTest正在查找标有[TestMethod]属性的程序集中的方法,而不是“test”程序集的程序集将不会有任何用该属性修饰的方法。所以你得到一个“没有测试执行”。留言回复,没有伤害。
因此,例如在NAnt中你可以这样做:
<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的将返回“No test to execution”。那些有测试的人会进行测试。我还没想到的唯一部分是(在NAnt中)执行在第一次命令返回非零值时停止。因此,如果任何单元测试失败,它将不会继续执行后续程序集中的任何测试。这不是很好,但如果所有测试都通过,那么它们都会运行。
答案 2 :(得分:2)
我最近解决了这个问题。以下是我的建议:使用mstest的testmetadata + testlist选项
mstest /testmetadata:....vsmdi /testlist:<name>
答案 3 :(得分:1)
我知道这个帖子很老,但它仍然在Google上很高,所以我想我可能会帮助一两个。 无论如何,因为没有令人满意的解决方案。 我为此编写了一个msbuild任务。 详细信息可以在这里找到: http://imistaken.blogspot.com/2010/08/running-all-tests-in-solution.html
答案 4 :(得分:0)
您可以对测试项目的命名和位置强制执行一些约定,然后您可以在解决方案位置下面的所有* Test.dll上运行MSTest。
据我所知,没有办法告诉测试项目来自一个基于解决方案文件的'正常'DLL项目。因此,另一种方法是分析项目文件和/或.vsmdi文件以查找测试项目,但这可能相当棘手。
答案 5 :(得分:0)
我不直接知道,但这是VSMDI [fx:在角落吐痰]可以提供帮助的地方。在您的解决方案中,将所有测试添加到VSMDI。然后使用/ testmetadata将VSMDI传递给mstest。
但我建议您遵循上述惯例。并使用命名约定并使用命令脚本中的for循环将其从SLN文件中转储出来
答案 6 :(得分:-1)
我只想编写一个以你想要的方式调用它的目标,然后启动一个调用目标的批处理文件,该目标包含要测试的所有DLL。
除非您一直在添加测试项目,否则您很少需要修改它。
答案 7 :(得分:-1)
为什么不让msbuild将所有测试程序集输出到文件夹。
尝试在msbuild中设置OutputPath,OutputDir,OutDir属性来完成此任务。
然后对该文件夹中的所有程序集执行mstest。