2009-07-17 91 views
20

我需要知道如何告诉MSTEST在解决方案文件中运行所有测试项目。这需要从命令行完成。现在我必须将它传递给一个特定的项目文件,我试图让它从SOLUTION文件运行。如何告诉MSTEST在解决方案中运行所有测试项目?

我希望这是可能的,因为在Visual Studio中,按Ctrl + R,A,在当前打开的解决方案中运行ALL测试。

我解释帮助文件的方式,你必须明确地传递每个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

你有没有得到这个解决?我无法弄清楚如何在CC.NET中创建“CreateItem”的东西? – D3vtr0n 2011-05-26 20:19:36

回答

-1

我只想编写调用它,你想要的方式一个目标,然后掀起调用包含所有DLL的被测试对象的批处理文件。

除非您始终添加测试项目,否则很少需要修改它。

+0

我们每4-5个月增加一次测试项目,将项目置于“自动建筑”的“主”解决方案中已经是一种习惯。我试图尽量减少添加更多的步骤让人们记住。关于测试的可怕之处在于,永远不要运行你写的测试是多么容易。 – Jeremiah 2009-07-24 20:26:18

+0

每个非测试项目是否有单个相应的测试项目? – 2009-07-27 20:44:25

-1

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

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

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

+0

问题在于测试程序集恰好在他们正在测试的实际程序集旁边。发送mstest命令如“* .dll”。我试图让这个过程足够愚蠢,所以我们一直在测试我们添加的项目。如果我们添加一个新的测试项目,这个项目可能每4-5个月发生一次(足够短以至于忘记了这些步骤),我想要处理简单地阅读测试项目的解决方案。 – Jeremiah 2009-07-24 20:24:22

+0

您是否使用.Test为后缀测试程序集? – Ryu 2009-07-24 20:59:16

0

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

据我所知,在解决方案文件中,没有办法从基于'普通'DLL项目的soleley中告诉测试项目。所以,另一种方法是分析项目文件和/或.vsmdi文件以找到测试项目,但这可能相当棘手。

0

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

但是我建议你遵循上面的约定。并使用一个命名约定并从命令脚本中使用for循环使用命令约定并转储出来

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> 
+0

如何以及在哪里将其纳入CruiseControl配置?您提供的代码是否需要驻留在NANT任务.build脚本中?或者这个XML直接进入CC.NET配置? – D3vtr0n 2011-05-26 18:58:49

+0

我希望这是一块“小菜一碟”。我认为它是一个P.O.S.亲自!你如何在CruiseControl.NET中做到这一点?原来的问题没有问如何在MSBuild中做到这一点! – D3vtr0n 2011-05-26 21:49:09

2

这是一个古老的线程,但我一直在用同样的问题挣扎,我意识到,你真的可以只在整个解决方案中每个DLL运行MSTest的,它不真的会造成任何问题。 MSTest正在用[TestMethod]属性标记的程序集中查找方法,而不是“test”程序集的程序集则不会有用该属性装饰的任何方法。所以你得到一个“没有测试执行”。消息回来,并没有造成伤害。

因此,例如在南特,你可以这样做:

<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中)执行在第一次命令返回一个非零值时停止。因此,如果任何单元测试失败,它不会继续执行后续程序集中的任何测试。这不是很好,但如果所有的测试都通过了,那么他们都会运行。

2

我刚刚解决这个问题最近。这里是我的建议:MSTEST

  1. 首先使用testmetadata + testlist选项,你应该在testmetadata文件中创建一个testlist(vsmdi)
  2. 命令行应该是mstest /testmetadata:....vsmdi /testlist:<name>
  3. 然后使用CCNET配置运行MSTEST
相关问题