1

いくつかの単体テストを実行するために Nant ビルド スクリプトを変更しています。ローカルで実行されるテストと、チーム シティで実行されるテストのターゲットが異なります。

<target name="run-unit-tests">  
   <property name="test.executable" value="tools\nunit\nunit-console.exe"/>
   <call target="do-unit-tests"/>
</target>

<target name="run-unit-tests-teamcity"> 
   <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/>      
   <call target="do-unit-tests"/>
</target>

ターゲットのdo-unit-testsで、次のようにプロパティを設定し、NCover を呼び出してコード カバレッジを実行することで、どのテスト アセンブリを実行するかを設定しました。

<target name="do-unit-test">
   <property name="test.assemblies" value="MyProject.dll">
   <call target="do-unit-test-coverage" />
</target>

<target name="do-unit-test-coverage">
   <ncover <!--snip -->
           commandLineArgs="${test.args}"
   <!--snip-->
   </ncover>
</target>

ncover 部分でわかるように、"test.args"というプロパティが必要です。このプロパティは「test.assemblies」に依存します

すなわち:<property name="test.args" value="${test.assemblies} <!--snip -->" />

test.args は、ローカルで実行される単体テストとチーム シティで実行される単体テストとで異なる方法で設定する必要があるため、これを設定する方法を見つけようとしています。

プロパティ "test.assemblies" の後に "do-unit-test" に test.args のプロパティを配置すると、do-unit-test が run-unit-tests によって呼び出され、別の test.args によって呼び出される場合、1 つの test.args を指定できません。 run-unit-tests-teamcity 用。

「do-unit-test」で次のようなことをやろうとしています:

<if test="${target::exists('run-unit-tests-teamcity')}">
 <property name="test.args" value="..." />
</if>

しかし、ターゲットが常に存在するため、明らかにそれは機能しません。

次に、現在のターゲットdo-unit-testがrun-unit-tests-teamcityによって呼び出されたかどうかをテストしたいと思います

これは可能ですか?Nant のドキュメントに表示されませんか? そこにないので、それは将来の機能になるか、Nant ビルド スクリプトでどのように指定されているかを理解していないことを意味します。

4

2 に答える 2

2

1 つのターゲットでプロパティを定義し、その値を別のターゲットで使用できます。たとえば、次のように定義できます。

<target name="run-unit-tests">
   <property name="test.executable" value="tools\nunit\nunit-console.exe"/>
   <property name="test.extratestargs" value="foo,bar,baz"/>
   <call target="do-unit-tests"/>
</target>

<target name="run-unit-tests-teamcity">
   <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/>         
   <property name="test.extrtestargs" value="foo,baz,quux,xyzzy"/>
   <call target="do-unit-tests"/>
</target>

<target name="do-unit-test-coverage">
   <property name="test.args" value="${test.assemblies} ${test.extratestargs} <!--snip -->" />
   <ncover <!--snip -->
           commandLineArgs="${test.args}" >
   <!--snip-->
   </ncover>
</target>


または、いくつかの異なる値を持つだけでなく、完全に異なる構造にする必要がある場合は、プロパティの置換が遅れるという事実を利用してください。


<?xml version="1.0"?>

<project name="nanttest">

        <target name="run-unit-tests">
           <property name="test.executable" value="tools\nunit\nunit-console.exe"/>
           <property name="test.args" value="foo bar -assembly ${test.assemblies} baz" dynamic="true"/>
           <call target="do-unit-test"/>
        </target>

        <target name="run-unit-tests-teamcity">
           <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/>
           <property name="test.args" value="foo,baz,quux /a:${test.assemblies} xyzzy" dynamic="true"/>
           <call target="do-unit-test"/>
        </target>

        <target name="do-unit-test-coverage">
           <echo message="test.executable = ${test.executable}, test.args = ${test.args}" />
        </target>

        <target name="do-unit-test">
           <property name="test.assemblies" value="MyProject.dll"/>
           <call target="do-unit-test-coverage" />
        </target>


</project>

user@host:/tmp/anttest$ nant run-unit-tests
[...をちょきちょきと切る...]
単体テストの実行:
単体テストを行う:
do-unit-test-coverage:
     [エコー] test.executable = tools\nunit\nunit-console.exe, test.args = foo bar -assembly MyProject.dll baz
ビルド成功
合計時間: 0 秒。

user@host:/tmp/anttest$ nant -D:teamcity.dotnet.nunitlauncher=nunitlauncher run-unit-tests-teamcity
[...をちょきちょきと切る...]
run-unit-tests-teamcity:
単体テストを行う:
do-unit-test-coverage:
     [エコー] test.executable = nunitlauncher, test.args = foo,baz,quux /a:MyProject.dll xyzzy
ビルド成功
合計時間: 0 秒。

本当に、本当に TeamCity で実行しているかどうかを知る必要がある場合は、これが役立ちます。

<target name="run-unit-tests-teamcity">
   <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/>         
   <property name="running.in.teamcity" value="true"/>
   <call target="do-unit-tests"/>
</target>

于 2008-12-23T08:46:02.393 に答える
0

私は問題を解決することができました。それが最善の解決策かどうかはわかりませんが解決策です。

test.typeというプロパティを設定し、if ステートメントを使用して、それがどのターゲットから来たかを判断します。

<target name="run-unit-tests">  
   <property name="test.executable" value="tools\nunit\nunit-console.exe"/>
   <property name="test.type" value="unit-tests" />
   <call target="do-unit-tests"/>
</target>

<target name="run-unit-tests-teamcity"> 
   <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/>          
   <property name="test.type" value="unit-tests-teamcity" />
   <call target="do-unit-tests"/>
</target>

<target name="do-unit-test">
   <property name="test.assemblies" value="MyProject.dll">
   <call target="do-unit-test-coverage" />
</target>

<target name="do-unit-test-coverage">

   <if test="${test.type=='unit-tests'}">
      <property name="test.args" value="${test.assemblies} ..."/>
   </if>
        
   <if test="${test.type=='unit-tests-teamcity'}">
      <property name="test.args" value="... ${test.assemblies}"/>
   </if>

   <ncover <!--snip -->
           commandLineArgs="${test.args}"
   <!--snip-->
   </ncover>
</target>
于 2008-12-24T00:24:45.900 に答える