Condividi tramite


Test di unità per C# con NUnit e .NET Core

Questa esercitazione illustra un'esperienza interattiva che crea una soluzione di esempio dettagliata per apprendere i concetti di unit test. Se preferisci seguire il tutorial usando una soluzione predefinita, visualizza o scarica il codice di esempio prima di iniziare. Per istruzioni sul download, vedere esempi ed esercitazioni .

Questo articolo descrive il test di un progetto .NET Core. Se si sta testando un progetto ASP.NET Core, vedere test di integrazione in ASP.NET Core.

Prerequisiti

  • La versione più recente .NET SDK
  • editor di Visual Studio Code
  • Il DevKit C#

Creazione del progetto di origine

Aprire una finestra della shell. Creare una directory denominata unit-testing-using-nunit per contenere la soluzione. In questa nuova directory eseguire il comando seguente per creare un nuovo file di soluzione per la libreria di classi e il progetto di test:

dotnet new sln

Creare quindi una directory PrimeService . Il seguente schema mostra la struttura di directory e file:

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService

Impostare PrimeService sulla directory corrente ed eseguire il comando seguente per creare il progetto di origine:

dotnet new classlib

Rinominare Class1.cs in PrimeService.cs. Si crea un'implementazione non riuscita della classe PrimeService:

using System;

namespace Prime.Services
{
    public class PrimeService
    {
        public bool IsPrime(int candidate)
        {
            throw new NotImplementedException("Please create a test first.");
        }
    }
}

Cambia la directory tornando alla directory unit-testing-using-nunit. Eseguire il comando seguente per aggiungere il progetto di libreria di classi alla soluzione:

dotnet sln add PrimeService/PrimeService.csproj

Creazione del progetto di test

Creare quindi la directory PrimeService.Tests. La seguente illustrazione mostra la struttura della directory:

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

Impostare la directory PrimeService.Tests nella directory corrente e creare un nuovo progetto usando il comando seguente:

dotnet new nunit

Il comando dotnet new crea un progetto di test che usa NUnit come libreria di test. Il modello generato configura il test runner nel file PrimeService.Tests.csproj :

<ItemGroup>
  <PackageReference Include="nunit" Version="4.3.2" />
  <PackageReference Include="NUnit3TestAdapter" Version="5.0.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
  <PackageReference Include="NUnit.Analyzers" Version="4.9.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
  </PackageReference>
</ItemGroup>

Annotazioni

Prima di .NET 9, il codice generato può fare riferimento a versioni precedenti del framework di test NUnit. È possibile usare l'interfaccia della riga di comando dotnet per aggiornare i pacchetti. In alternativa, aprire il file PrimeService.Tests.csproj e sostituire il contenuto del gruppo di elementi dei riferimenti al pacchetto con il codice precedente.

Il progetto di test richiede altri pacchetti per creare ed eseguire unit test. Il dotnet new comando nel passaggio precedente ha aggiunto Microsoft test SDK, il framework di test NUnit e l'adattatore di test NUnit. Aggiungere ora la libreria di classi PrimeService come altra dipendenza al progetto. Usare il comando dotnet reference add:

dotnet reference add ../PrimeService/PrimeService.csproj

È possibile visualizzare l'intero file nel repository degli esempi su GitHub.

La struttura seguente illustra il layout finale della soluzione:

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.csproj

Eseguire il comando seguente nella directory unit-testing-using-nunit :

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

Creazione del primo test

Si scrive un test con esito negativo, si passa e quindi si ripete il processo. Nella directory PrimeService.Tests rinominare il file UnitTest1.cs in PrimeService_IsPrimeShould.cs e sostituirne l'intero contenuto con il codice seguente:

using NUnit.Framework;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    [TestFixture]
    public class PrimeService_IsPrimeShould
    {
        private PrimeService _primeService;

        [SetUp]
        public void SetUp()
        {
            _primeService = new PrimeService();
        }

        [Test]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            var result = _primeService.IsPrime(1);

            Assert.That(result, Is.False, "1 should not be prime");
        }
    }
}

L'attributo [TestFixture] indica una classe che contiene unit test. L'attributo [Test] indica che un metodo è un metodo di test.

Salvare questo file ed eseguire il dotnet test comando per compilare i test e la libreria di classi ed eseguire i test. Il test runner NUnit contiene il punto di ingresso del programma per eseguire i test. dotnet test avvia lo strumento di esecuzione dei test usando il progetto di test unitario che hai creato.

Il tuo test fallisce. L'implementazione non è ancora stata creata. Passare il test scrivendo il codice più semplice nella PrimeService classe che funziona:

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Please create a test first.");
}

Nella directory unit-testing-using-nunit eseguire dotnet test di nuovo. Il comando dotnet test esegue una compilazione per il progetto PrimeService e quindi per il progetto PrimeService.Tests. Dopo aver compilato entrambi i progetti, viene eseguito questo singolo test. Passa.

Aggiunta di altre funzionalità

Ora che hai superato un test, è il momento di scrivere altri test. Esistono alcuni altri semplici casi per i numeri primi: 0, -1. È possibile aggiungere nuovi test con l'attributo [Test] , ma questo diventa rapidamente noioso. Esistono altri attributi NUnit che consentono di scrivere una suite di test simili. Un [TestCase] attributo viene usato per creare un gruppo di test che eseguono lo stesso codice ma hanno argomenti di input diversi. È possibile usare l'attributo [TestCase] per specificare i valori per tali input.

Anziché creare nuovi test, applicare questo attributo per creare un singolo test basato sui dati. Il test basato sui dati è un metodo che verifica diversi valori minori di due, ovvero il numero primo più basso:

[TestCase(-1)]
[TestCase(0)]
[TestCase(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
    var result = _primeService?.IsPrime(value);

    Assert.That(result, Is.False, $"{value} should not be prime");
}

Esegui dotnet test e due di questi test falliscono. Per superare tutti i test, modificare la if clausola all'inizio del Main metodo nel file PrimeService.cs :

if (candidate < 2)

Continuare a eseguire l'iterazione aggiungendo altri test, teorie e codice nella libreria principale. È stata completata la versione dei test e l'implementazione completa della libreria.

Hai creato una piccola libreria e un set di test unitari per tale libreria. È stata strutturata anche la soluzione in modo che l'aggiunta di nuovi pacchetti e test faccia parte del flusso di lavoro standard. La maggior parte del tempo e dello sforzo è stata concentrata sulla risoluzione degli obiettivi dell'applicazione.