Megosztás a következőn keresztül:


Projektek rendszerezése és tesztelése a .NET CLI-vel

Ez az oktatóanyag a következő oktatóanyagot követi: Konzolalkalmazás létrehozása a .NET-tel a Visual Studio Code használatával, amely túlmutat egy egyszerű konzolalkalmazás létrehozásán, hogy fejlett és jól szervezett alkalmazásokat fejlesszen ki. Miután bemutatta, hogyan rendszerezheti a kódot mappákkal, az oktatóanyag bemutatja, hogyan bővítheti ki a konzolalkalmazásokat az xUnit tesztelési keretrendszerrel.

Megjegyzés:

Ez az oktatóanyag azt javasolja, hogy helyezze az alkalmazásprojektet és tesztelje a projektet külön mappákba. Egyes fejlesztők inkább ugyanabban a mappában szeretnék tartani ezeket a projekteket. További információ: GitHub-probléma dotnet/docs #26395.

Mappák használata a kód rendszerezéséhez

Ha új típusokat szeretne bevezetni egy konzolalkalmazásba, ezt úgy teheti meg, hogy hozzáadja a típusokat tartalmazó fájlokat az alkalmazáshoz. Ha például fájlokat és AccountInformationMonthlyReportRecords típusokat ad hozzá a projekthez, a projektfájl szerkezete egyszerű és könnyen navigálható:

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

Ez a lapos szerkezet azonban csak akkor működik jól, ha a projekt mérete viszonylag kicsi. El tudja képzelni, mi történik, ha 20 típust ad hozzá a projekthez? A projekt biztosan nehéz lenne kezelni és karbantartani azzal a sok fájllal, amelyek ellepik a projekt gyökérkönyvtárát.

A projekt rendszerezéséhez hozzon létre egy új mappát, és nevezze el modelleknek a típusfájlok tárolásához. Helyezze a típusfájlokat a Models mappába:

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

A fájlokat logikailag mappákba csoportosító projektek könnyen navigálhatnak és karbantarthatóak. A következő szakaszban egy összetettebb mintát hoz létre mappákkal és egységteszteléssel.

Rendszerezés és tesztelés a NewTypes Pets minta használatával

Előfeltételek

A minta létrehozása

A következő lépések végrehajtásához kövesse a NewTypes Pets-mintát , vagy hozzon létre saját fájlokat és mappákat. A típusok logikailag mappastruktúrába vannak rendezve, amely lehetővé teszi, hogy később további típusok is felvehetők legyenek, a tesztek pedig logikailag a mappákba kerülnek, így később további teszteket adhatnak hozzá.

A minta két típust tartalmaz, Dog és Cat, és ezek egy közös felületet, a IPet-t valósítanak meg. NewTypes A projektnél a célod, hogy a kedvtelésből tartott állatokhoz kapcsolódó típusokat egy Háziállatok mappába rendezd. Ha később újabb típusokat ad hozzá, a WildAnimals például a Háziállatok mappa mellett a NewTypes mappába kerül. A WildAnimals mappa tartalmazhat olyan típusú állatokat, amelyek nem háziállatok, például Squirrel és Rabbit típusok. Így a típusok hozzáadásakor a projekt jól szervezett marad.

Hozza létre a következő mappastruktúrát a megadott fájltartalommal:

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

Hajtsa végre a következő parancsot:

dotnet run

Szerezze be a következő kimenetet:

Woof!
Meow!

Nem kötelező gyakorlat: A projekt kibővítésével hozzáadhat egy új háziállatfajtát, például Bird. Adja meg a madár módszerét TalkToOwnerTweet! a tulajdonosnak. Futtassa újra az alkalmazást. A kimenet tartalmazza a Tweet!

A minta tesztelése

A NewTypes projekt a helyén van, és úgy szervezte meg, hogy a háziállatokkal kapcsolatos típusokat egy mappában tartja. Ezután hozza létre a tesztprojektet, és kezdjen el teszteket írni az xUnit tesztelési keretrendszerrel. Az egységtesztelés lehetővé teszi, hogy automatikusan ellenőrizze a kisállattípusok viselkedését, hogy meggyőződjön arról, hogy megfelelően működnek.

Lépjen vissza az src mappához, és hozzon létre egy tesztmappát egy NewTypesTests mappával. A NewTypesTests mappából származó parancssorban hajtsa végre a parancsot dotnet new xunit. Ez a parancs két fájlt hoz létre: NewTypesTests.csproj és UnitTest1.cs.

A tesztprojekt jelenleg nem tudja tesztelni a típusokat, NewTypes és projekthivatkozást igényel a NewTypes projekthez. Projekthivatkozás hozzáadásához használja a dotnet reference add következő parancsot:

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

Vagy manuálisan is hozzáadhatja a projekthivatkozást úgy, hogy hozzáad egy <ItemGroup> csomópontot a NewTypesTests.csproj fájlhoz :

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

A NewTypesTests.csproj fájl a következő csomaghivatkozásokat tartalmazza:

  • Microsoft.NET.Test.Sdk, a .NET tesztelési infrastruktúrája
  • xunit, az xUnit tesztelési keretrendszer
  • xunit.runner.visualstudio, a tesztfuttató
  • NewTypes, a tesztelni kívánt kód

Módosítsa a UnitTest1.cs nevét PetTests.cs , és cserélje le a fájlban lévő kódot a következő kódra:

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

Nem kötelező gyakorlat: Ha korábban hozzáadott egy típust Bird , amely a tulajdonosnak ad Tweet! eredményt, adjon hozzá egy tesztmetódust a PetTests.cs fájlhoz, és ellenőrizze, BirdTalkToOwnerReturnsTweethogy a TalkToOwner metódus megfelelően működik-e a Bird típushoz.

Megjegyzés:

Bár elvárja, hogy az értékek és expected az actual értékek egyenlőek legyenek, az Assert.NotEqual ellenőrzéssel ellátott kezdeti állítás azt határozza meg, hogy ezek az értékek nem egyenlők. Mindig először hozzon létre egy sikertelen tesztet a teszt logikájának ellenőrzéséhez. Miután meggyőződett arról, hogy a teszt sikertelen, állítsa be az állítást, hogy a teszt sikeres legyen.

Az alábbiakban a teljes projektstruktúra látható:

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

Kezdje a test/NewTypesTests könyvtárban. Futtassa a teszteket a dotnet test paranccsal. Ez a parancs elindítja a projektfájlban megadott tesztfuttatót.

A vártnak megfelelően a tesztelés meghiúsul, és a konzol a következő kimenetet jeleníti meg:

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)

A tesztek helyességi beállításainak módosítása a következőre Assert.NotEqualAssert.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);
    }
}

Futtassa újra a teszteket a dotnet test paranccsal, és szerezze be a következő kimenetet:

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)

Tesztelési passzok. A kisállattípusok módszerei a megfelelő értékeket adják vissza, amikor a tulajdonoshoz beszélnek.

Elsajátította a projektek xUnit használatával történő szervezésének és tesztelésének technikáját. Folytassa ezekkel a technikákkal, amelyek saját projektjeiben alkalmazzák őket. Boldog kódolást!