文章出處

用了Visual Studio 2015之后,發現沒法跑xUnit單元測試,xUnit.net runner不支持VS2015,TestDriven.Net也不支持VS2015。

等它們支持VS2015,不知要等到猴年還是要等到馬月。于是今天決定不等了,嘗試用msbuild跑單元測試解決這個問題。

nuget上一搜,發現已經有人提供了xunit.MSBuild,直接用它就可以了。

在單元測試項目中安裝這個nuget package:

Install-Package xunit.MSBuild

發現對應的.csproj文件中增加了如下的配置:

<Import Project="..\packages\xunit.MSBuild.1.9.2.3\build\xunit.MSBuild.targets" 
Condition="Exists('..\packages\xunit.MSBuild.1.9.2.3\build\xunit.MSBuild.targets')" />

xunit.MSBuild.targets文件中的內容如下:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask AssemblyFile="$(MSBuildThisFileDirectory)..\tools\xunit.runner.msbuild.dll" TaskName="Xunit.Runner.MSBuild.xunit" />
  
  <PropertyGroup Condition="'$(RunXunitTests)' == ''">
    <RunXunitTests Condition="'$(Configuration)' == 'Release'">true</RunXunitTests>
  </PropertyGroup>

  <PropertyGroup>
    <BuildDependsOn>$(BuildDependsOn);ExecuteXUnitTests</BuildDependsOn>
    <RebuildDependsOn>$(RebuildDependsOn);ExecuteXUnitTests</RebuildDependsOn>
  </PropertyGroup>
  
  <Target Name="ExecuteXUnitTests" Condition="'$(RunXunitTests)' == 'true'" >
    <xunit Assembly="$(OutputPath)$(AssemblyName).dll" />
  </Target>
</Project>

從這個msbuild的配置中可以看出,ExecuteXUnitTests就是跑單元測試的msbuild命令,觸發條件是當項目以Release方式編譯。

然后,只需修改一下.csproj中的配置,在項目編譯后調用這個ExecuteXUnitTests命令即可:

<Target Name="AfterBuild"> 
ExecuteXUnitTests 
</Target>

這樣配置后,編譯時會在Visual Studio的Output窗口顯示單元測試的結果:

37> PostModelTest.PostModel_Required_Validation
37> Tests: 1, Failures: 0, Skipped: 0, Time: 0.410 seconds
37>
37>Build succeeded.

如果單元測試失敗,會這樣的顯示:

1>    Tests: 1, Failures: 1, Skipped: 0, Time: 0.428 seconds
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:03.91
========== Build: 0 succeeded, 1 failed, 42 up-to-date, 0 skipped ==========

Visual Studio的狀態欄也會顯示Build failed。

這樣的顯示效果雖然不是很直觀,但是在編譯時就運行單元測試挺方便,而且單元測試失敗會讓編譯失敗,這樣更突顯單元測試的重要性。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()