O Visual Studio 2017 já chegou e está incrível. Uma das melhores funcionalidades que eu vi é o Teste Unitário em Tempo Real. A má notícia é: ele ainda não suporta o core .Net.

Não é o mesmo, mas algo que você pode utilizar para executar automaticamente seus testes, sempre que você mudar alguns arquivos, é a linha de comando dotnet watch.

Vamos criar um exemplo

Crie sua biblioteca:

C:\dev\temp>md lib C:\dev\temp>cd lib C:\dev\temp\lib>dotnet new classlib Content generation time: 100,8878 ms The template "Class library" created successfully. C:\dev\temp\lib>dotnet restore Restoring packages for C:\dev\temp\lib\lib.csproj... Generating MSBuild file C:\dev\temp\lib\obj\lib.csproj.nuget.g.props. Generating MSBuild file C:\dev\temp\lib\obj\lib.csproj.nuget.g.targets. Writing lock file to disk. Path: C:\dev\temp\lib\obj\project.assets.json Restore completed in 1,69 sec for C:\dev\temp\lib\lib.csproj. NuGet Config files used: C:\Users\andrecarlucci\AppData\Roaming\NuGet\NuGet.Config C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config Feeds used: https://api.nuget.org/v3/index.json C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\ C:\dev\temp\lib>cd..

Crie seu projeto teste:

C:\dev\temp>md test C:\dev\temp>cd test C:\dev\temp\test>dotnet new xunit Content generation time: 59,5689 ms The template "xUnit Test Project" created successfully. C:\dev\temp\test>

Adicione a referência à biblioteca do seu projeto:

Abra seu test.csproj e adicione essa sessão em qualquer ponto.

<ItemGroup> <ProjectReference Include="..\test\test.csproj" /> </ItemGroup>

Adicione a ferramenta DotNet Watcher ao seu projeto teste

Ainda com seu test.csproj aberto, adicione um outro ItemGroup:

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

Salve e digite:

C:\dev\temp\test>dotnet restore

Finalmente, inicie seus testes contínuos:

C:\dev\temp\test>dotnet watch test [90mwatch : [39mStarted Build started, please wait... Build completed. Test run for C:\dev\temp\test\bin\Debug

etcoreapp1.1\test.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:01.1104495] Discovering: test [xUnit.net 00:00:01.3775817] Discovered: test [xUnit.net 00:00:01.4713129] Starting: test [xUnit.net 00:00:01.7878213] Finished: test Total tests: 1. Passed: 1. Failed: 0. Skipped: 0. Test Run Successful. Test execution time: 3,8320 Seconds [90mwatch : [39mExited [90mwatch : [39m[93mWaiting for a file to change before restarting dotnet...[39m

Note a mensagem que está aguardando por mudanças nos arquivos 🙂

Modifique seu teste/biblioteca do projeto e verifique os resultados

Em seu test/UnitTest1.cs

using lib; ... [Fact] public void Test1() { Assert.Equal(2, new Class1().DoubleIt(1)); }

E sua lib/Class1.cs

public int DoubleIt(int value) { return 0; }

Salve os dois, e veja seu teste falhar 🙂

[90mwatch : [39mStarted Build started, please wait... Build completed. Test run for C:\dev\temp\test\bin\Debug

etcoreapp1.1\test.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:01.0690239] Discovering: test [xUnit.net 00:00:01.3000697] Discovered: test [xUnit.net 00:00:01.3923048] Starting: test [xUnit.net 00:00:01.7705914] test.UnitTest1.Test1 [FAIL] [xUnit.net 00:00:01.7732986] Assert.Equal() Failure [xUnit.net 00:00:01.7735568] Expected: 2 [xUnit.net 00:00:01.7736792] Actual: 0 [xUnit.net 00:00:01.7756190] Stack Trace: [xUnit.net 00:00:01.7779834] C:\dev\temp\test\UnitTest1.cs(11,0): at test.UnitTest1.Test1() [xUnit.net 00:00:01.8179893] Finished: test Failed test.UnitTest1.Test1 Error Message: Assert.Equal() Failure Expected: 2 Actual: 0 Stack Trace: at test.UnitTest1.Test1() in C:\dev\temp\test\UnitTest1.cs:line 11 Total tests: 1. Passed: 0. Failed: 1. Skipped: 0. Test Run Failed. Test execution time: 3,7843 Seconds

Corrija seu teste

Em lib/Class1.cs, altere o resultado:

public int DoubleIt(int value) { return value << 1; }

E acompanhe seu cmd:

[90mwatch : [39mStarted Build started, please wait... Build completed. Test run for C:\dev\temp\test\bin\Debug

etcoreapp1.1\test.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:01.1658403] Discovering: test [xUnit.net 00:00:01.4331220] Discovered: test [xUnit.net 00:00:01.5269952] Starting: test [xUnit.net 00:00:01.8384543] Finished: test Total tests: 1. Passed: 1. Failed: 0. Skipped: 0. Test Run Successful. Test execution time: 3,8702 Seconds [90mwatch : [39mExited [90mwatch : [39m[93mWaiting for a file to change before restarting dotnet...[39m

\o/

Filtrando seus testes

Você não precisa executar todos os testes o tempo todo. Você pode filtrar eles por DisplayName, FullyQualifiedName e Traits

Esses operadores também são permitidos: = , != , e ~ (contém).

Ex.:

dotnet watch test --filter "FullyQualifiedName=YourNamespace.TestClass1.Test1"

Mais informações sobre filtragem de testes aqui.

Bons testes!

***

Artigo traduzido com autorização do autor. Publicado originalmente em http://www.andrecarlucci.com/en/continuous-testing-for-net-core/