Scott Hanselman

Command Line: Using dotnet watch test for continuous testing with .NET Core 1.0 and XUnit.net

March 27, '17 Comments [14] Posted in DotNetCore | Open Source
Sponsored By

I've installed .NET Core 1.0 on my machine. Let's see if I can get a class library and tests running and compiling automatically using only the command line. (Yes, some of you are freaked out by my (and other folks') appreciation of a nice, terse command line. Don't worry. You can do all this with a mouse if you want. I'm just enjoying the CLI.

NOTE: This is considerably updated from the project.json version in 2016.

First, I installed from http://dot.net/core. This should all work on Windows, Mac, or Linux.

C:\> md testexample & cd testexample

C:\testexample> dotnet new sln
Content generation time: 33.0582 ms
The template "Solution File" created successfully.

C:\testexample> dotnet new classlib -n mylibrary -o mylibrary
Content generation time: 40.5442 ms
The template "Class library" created successfully.

C:\testexample> dotnet new xunit -n mytests -o mytests
Content generation time: 87.5115 ms
The template "xUnit Test Project" created successfully.

C:\testexample> dotnet sln add mylibrary\mylibrary.csproj
Project `mylibrary\mylibrary.csproj` added to the solution.

C:\testexample> dotnet sln add mytests\mytests.csproj
Project `mytests\mytests.csproj` added to the solution.

C:\testexample> cd mytests

C:\testexample\mytests> dotnet add reference ..\mylibrary\mylibrary.csproj
Reference `..\mylibrary\mylibrary.csproj` added to the project.

C:\testexample\mytests> cd ..

C:\testexample> dotnet restore
Restoring packages for C:\Users\scott\Desktop\testexample\mytests\mytests.csproj...
Restoring packages for C:\Users\scott\Desktop\testexample\mylibrary\mylibrary.csproj...
Restore completed in 586.73 ms for C:\Users\scott\Desktop\testexample\mylibrary\mylibrary.csproj.
Installing System.Diagnostics.TextWriterTraceListener 4.0.0.
...SNIP...
Installing Microsoft.NET.Test.Sdk 15.0.0.
Installing xunit.runner.visualstudio 2.2.0.
Installing xunit 2.2.0.
Generating MSBuild file C:\Users\scott\Desktop\testexample\mytests\obj\mytests.csproj.nuget.g.props.
Generating MSBuild file C:\Users\scott\Desktop\testexample\mytests\obj\mytests.csproj.nuget.g.targets.
Writing lock file to disk. Path: C:\Users\scott\Desktop\testexample\mytests\obj\project.assets.json
Installed:
16 package(s) to C:\Users\scott\Desktop\testexample\mytests\mytests.csproj

C:\testexample> cd mytests & dotnet test

Build started, please wait...
Build completed.

Test run for C:\testexample\mytests\bin\Debug\netcoreapp1.1\mytests.dll(.NETCoreApp,Version=v1.1)
Microsoft (R) Test Execution Command Line Tool Version 15.0.0.0
Copyright (c) Microsoft Corporation. All rights reserved.

Starting test execution, please wait...
[xUnit.net 00:00:00.5539676] Discovering: mytests
[xUnit.net 00:00:00.6867799] Discovered: mytests
[xUnit.net 00:00:00.7341661] Starting: mytests
[xUnit.net 00:00:00.8691063] Finished: mytests

Total tests: 1. Passed: 1. Failed: 0. Skipped: 0.
Test Run Successful.
Test execution time: 1.8329 Seconds

Of course, I'm testing nothing yet but pretend there's a test in the tests.cs and something it's testing (that's why I added a reference) in the library.cs, OK?

Now I want to have my project build and tests run automatically as I make changes to the code. I can't "dotnet add tool" yet so I'll add this line to my test's project file:

<ItemGroup>
<DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="1.0.0" />
</ItemGroup>

Like this:

Adding <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="1.0.0" />

Then I just dotnet restore to bring in the tool.

In order to start the tests, I don't write dotnet test, I run "dotnet watch test." The main command is watch, and then WATCH calls TEST. You can also dotnet watch run, etc.

NOTE: There's a color bug using only cmd.exe so on "DOS" you'll see some ANSI chars. That should be fixed in a minor release soon - the PR is in and waiting. On bash or PowerShell things look fin.

In this screenshot, you can see as I make changes to my test and hit save, the DotNetWatcher Tool sees the change and restarts my app, recompiles, and re-runs the tests.

Test Run Successful

All this was done from the command line. I made a solution file, made a library project and a test project, made the test project reference the library, then built and ran the tests. If I could add the tool from the command line I wouldn't have had to manually touch the project file at all.

Again, to be sure, all this is stuff you can (and do) do in Visual Studio manually all the time. But I'll race you anytime. ;)


Sponsor: Check out JetBrains Rider: a new cross-platform .NET IDE. Edit, refactor, test, build and debug ASP.NET, .NET Framework, .NET Core, or Unity applications. Learn more and get access to early builds!

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb
Monday, 27 March 2017 04:42:28 UTC
Thanks Scott .. I always using this technique especially when I'm in development, so I don't why the `DotNetWatcher` isn't installed in the default template?!!
Monday, 27 March 2017 05:33:13 UTC
Hi Scott,

Thanks for this article.
What about code coverage for .Net core projects ?

Simon Dib
Monday, 27 March 2017 05:40:22 UTC
Cool, so this is a kind of poor man's live unit testing, no need for VS Enterprise then!
Matt
Monday, 27 March 2017 05:56:46 UTC
@matt you can also consider NCrunch (not pricey and beats Live Unit Testing easily)
Monday, 27 March 2017 06:12:56 UTC
Hi, to see the result after changes in code one also needs to execute "dotnet watch run".
Przemek
Monday, 27 March 2017 07:11:10 UTC
@Miha
+1 for NCrunch.
There's so many good things going on with it.
The NCrunch Grid node is also very useful for using another machine's CPU or software.
Joe Curzon
Monday, 27 March 2017 08:01:19 UTC
I've installed .NET Core 1.0 on my machine. Let's see if I can get a class library and tests running and compiling automatically using only the command line. (Yes, some of you are freaked out by my (and other folks') appreciation of a nice, terse command line. Don't worry. You can do all this with a mouse if you want. I'm just enjoying the CLI.


typo found, missing ) - from years of programming, i would of suspected you would of been on the ball when it comes to opening and closing brackets. :)
mike Rodda
Monday, 27 March 2017 10:58:58 UTC
Hi Scott,

thanks for posting all these testing related blog posts. I'd really love to see a blog post about CI+CD for ASP.NET projects in terms of a self-hosted solution (I do have some projects that are either closed source or where I'm not allowed to use services like AppVeyor). I tried to use Jenkins and tried to use TFS for this but I just gave up after a couple of hours because I had multiple problem and they just didn't work out of the box. Since containers are becoming more popular, I'd love to see a Docker solution for CI+CD that I can simply run in Azure. Unfortunately, I don't have the time to do this myself. I'd love to hear your thoughts about this.

With regards,
Matthias
Matthias
Monday, 27 March 2017 12:32:15 UTC
Hi Scott,

Thank you for your articles on .NET Core.
I followed the .NET Core course on MVA. Really appreciated.

Keep up the good work, for the brave new Microsoft!
Sijmen Koffeman
Monday, 27 March 2017 18:02:55 UTC
I'm using a "dotnet new angular" instead of the class library but I can't add it as a reference because the xunit project is netcoreapp1.0 instead of netcoreapp1.1

If I change the xunit project to target netcoreapp1.1 - none of my tests are discovered.

Any ideas braintrust?
Fergal Moran
Monday, 27 March 2017 20:20:38 UTC
Thanks for the MVA tutorials. I followed them and got up and running with the basics on .NET Core. It's really awesome to see the command line support. I come from a Linux background where cli was very much integrated into my development workflow. I love to see the same happening here. Feels home.


C:\Code\CoreMVC>dotnet watch run



Love it!
Tuesday, 28 March 2017 00:45:49 UTC
Hello Scott,

I don't suppose you have any insight into using code coverage tools, like Sonarqube, with .NET Core? My understanding is code coverage can't run because there aren't debug/symbol files for .NET core apps?
Tuesday, 28 March 2017 11:52:19 UTC
Scott, good thing you installed the xunit packages before installing the watch tool. The other way around does not work. :/

https://github.com/NuGet/Home/issues/4771

:punch-in-sad-panda-face:
John K
Tuesday, 28 March 2017 14:38:37 UTC
Minor typo:

On bash or PowerShell things look fin.

Jake
Comments are closed.

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.