2011-07-18 8 views
5

私はMSBuildスクリプトで作成した項目グループのスコープにいくつか問題があります。基本的には、2つの異なるターゲットを用意することです。TestAssembliesというアイテムグループを生成し、RunTestsを呼び出すRunUnitTestsRunIntegrationTestsとし、TestAssembliesを使用してテストを実行するアセンブリを決定します。MsBuild:CallTargetを使用してItemGroupを渡す

ユニットテストと統合テストの2つの異なるターゲットはビルドターゲットに依存し、コンパイルされたすべてのアセンブリを含むアイテムグループをそこから取得しますが、RunTestsターゲットは別の場所から呼び出されるため実際に依存することはできませんいずれかのしたがって、私はアイテムグループを何らかの形で共通のテストランナーのターゲットに渡す必要があります。しかし、これは不可能なようです。なぜなら、ターゲット内のアイテムグループの変更は、そのターゲット内でのみ機能するように範囲が設定されているようです。

私はthesepostsを見てきましたが、彼らは私の不安を確認するように見える、と回避策としてDependsOnTarget示唆 - 私は別の実行上の別の場所からアイテムを取得する必要があるため、私のために動作しません。

これは私がこれまで持っているものです。

<Target Name="RunAllTests" DependsOnTarget="BuildProject"> 
    <!-- In here, items created in BuildProject are available. --> 
    <CallTarget Targets="RunUnitTests;RunIntegrationTests"> 
</Target> 

<Target Name="RunUnitTests" DependsOnTarget="BuildProject"> 
    <!-- In here, items created in BuildProject are available. --> 
    <!-- One of those is @(UnitTestAssemblies) --> 

    <CreateItem Include="@(UnitTestAssemblies)"> 
     <Output TaskParameter="Include" ItemName="TestAssemblies" /> 
    </CreateItem> 

    <CallTarget Targets="RunTests" /> 
</Target> 

<!-- Then there's a similar target named RunIntegrationTests, which does the 
    same as RunUnitTests except it includes @(IntegrationTestAssemblies) --> 

<Target Name="RunTests"> 
    <!-- Here, I'd like to access @(TestAssemblies) and pass them to the NUnit 
     task, but they have fallen out of scope. --> 
</Target> 

この周りにどのような方法があり、または私は完全に私のビルドスクリプトを再構築する必要がありますか?

+0

@ThomasGerstendörfer::だから固執するテストアセンブリのリストを取得するには、次のように独自のターゲットに目標を設定し、実際に移動する必要があり、私の簡易版で、私の更新を参照してください。現在のビルドスクリプト。 –

答えて

13

ターゲット内のアイテムグループへの変更はの終了後に他のターゲットにのみ表示されます。

<Target Name="PrepareUnitTestList" DependsOnTarget="BuildProject"> 
    <ItemGroup> 
    <TestAssemblies Include="@(UnitTestAssemblies)"/> 
    </ItemGroup> 
</Target> 

<Target Name="RunUnitTests" DependsOnTargets="PrepareUnitTestList"> 
    <CallTarget Targets="RunTests"/> 
</Target> 

<Target Name="RunTests"> 
    <Message Text="Test: %(TestAssemblies.Identity)"/> 
</Target> 
+0

少し再構造化すれば、私はこのように問題を解決することができました。ありがとう! –

+0

おそらく、あなたはあなたのリストラでこの答えを改善することができます...私はRunTestsが一度呼び出され、MessageがTestAssemblyごとに一度呼び出されていることを確信しています。 –

2

"MSBuild"タスクでは、プロパティをターゲットに渡すことができますが、ItemGroupで機能するかどうかはわかりません。しかし、一度に1つのアセンブリを渡すことで、間違いなくバッチ処理を行うことができます。

<Target Name="RunUnitTests"> 
    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="RunTests" Properties="TestAssemblies=%(TestAssemblies.Identity)"/> 
</Target> 

あなたがテストを実行している時に他のアセンブリの知識を必要とする場合、それは無用になりますので、それは、一度に一つだけのアセンブリのための「runtestsと書い」を実行します。しかし、おそらくそれはこの問題を解決するいくつかの良いアイデアを与えるでしょう...

+0

私はこれを考慮しましたが、アセンブリごとにではなく、合計でテスト結果を収集したかったので、これはオプションではありませんでした。 –

関連する問題