كيف يمكنني الحصول على بناء فريق لإجراء اختبارات MbUnit؟

StackOverflow https://stackoverflow.com/questions/154411

سؤال

وأواجه صعوبة في الحصول على بناء فريق لتنفيذ بلدي MbUnit وحدة الاختبارات. لقد حاولت تعديل TFSBuild.proj وأضاف الأجزاء التالية:

<Project ...>
  <UsingTask TaskName="MbUnit.MSBuild.Tasks.MbUnit" AssemblyFile="path_to_MbUnit.MSBuild.Tasks.dll" />
  ...
  ...
  <ItemGroup>
    <TestAssemblies Include="$(OutDir)\Project1.dll" />
    <TestAssemblies Include="$(OutDir)\Project2.dll" />
  </ItemGroup>
  <Target Name="Tests">
    <MbUnit
      Assemblies="@(TestAssemblies)"
      ReportTypes="html"
      ReportFileNameFormat="buildreport{0}{1}"
      ReportOutputDirectory="." />
  </Target>
  ...
</Project>

ولكن لدي حتى الآن للحصول على اختبارات لتشغيل.

هل كانت مفيدة؟

المحلول

وقبل الاقتراح لم يساعدني كثيرا، ولكنني وجدت بعض الوثائق لفريق بناء وتعديل تصميمي النصي لتجاوز الهدف AfterCompile:

(تحرير: والآن بعد أن لدي فهم أفضل للفريق بناء، ولقد أضاف بعض أكثر إلى عداء اختبار وسوف الآن تحديث مستكشف بناء / بناء العرض مع خطوات بناء مع تفاصيل حول تشغيل الاختبار.)

<Project ...>
  <UsingTask TaskName="MbUnit.MSBuild.Tasks.MbUnit" AssemblyFile="path_to_MbUnit.MSBuild.Tasks.dll" />
  ...
  ...
  <Target Name="AfterCompile">
    <ItemGroup>
      <TestAssemblies Include="$(OutDir)\Project1.dll" />
      <TestAssemblies Include="$(OutDir)\Project2.dll" />
    </ItemGroup>

    <BuildStep
      TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
      BuildUri="$(BuildUri)"
      Message="Running tests (cross your fingers)...">
      <Output TaskParameter="Id" PropertyName="StepId" />
    </BuildStep>

    <MbUnit
      Assemblies="@(TestAssemblies)"
      ReportTypes="html"
      ReportFileNameFormat="buildreport{0}{1}"
      ReportOutputDirectory="." />

    <BuildStep
      TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
      BuildUri="$(BuildUri)"
      Id="$(StepId)"
      Message="Yay! All tests succeded!"
      Status="Succeeded" />
    <OnError ExecuteTargets="MarkBuildStepAsFailed" />
  </Target>

  <Target Name="MarkBuildStepAsFailed">
    <BuildStep
      TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
      BuildUri="$(BuildUri)"
      Id="$(StepId)"
      Message="Oh no! Some tests have failed. See test report in drop folder for details."
      Status="Failed" />
  </Target>
  ...
</Project>

نصائح أخرى

وأنت لا تحتاج إلى استدعاء MSBuild مرة أخرى أن ItemGroup الخاص بالسكان، هناك طريقة أسهل. إعادة يدعو MSBuild لها مضارها، مثل تمرير جميع المعلمات Teambuild إلى جعل TeamBuild-مهام العمل. نحن نستخدم هذه المهمة CreateItem بصورة من MSBuild لتوليد ItemGroup مع كافة DLL اختبار لدينا حيوي:

<Target Name="AfterCompile">
<CreateItem Include="$(OutDir)\*.Test.dll">
           <Output
               TaskParameter="Include"
               ItemName="TestBinaries"/>
</CreateItem>
</Target><!--Test run happens in a later target in our case, we use MSTest -->

والطريقة ItemGroups في MSBuild العمل هو أن يتم تقييمها في بداية جدا من مخطوطات MSBuild، قبل أن يتم ركض أي أهداف. لذلك إذا المجالس لا وجود لها حتى الآن (وهو ما لن لأنها لم تبن بعد) ثم فإن ItemGroups لم تجد أي ملفات.

وهذا النمط المعتاد في MSBuild كمحاولة للتغلب على هذه هو إعادة استدعاء-MSBuild مرة أخرى في هذه المرحلة بحيث عندما تحصل على المجموعات البند تقييمها في تنفيذ MSBuild الداخلي، فإن المجالس موجودة.

وعلى سبيل المثال، شيء من هذا القبيل:

  <PropertyGroup>
    <TestDependsOn>
      $(TestDependsOn);
      CallMbUnitTests;
    </TestDependsOn>
  </PropertyGroup>

  <Target Name="CallMbUnitTests">
    <MSBuild Projects="$(MSBuildProjectFile)"
             Properties="BuildAgentName=$(BuildAgentName);BuildAgentUri=$(BuildAgentUri);BuildDefinitionName=$(BuildDefinitionName);BuildDefinitionUri=$(BuildDefinitionUri);
                         BuildDirectory=$(BuildDirectory);BuildNumber=$(BuildNumber);CompilationStatus=$(CompilationStatus);CompilationSuccess=$(CompilationSuccess);
                         ConfigurationFolderUri=$(ConfigurationFolderUri);DropLocation=$(DropLocation);
                         FullLabelName=$(FullLabelName);LastChangedBy=$(LastChangedBy);LastChangedOn=$(LastChangedOn);LogLocation=$(LogLocation);
                         MachineName=$(MachineName);MaxProcesses=$(MaxProcesses);Port=$(Port);Quality=$(Quality);Reason=$(Reason);RequestedBy=$(RequestedBy);RequestedFor=$(RequestedFor);
                         SourceGetVersion=$(SourceGetVersion);StartTime=$(StartTime);Status=$(Status);TeamProject=$(TeamProject);TestStatus=$(TestStatus);
                         TestSuccess=$(TestSuccess);WorkspaceName=$(WorkspaceName);WorkspaceOwner=$(WorkspaceOwner);
                         SolutionRoot=$(SolutionRoot);BinariesRoot=$(BinariesRoot);TestResultsRoot=$(TestResultsRoot)"
             Targets="RunMbUnitTests"/>
  </Target>

  <ItemGroup>
    <TestAssemblies Include="$(OutDir)\Project1.dll" />
    <TestAssemblies Include="$(OutDir)\Project2.dll" />
  </ItemGroup>
  <Target Name="RunMbUnitTests">
    <MbUnit
      Assemblies="@(TestAssemblies)"
      ReportTypes="html"
      ReportFileNameFormat="buildreport{0}{1}"
      ReportOutputDirectory="." />
  </Target>

وعلى أمل أن يساعد، حظا سعيدا.

ومارتن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top