Getting Tests Setup Quickly in .NET Core
Testing in .NET Core is extremely easy with xunit but the setup process for those of us outside of Visual Studio can be a bit trickier. In this post I will cover setting up all of the packages and getting a demo test running.
Target audience
The .NET landscape is a big place and there are a lot of ways to do development. This post is targetted at the following people:
- who want to run tests in the same project as their application
- are on .NET Core 1.1
- are using the CLI instead of Visual Studio
- VS Code as your editor counts as CLI
At the time of publishing, only .NET Core apps are supported for running tests. So, if you want to run tests in your library project it will require a separate project for running tests. I won't be going through that here.
To check your target framework, open your .csproj
and look for
something similar to this line
<TargetFramework>netcoreapp1.1</TargetFramework>
The important part here is netcoreapp
.
Install packages
These are the packages that will get your tests going:
You can install these by running the following commands
dotnet add package xunit
dotnet add package xunit.runner.visualstudio
dotnet add package microsoft.testplatform.testhost
Now you will need to run a dotnet restore
and dotnet build
. For safety. I think.
Optional package!
If you like having your tests run on every change, add this to your .csproj
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="1.0.0" />
</ItemGroup>
Do a dotnet restore
so that your watcher gets installed. You will
now have access to dotnet watch -h
.
Ask dotnet not to generate a Program.cs
Prior to creating any tests, we're going to add a line to the csproj
file.
What it does is avoid an error when tests are run later by asking the test
framework to not add a Program.cs
. In the csproj
file, look for
<PropertyGroup>
<TargetFramework>netcoreapp1.0</TargetFramework>
...
</PropertyGroup>
Inside that <PropertyGroup>
, add the following line:
<GenerateProgramFile>false</GenerateProgramFile>
I'll be honest, Andrew Lock has done all the hardwork on figuring out what causes an error and why. I definitely suggest you checkout his post: Fixing the error "Program has more than one entry point defined" for console apps containing xUnit tests.
Create a test test
Now lets create a simple test. The file can be placed anywhere
as xunit should look for [Fact]
s and [Theory]
s.
// __tests__/Test.test.cs
using Xunit;
namespace AProjectName.Tests
{
public class Test
{
[Fact]
public void OneIsEqualToOne()
{
Assert.Equal(1, 1);
}
}
}
You can learn more abour writing tests from the xunit documentation.
The moment of truth! Hop over to your console and run
dotnet test
or dotnet watch test
. You should see output
that looks similar to this:
Build started, please wait...
Build completed.
Test run for D:\AProjectName\bin\Debug\netcoreapp1.1\AProjectName.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.7076855] Discovering: AProjectName
[xUnit.net 00:00:00.8317487] Discovered: AProjectName
[xUnit.net 00:00:00.8899867] Starting: AProjectName
[xUnit.net 00:00:01.0408994] Finished: AProjectName
Total tests: 1. Passed: 1. Failed: 0. Skipped: 0.
Test Run Successful.
Test execution time: 1.9250 Seconds
Tests are executing!
Finale
As I mentioned earlier, .NET is a big place. Here are a few resources I used to get this post together and so that you can build more complex setups for your projects.