6

MSBuild スクリプトで作成した項目グループのスコープに問題があります。基本的に、私がやりたいことは、2 つの異なるターゲットを用意することです - それらRunUnitTestsを呼び出しましょうRunIntegrationTests- と呼ばれるアイテム グループを生成し、TestAssemblies次に を呼び出しますRunTests。これにより、TestAssembliesどのアセンブリからテストを実行するかが決定されます。

単体テストと統合テストの 2 つの異なるターゲットはどちらもビルド ターゲットに依存し、そこからすべてのコンパイル済みアセンブリを含む項目グループを取得しますが、RunTestsターゲットは別の場所から呼び出されるため、実際にはどちらにも依存することはできません。したがって、アイテム グループを共通の testrunner ターゲットに渡す必要があります。ただし、ターゲット内の項目グループへの変更は、そのターゲット内でのみ機能するようにスコープが設定されているように見えるため、これは不可能のようです。

私はこれらの 投稿を見てきましたが、それらは私の恐怖を確認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>

これを回避する方法はありますか、それともビルド スクリプトを完全に再構築する必要がありますか?

4

2 に答える 2

14

ターゲット内の項目グループへの変更は、変更中のターゲットが終了した後にのみ、他のターゲットに表示されます。したがって、テスト アセンブリのリストを取得するには、次のように、実際にターゲットを独自のターゲットに設定する必要がある場合があります。

<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>
于 2011-07-18T09:32:45.577 に答える
2

「MSBuild」タスクでは、プロパティをターゲットに渡すことができますが、ItemGroup で機能するかどうかはわかりません。しかし、一度に 1 つのアセンブリを渡すという、バッチ処理によって確実にそれを行うことができます。

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

一度に1つのアセンブリに対してのみ「RunTests」を実行するため、テストの実行時に他のアセンブリの知識が必要な場合は役に立ちません。しかし、おそらく、この問題を解決するためのより良いアイデアが得られるでしょう...

于 2011-07-18T09:30:36.713 に答える