在進行 Asp.Net Core 應用程序開發過程當中,一般的作法是先把業務代碼開發完成,而後創建單元測試,最後進入本地系統集成測試;在這個過程當中,程序員的大部分時間幾乎都花費在開發、運行、調試上,並且一再的重複這個過程,我稱這個過程爲「程序員開發螺旋」,而且在這個步驟中,重複率最高且沒有創造力的工做就是啓動、測試,做爲程序員,努力提升生產力咱們追求的目標,咱們的工做就是儘可能消滅重複勞動,解放生產力,提升產出效率;下面就經過一個簡單的例子來演示,如何經過文件監視進行快速開發。html
[Route("api/[controller]")] [ApiController] public class HomeController : ControllerBase { [HttpGet("{id}")] public IActionResult Get(int id) { int code = 0; string userName = string.Empty; switch (id) { case 100: userName = "Ron.liang"; break; default: userName = "Guest"; code = 403; break; } return new JsonResult(new { code, userName }); } }
該業務方法很是簡單,僅根據傳入的 id 值進行判斷,若是不是 100 則返回 code=403git
Microsoft.AspNetCore.App Microsoft.AspNetCore.TestHost
UserCenterDemo 使用了主機集成測試方式,對主機集成測試不瞭解到同窗,能夠查看我上一篇博客: Asp.Net Core 輕鬆學-利用xUnit進行主機級別的網絡集成測試.程序員
public class HomeControllerTest { public static TestServer serverHost; public static HttpClient client; public HomeControllerTest() { if (serverHost == null) { serverHost = new TestServer(new WebHostBuilder().UseStartup<UserCenterDemo.Startup>()); client = serverHost.CreateClient(); } } class TestResult { public int Code { get; set; } public string UserName { get; set; } } [Fact] public async void GetUserNameTest() { var data = await client.GetAsync("/api/home/100"); var result = await data.Content.ReadAsStringAsync(); var obj = JsonConvert.DeserializeObject<TestResult>(result); Assert.Equal(0, obj.Code); } [Fact] public async void GetGuestTest() { var data = await client.GetAsync("/api/home/0"); var result = await data.Content.ReadAsStringAsync(); var obj = JsonConvert.DeserializeObject<TestResult>(result); Console.WriteLine(result); Assert.Equal(403, obj.Code); } }
該測試包含兩個測試方法,分別是獲取 id=100 的用戶和 id=0 的 Guest 用戶github
按照以往的開發習慣,咱們如今應該作的事情可能有兩個,一是啓動項目使用瀏覽器進行訪問業務接口 Get ,二是運行單元測試,無論怎麼樣,這兩個動做都將消耗咱們大量的時間
如今,有一種全新的選擇,咱們能夠經過使用 dotnet watch test 對項目文件進行監視變更,自動運行單元測試,並將測試結果輸出到控制檯api
上圖表示,當咱們輸入命令 dotnet watch test 後,監視程序正在啓動,並在啓動完成後當即執行了一次單元測試,紅色方框部分表示有 2 個測試用例已經過,而後程序並無退出,而是在最後輸出了一個提示,正在等待文件變更以重啓 dotnet 應用程序瀏覽器
能夠看到,在修改完成保存文件的瞬間,程序當即重啓生成,而後執行測試,測試結果斷言不經過
那麼問題來了,上面只是監視了測試項目,若是咱們修改了 UserCenterDemo.Controllers ,可以自動監視嗎,答案是確定的網絡
[Route("api/[controller]")] [ApiController] public class HomeController : ControllerBase { [HttpGet("{id}")] public IActionResult Get(int id) { int code = 0; string userName = string.Empty; switch (id) { case 100: userName = "Ron.liang"; break; default: userName = "Guest"; code = 403; break; } return new JsonResult(new { code, userName }); } }
爲何會這樣呢,由於咱們的測試項目引用了業務項目 UserCenterDemo
因此能夠監視到,查看 UserCenterDemoTest.csproj 文件,起做用的是如下代碼async
<ItemGroup> <ProjectReference Include="..\UserCenterDemo\UserCenterDemo.csproj" /> </ItemGroup>
<ItemGroup> <ProjectReference Include="..\UserCenterDemo\UserCenterDemo.csproj" Watch="false"/> </ItemGroup>
當項目比較大的時候,咱們可能須要對監視項目進行管理,這個時候再逐一的對每一個項目進行監視設置就變得很是的麻煩,而後咱們就能夠創建一個單獨的文件夾,建立一個 watch.csproj 文件,填以下面的內容單元測試
<Project> <ItemGroup> <TestProjects Include="..\**\*.csproj" /> <Watch Include="..\**\*.cs" /> </ItemGroup> <Target Name="WatchManage"> <MSBuild Targets="VSTest" Projects="@(TestProjects)" /> </Target> <Import Project="$(MSBuildExtensionsPath)\Microsoft.Common.targets" /> </Project>
因此文件中的監視節點我必須加入 .. 回退到上一級,上面的代碼表示,監視上一級目錄下的 .csproj/.cs 文件變更,併爲本次監視管理命名爲:WatchManage學習
能夠看到,已經成功對兩個項目進行變更監視
https://github.com/lianggx/EasyAspNetCoreDemo/tree/master/UserCenterDemo