如何告诉MSTEST在解决方案中运行所有测试项目?

时间:2009-07-17 15:51:25

标签: tdd mstest cruisecontrol.net command-prompt

我需要知道如何告诉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>

8 个答案:

答案 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选项

  1. 首先,您应该在testmetadata文件(vsmdi)中创建一个测试列表
  2. 命令行应为mstest /testmetadata:....vsmdi /testlist:<name>
  3. 然后使用ccnet config运行mstest

答案 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。