20

ソリューション ファイル内のすべてのテスト プロジェクトを実行するように MSTEST に指示する方法を知る必要があります。これは、コマンド ラインから実行する必要があります。現在、特定のプロジェクト ファイルを渡す必要があります。SOLUTION ファイルから実行しようとしています。

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

これは古いスレッドですが、私は同じ問題に苦しんでおり、ソリューション全体のすべての 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 に答える
2

最近、この問題を解決しました。これが私の提案です:mstestのtestmetadata + testlistオプションを使用してください

  1. まず、testmetadata ファイル (vsmdi) にテストリストを作成する必要があります。
  2. コマンドラインはmstest /testmetadata:....vsmdi /testlist:<name>
  3. 次に、ccnet config を使用して mstest を実行します
于 2012-05-25T06:34:38.547 に答える
1

このスレッドがかなり古いことは知っていますが、Google ではまだ高いので、1 つまたは 2 つの助けになると思いました。とにかく、これに対する満足のいく解決策はありません。このための msbuild タスクを作成しました。詳細はこちら: http://imistaken.blogspot.com/2010/08/running-all-tests-in-solution.html

于 2010-08-15T18:14:56.443 に答える
0

テスト プロジェクトの名前付けと場所に規則を適用し、たとえば、ソリューションの場所の下にあるすべての *Test.dll に対して MSTest を実行できます。

私の知る限り、ソリューション ファイルのみに基づいた「通常の」DLL プロジェクトとテスト プロジェクトを区別する方法はありません。そのため、別の方法として、プロジェクト ファイルや .vsmdi ファイルを分析してテスト プロジェクトを見つけることもできますが、これはややこしい作業になる可能性があります。

于 2009-07-26T12:17:52.283 に答える
0

直接はわかりませんが、これは VSMDI [fx:spits in a corner] が役立つ場所です。ソリューションで、すべてのテストを VSMDI に追加します。次に、/testmetadata を使用して VSMDI を mstest に渡します。

ただし、上記の規則に従うことをお勧めします。命名規則を使用し、コマンド スクリプトで for ループを使用して SLN ファイルからダンプします。

于 2009-07-28T01:20:40.843 に答える