Uspořádání a testování projektů pomocí rozhraní příkazového řádku .NET

Tento kurz sleduje kurz: Vytvoření konzolové aplikace s .NET pomocí editoru Visual Studio Code, které vás přemístí nad rámec vytvoření jednoduché konzolové aplikace k vývoji pokročilých a dobře uspořádaných aplikací. Poté, co vám ukážeme, jak pomocí složek uspořádat kód, se v kurzu dozvíte, jak rozšířit konzolovou aplikaci o testovací architekturu xUnit .

Poznámka

Tento kurz doporučuje umístit projekt aplikace a testovací projekt do samostatných složek. Někteří vývojáři dávají přednost tomu, aby tyto projekty zůstaly ve stejné složce. Další informace najdete v tématu o problému githubu dotnet/docs #26395.

Uspořádání kódu pomocí složek

Pokud chcete do konzolové aplikace zavést nové typy, můžete to udělat přidáním souborů obsahujících typy do aplikace. Pokud například do projektu přidáte soubory obsahující AccountInformation a MonthlyReportRecords typy, bude struktura souborů projektu plochá a snadno se naviguje:

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

Tato plochá struktura však funguje dobře pouze v případě, že je velikost projektu relativně malá. Dokážete si představit, co se stane, když do projektu přidáte 20 typů? Projekt by rozhodně nebylo snadné navigovat a udržovat s tolika soubory, které zahazují kořenový adresář projektu.

Pokud chcete projekt uspořádat, vytvořte novou složku a pojmenujte ji Modely , do které se budou ukládat soubory typu. Umístěte soubory typů do složky Modely :

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

Projekty, které logicky seskupují soubory do složek, se snadno navigují a udržují. V další části vytvoříte složitější ukázku se složkami a testováním jednotek.

Uspořádání a testování pomocí ukázky NewTypes Pets

Požadavky

Sestavení ukázky

Následující kroky můžete sledovat pomocí ukázky NewTypes Pets nebo si vytvořit vlastní soubory a složky. Typy jsou logicky uspořádány do struktury složek, která umožňuje přidání dalších typů později, a testy jsou také logicky umístěny do složek, které umožňují přidat další testy později.

Ukázka obsahuje dva typy Dog a Cata a implementuje společné rozhraní IPet. NewTypes Pro projekt je vaším cílem uspořádat typy související s domácími mazlíčky do složky Domácí mazlíčci. Pokud se později přidá další sada typů, například WildAnimals , umístí se do složky NewTypes vedle složky Pets . Složka WildAnimals může obsahovat typy pro zvířata, která nejsou domácí zvířata, například Squirrel typy a Rabbit . Tímto způsobem, jak se přidávají typy, zůstane projekt dobře uspořádaný.

Vytvořte následující strukturu složek se zadaným obsahem souboru:

/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>

Spusťte následující příkaz:

dotnet run

Získejte následující výstup:

Woof!
Meow!

Volitelné cvičení: Rozšířením tohoto projektu můžete přidat nový typ domácího Birdmazlíčka, například . Udělejte metodu ptáka TalkToOwner dát Tweet! majiteli. Spusťte aplikaci znovu. Výstup bude obsahovat Tweet!

Testování ukázky

Projekt NewTypes je na svém místě a uspořádali jste ho tak, že ve složce uchováváte typy související s domácími mazlíčky. Dále vytvořte testovací projekt a začněte psát testy pomocí testovací architektury xUnit . Testování jednotek umožňuje automaticky zkontrolovat chování typů domácích mazlíčků a ověřit, že fungují správně.

Přejděte zpět do složky src a vytvořte testovací složku se složkou NewTypesTests . Na příkazovém řádku ze složky NewTypesTests spusťte dotnet new xunitpříkaz . Tento příkaz vytvoří dva soubory: NewTypesTests.csproj a UnitTest1.cs.

Testovací projekt momentálně nemůže testovat typy v NewTypes a vyžaduje odkaz na NewTypes projekt. Pokud chcete přidat odkaz na projekt, použijte příkaz dotnet add reference :

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

Nebo máte také možnost přidat odkaz na projekt ručně přidáním <ItemGroup> uzlu do souboru 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.7.1" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.5.8" />
  </ItemGroup>

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

</Project>

Soubor NewTypesTests.csproj obsahuje následující odkazy na balíčky:

  • Microsoft.NET.Test.Sdk, testovací infrastruktura .NET
  • xunit, testovací architektura xUnit
  • xunit.runner.visualstudio, test runner
  • NewTypes, kód, který se má otestovat

Změňte název UnitTest1.cs na PetTests.cs a nahraďte kód v souboru následujícím kódem:

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

Volitelné cvičení: Pokud jste dříve přidali Bird typ, který dává Tweet! vlastníku, přidejte testovací metodu do souboru PetTests.cs , abyste zkontrolovali, BirdTalkToOwnerReturnsTweetže TalkToOwner metoda funguje správně pro daný Bird typ.

Poznámka

I když očekáváte, že expected hodnoty a actual jsou stejné, počáteční kontrolní výraz s kontrolou Assert.NotEqual určuje, že tyto hodnoty nejsou stejné. Vždy nejprve vytvořte test, který selže, aby se zkontrolovala logika testu. Po potvrzení, že test selže, upravte kontrolní výraz tak, aby test prošel.

Následující příklad ukazuje kompletní strukturu projektu:

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

Začněte v adresáři test/NewTypesTests . Spusťte testy pomocí dotnet test příkazu . Tento příkaz spustí test runner zadaný v souboru projektu.

Podle očekávání se testování nezdaří a konzola zobrazí následující výstup:

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)

Změňte kontrolní výrazy testů z Assert.NotEqual na 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);
    }
}

Znovu spusťte testy pomocí dotnet test příkazu a získejte následující výstup:

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)

Testování proběhne úspěšně. Metody domácího mazlíčka vracejí správné hodnoty při komunikaci s vlastníkem.

Naučili jste se techniky pro uspořádání a testování projektů pomocí xUnit. Pokračujte s těmito technikami a použijte je ve svých vlastních projektech. Šťastné kódování!