.NET

4 abr, 2017

Teste Contínuo para core .Net

Publicidade

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\netcoreapp1.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 🙂

watch : Started
Build started, please wait...
Build completed.

Test run for C:\dev\temp\test\bin\Debug\netcoreapp1.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\netcoreapp1.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/