2009-07-17 55 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
相關問題