20

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

8 回答 8

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>
于 2009-07-28T06:14:11.703 回答
2

我最近才解决这个问题。这是我的建议:使用 mstest 的 testmetadata + testlist 选项

  1. 首先,您应该在 testmetadata 文件(vsmdi)中创建一个测试列表
  2. 命令行应该是mstest /testmetadata:....vsmdi /testlist:<name>
  3. 然后使用 ccnet config 运行 mstest
于 2012-05-25T06:34:38.547 回答
2

这是一个旧线程,但我一直在努力解决同样的问题,我意识到你真的可以在整个解决方案中的每个 dll 上运行 MSTest,它并没有真正引起任何问题。MSTest 正在用 [TestMethod] 属性标记的程序集中寻找方法,而不是“测试”程序集的程序集不会有任何用该属性修饰的方法。所以你得到一个“没有要执行的测试”。回消息并没有造成任何伤害。

因此,例如在 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 的将返回“没有要执行的测试”。那些有测试的人将运行测试。我还没有弄清楚的唯一部分是(在 NAnt 中)执行在命令第一次返回非零值时停止。因此,如果任何单元测试失败,它不会继续在后续程序集中执行任何测试。这不是很好,但是如果所有测试都通过了,那么它们都会运行。

于 2011-07-21T20:07:35.507 回答
1

我知道这个线程很老,但它在谷歌上仍然很高,所以我想我可以帮助一两个。无论如何,因为没有令人满意的解决方案。我为此编写了一个 msbuild 任务。详细信息可以在这里找到:http: //imistaken.blogspot.com/2010/08/running-all-tests-in-solution.html

于 2010-08-15T18:14:56.443 回答
0

我不直接知道,但这是 VSMDI [fx:spits in a corner] 可以提供帮助的地方。在您的解决方案中,将所有测试添加到 VSMDI。然后使用 /testmetadata 将 VSMDI 传递给 mstest。

但是,我建议您遵循上述约定。并使用命名约定并使用命令脚本中的 for 循环将其从 SLN 文件中转储出来

于 2009-07-28T01:20:40.843 回答
0

您可以对测试项目的命名和位置强制执行一些约定,然后您可以在解决方案位置下的所有 *Test.dll 上运行 MSTest。

据我所知,没有办法从解决方案文件上的“普通”DLL 项目中区分测试项目。因此,另一种方法是分析项目文件和/或 .vsmdi 文件以找到测试项目,但这可能相当棘手。

于 2009-07-26T12:17:52.283 回答
-1

为什么不让 msbuild 将所有测试程序集输出到一个文件夹。

尝试在 msbuild 中设置 OutputPath,OutputDir,OutDir 属性来完成此操作。

然后让 mstest 对该文件夹中的所有程序集执行。

于 2009-07-24T19:11:49.193 回答
-1

我只想编写一个按您想要的方式调用它的目标,然后创建一个批处理文件,该文件调用包含要测试的所有 DLL 的目标。

除非您一直在添加测试项目,否则您很少需要对其进行修改。

于 2009-07-23T00:25:02.183 回答