Partilhar via


Organizar e testar projetos com a CLI de .NET

Este tutorial segue o Tutorial: Criar uma aplicação de consola com .NET com o Visual Studio Code, levando-o para além da criação de uma aplicação de consola simples para desenvolver aplicações avançadas e bem organizadas. Depois de lhe mostrar como utilizar pastas para organizar o código, o tutorial mostra-lhe como expandir uma aplicação de consola com a arquitetura de teste xUnit .

Nota

Este tutorial recomenda que coloque o projeto da aplicação e teste o projeto em pastas separadas. Alguns programadores preferem manter estes projetos na mesma pasta. Para obter mais informações, veja Dotnet/docs do problema do GitHub #26395.

Utilizar pastas para organizar código

Se quiser introduzir novos tipos numa aplicação de consola, pode fazê-lo ao adicionar ficheiros que contenham os tipos à aplicação. Por exemplo, se adicionar ficheiros que AccountInformation contenham e MonthlyReportRecords tipos ao seu projeto, a estrutura de ficheiros do projeto é simples e fácil de navegar:

/MyProject
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs

No entanto, esta estrutura plana só funciona bem quando o tamanho do projeto é relativamente pequeno. Consegue imaginar o que acontecerá se adicionar 20 tipos ao projeto? O projeto definitivamente não seria fácil de navegar e manter com tantos ficheiros que espalham o diretório raiz do projeto.

Para organizar o projeto, crie uma nova pasta e dê-lhe o nome Modelos para conter os ficheiros de tipo. Coloque os ficheiros de tipo na pasta Modelos :

/MyProject
|__/Models
   |__AccountInformation.cs
   |__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs

Os projetos que agruparem logicamente ficheiros em pastas são fáceis de navegar e manter. Na secção seguinte, vai criar um exemplo mais complexo com pastas e testes de unidades.

Organizar e testar com o Exemplo de Animais de Estimação NewTypes

Pré-requisitos

Criar o exemplo

Para obter os seguintes passos, pode acompanhar com o Exemplo de Animais de Estimação NewTypes ou criar os seus próprios ficheiros e pastas. Os tipos são logicamente organizados numa estrutura de pastas que permite a adição de mais tipos mais tarde e os testes também são colocados logicamente em pastas que permitem a adição de mais testes mais tarde.

O exemplo contém dois tipos Dog e Cat, e tem-nos a implementar uma interface comum, IPet. Para o projeto, o NewTypes seu objetivo é organizar os tipos relacionados com animais de estimação numa pasta Animais de Estimação . Se outro conjunto de tipos for adicionado mais tarde, wildAnimals , por exemplo, são colocados na pasta NewTypes juntamente com a pasta Pets . A pasta WildAnimals pode conter tipos para animais que não são animais de estimação, como Squirrel e Rabbit tipos. Desta forma, à medida que os tipos são adicionados, o projeto permanece bem organizado.

Crie a seguinte estrutura de pastas com conteúdo de ficheiro indicado:

/NewTypes
|__/src
   |__/NewTypes
      |__/Pets
         |__Dog.cs
         |__Cat.cs
         |__IPet.cs
      |__Program.cs
      |__NewTypes.csproj

IPet.cs:

using System;

namespace Pets
{
    public interface IPet
    {
        string TalkToOwner();
    }
}

Dog.cs:

using System;

namespace Pets
{
    public class Dog : IPet
    {
        public string TalkToOwner() => "Woof!";
    }
}

Cat.cs:

using System;

namespace Pets
{
    public class Cat : IPet
    {
        public string TalkToOwner() => "Meow!";
    }
}

Program.cs:

using System;
using Pets;
using System.Collections.Generic;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            List<IPet> pets = new List<IPet>
            {
                new Dog(),
                new Cat()
            };

            foreach (var pet in pets)
            {
                Console.WriteLine(pet.TalkToOwner());
            }
        }
    }
}

NewTypes.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Execute o seguinte comando:

dotnet run

Obtenha o seguinte resultado:

Woof!
Meow!

Exercício opcional: pode adicionar um novo tipo de animal de estimação, como um Bird, ao expandir este projeto. Faça com que o método do TalkToOwner pássaro dê um Tweet! ao proprietário. Execute novamente a aplicação. A saída incluirá Tweet!

Testar o exemplo

O NewTypes projeto está implementado e organizou-o ao manter os tipos relacionados com animais de estimação numa pasta. Em seguida, crie o projeto de teste e comece a escrever testes com a arquitetura de teste xUnit . O teste de unidades permite-lhe verificar automaticamente o comportamento dos seus tipos de animais de estimação para confirmar que estão a funcionar corretamente.

Navegue de volta para a pasta src e crie uma pasta de teste com uma pasta NewTypesTests na mesma. Numa linha de comandos da pasta NewTypesTests , execute dotnet new xunit. Este comando produz dois ficheiros: NewTypesTests.csproj e UnitTest1.cs.

Atualmente, o projeto de teste não consegue testar os tipos e NewTypes requer uma referência de projeto para o NewTypes projeto. Para adicionar uma referência de projeto, utilize o dotnet add reference comando:

dotnet add reference ../../src/NewTypes/NewTypes.csproj

Em alternativa, também tem a opção de adicionar manualmente a referência do projeto ao adicionar um <ItemGroup> nó ao ficheiro NewTypesTests.csproj :

<ItemGroup>
  <ProjectReference Include="../../src/NewTypes/NewTypes.csproj" />
</ItemGroup>

NewTypesTests.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
    <PackageReference Include="xunit" Version="2.8.1" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.8.1" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="../../src/NewTypes/NewTypes.csproj"/>
  </ItemGroup>

</Project>

O ficheiro NewTypesTests.csproj contém as seguintes referências de pacote:

  • Microsoft.NET.Test.Sdk, a infraestrutura de teste .NET
  • xunit, a arquitetura de teste xUnit
  • xunit.runner.visualstudio, o corredor de teste
  • NewTypes, o código a testar

Altere o nome de UnitTest1.cs para PetTests.cs e substitua o código no ficheiro pelo seguinte código:

using System;
using Xunit;
using Pets;

public class PetTests
{
    [Fact]
    public void DogTalkToOwnerReturnsWoof()
    {
        string expected = "Woof!";
        string actual = new Dog().TalkToOwner();

        Assert.NotEqual(expected, actual);
    }

    [Fact]
    public void CatTalkToOwnerReturnsMeow()
    {
        string expected = "Meow!";
        string actual = new Cat().TalkToOwner();

        Assert.NotEqual(expected, actual);
    }
}

Exercício opcional: se tiver adicionado um Bird tipo anterior que produza um Tweet! ao proprietário, adicione um método de teste ao ficheiro PetTests.cs , BirdTalkToOwnerReturnsTweetpara verificar se o TalkToOwner método funciona corretamente para o Bird tipo.

Nota

Embora espere que os expected valores e actual sejam iguais, uma afirmação inicial com a Assert.NotEqual verificação especifica que estes valores não são iguais. Crie sempre inicialmente um teste para falhar para verificar a lógica do teste. Depois de confirmar que o teste falha, ajuste a asserção para permitir que o teste passe.

O seguinte mostra a estrutura completa do projeto:

/NewTypes
|__/src
   |__/NewTypes
      |__/Pets
         |__Dog.cs
         |__Cat.cs
         |__IPet.cs
      |__Program.cs
      |__NewTypes.csproj
|__/test
   |__NewTypesTests
      |__PetTests.cs
      |__NewTypesTests.csproj

Comece no diretório test/NewTypesTests . Execute os testes com o dotnet test comando . Este comando inicia o test runner especificado no ficheiro de projeto.

Conforme esperado, o teste falha e a consola apresenta o seguinte resultado:

Test run for C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\bin\Debug\net5.0\NewTypesTests.dll (.NETCoreApp,Version=v5.0)
Microsoft (R) Test Execution Command Line Tool Version 16.8.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.50]     PetTests.DogTalkToOwnerReturnsWoof [FAIL]
  Failed PetTests.DogTalkToOwnerReturnsWoof [6 ms]
  Error Message:
   Assert.NotEqual() Failure
Expected: Not "Woof!"
Actual:   "Woof!"
  Stack Trace:
     at PetTests.DogTalkToOwnerReturnsWoof() in C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\PetTests.cs:line 13

Failed!  - Failed:     1, Passed:     1, Skipped:     0, Total:     2, Duration: 8 ms - NewTypesTests.dll (net5.0)

Altere as afirmações dos seus testes de Assert.NotEqual para Assert.Equal:

using System;
using Xunit;
using Pets;

public class PetTests
{
    [Fact]
    public void DogTalkToOwnerReturnsWoof()
    {
        string expected = "Woof!";
        string actual = new Dog().TalkToOwner();

        Assert.Equal(expected, actual);
    }

    [Fact]
    public void CatTalkToOwnerReturnsMeow()
    {
        string expected = "Meow!";
        string actual = new Cat().TalkToOwner();

        Assert.Equal(expected, actual);
    }
}

Execute novamente os testes com o dotnet test comando e obtenha o seguinte resultado:

Test run for C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\bin\Debug\net5.0\NewTypesTests.dll (.NETCoreApp,Version=v5.0)
Microsoft (R) Test Execution Command Line Tool Version 16.8.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.

Passed!  - Failed:     0, Passed:     2, Skipped:     0, Total:     2, Duration: 2 ms - NewTypesTests.dll (net5.0)

Os testes passam. Os métodos dos tipos de animais de estimação devolvem os valores corretos ao falar com o proprietário.

Aprendeu técnicas para organizar e testar projetos com xUnit. Avance com estas técnicas que as aplicam nos seus próprios projetos. Codificação feliz!