Share via


Organizzazione e test di progetti con l'interfaccia della riga di comando di .NET

Questa esercitazione segue Esercitazione: Creare un'applicazione console .NET con Visual Studio Code e va oltre la creazione di una semplice app console, illustrando lo sviluppo di applicazioni più avanzate e organizzate. L'esercitazione indica come usare le cartelle per organizzare il codice, quindi illustra come estendere un'applicazione console con il framework di test xUnit.

Nota

Questa esercitazione consiglia di inserire il progetto dell'applicazione e il progetto di test in cartelle separate. Alcuni sviluppatori preferiscono mantenere questi progetti nella stessa cartella. Per altre informazioni, vedere il problema di GitHub #26395 in dotnet/docs.

Uso di cartelle per organizzare il codice

È possibile introdurre nuovi tipi in un'app console aggiungendo all'app i file contenenti i tipi. Se ad esempio si aggiungono al progetto file contenenti i tipi AccountInformation e MonthlyReportRecords, la struttura dei file di progetto resta semplice e facile da esplorare:

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

Tuttavia questa struttura semplice funziona bene solo quando le dimensioni del progetto sono relativamente piccole. Si supponga di aggiungere 20 tipi al progetto. La navigazione e la manutenzione diventano più complicate per la presenza di molti file nella directory radice del progetto.

Per organizzare il progetto, creare una nuova cartella per l'archiviazione dei file dei tipi e denominarla Models. Inserire i file dei tipi nella cartella Models:

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

La navigazione e la manutenzione risultano più facili nei progetti che raggruppano i file in cartelle mediante codice. Nella sezione successiva viene creato un esempio più complesso con cartelle e unit test.

Organizzare ed eseguire test con l'esempio NewTypes Pets

Prerequisiti

Compilare l'esempio

Nelle fasi successive è possibile seguire il progetto di esempio NewTypes Pets o creare file e cartelle personalizzati. I tipi sono organizzati mediante codice in una struttura di cartelle che consente l'aggiunta di più tipi in un secondo momento. A loro volta i test sono inseriti mediante codice in cartelle che consentono l'aggiunta di altri test in un secondo momento.

L'esempio contiene due tipi Dog e Cat e definisce l'implementazione dell'interfaccia comune IPet. Per il progetto NewTypes l'obiettivo è l'organizzazione dei tipi associati agli animali domestici in una cartella Pets. Se in seguito viene aggiunto un altro set di tipi, ad esempio WildAnimals, questi vengono inseriti nella cartella NewTypes allo stesso livello della cartella Pets. La cartella WildAnimals può contenere tipi corrispondenti ad animali non domestici, ad esempio i tipi Squirrel e Rabbit. In questo modo mano a mano che vengono aggiunti dei tipi il progetto mantiene un'organizzazione ottimale.

Creare la seguente struttura di cartelle con il contenuto di file indicato:

/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>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Eseguire il comando seguente:

dotnet run

L'output è il seguente:

Woof!
Meow!

Esercizio facoltativo: aggiungere un nuovo tipo di animale domestico, ad esempio Bird, estendendo il progetto. Fare in modo che il metodo TalkToOwner corrispondente all'uccellino restituisca Tweet! al proprietario. Eseguire nuovamente l'app. L'output includerà Tweet!.

Test dell'esempio

Il progetto NewTypes è attivo ed è stato organizzato inserendo i tipi associati agli animali da compagnia in una cartella. Creare il progetto di test e iniziare a creare test con il framework di test xUnit. Il testing unità permette di controllare automaticamente il comportamento dei tipi di animali domestici per verificare che funzionino correttamente.

Tornare alla cartella src e creare una cartella test contenente una sottocartella NewTypesTests. Al prompt dei comandi della cartella NewTypesTests eseguire dotnet new xunit. Questo comando genera due file: NewTypesTests.csproj e UnitTest1.cs.

Il progetto di test non può attualmente testare i tipi in NewTypes e richiede un riferimento al progetto NewTypes. Per aggiungere un riferimento al progetto usare il comando dotnet add reference:

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

In alternativa è possibile aggiungere manualmente il riferimento al progetto aggiungendo un nodo <ItemGroup> al file NewTypesTests.csproj:

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

NewTypesTests.csproj:

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

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

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

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

</Project>

Il file NewTypesTests.csproj contiene i riferimenti al pacchetto seguenti:

  • Microsoft.NET.Test.Sdk: infrastruttura di test .NET
  • xunit: framework di test xUnit
  • xunit.runner.visualstudio: test runner
  • NewTypes: codice da testare

Sostituire il nome di UnitTest1.cs con PetTests.cs e sostituire il codice nel file con il codice seguente:

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);
    }
}

Esercizio facoltativo: se in precedenza è stato aggiunto un tipo Bird che restituisce Tweet! al proprietario, aggiungere al file PetTests.cs un metodo di test BirdTalkToOwnerReturnsTweet per verificare che il metodo TalkToOwner funzioni correttamente per il tipo Bird.

Nota

Anche se si prevede che i valori expected e actual siano uguali, un'asserzione iniziale con le verifiche Assert.NotEqual specifica che questi valori sono not equal (diversi). Per verificare la logica del test, inizialmente creare sempre i test in modo che diano esito negativo. Dopo aver confermato che il test non riesce, modificare l'asserzione per fare in modo che il test venga superato.

Di seguito viene riportata la struttura completa del progetto:

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

Iniziare nella directory test/NewTypesTests. Eseguire i test con il comando dotnet test. Questo comando avvia il Test Runner specificato nel file di progetto.

Come previsto, i test hanno esito negativo e la console visualizza il seguente output:

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)

Modificare le asserzioni dei test da Assert.NotEqual a 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);
    }
}

Eseguire nuovamente i test con il comando dotnet test. Verrà restituito l'output seguente:

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)

I test hanno esito positivo. I metodi dei tipi di animali da compagnia restituiscono i valori corretti nei messaggi trasmessi al proprietario.

Si sono apprese tecniche per l'organizzazione e il test di progetti con xUnit. Continuare con queste tecniche applicandole nei propri progetti. Buona codifica!