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 az alkalmazásprojektet és a tesztprojektet külön mappákba helyezze. 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 MonthlyReportRecords típusokat ad AccountInformation hozzá a projekthez, a projektfájl struktúrája 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 nem lenne könnyű navigálni és karbantartani azzal a sok fájllal, amely a projekt gyökérkönyvtárát szemeteli.

A projekt rendszerezéséhez hozzon létre egy új mappát, és adja neki a Models nevet a típusfájlok tárolásához. Helyezze a típusfájlokat a Models (Modellek) mappába:

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

Könnyen navigálhat és karbantarthat olyan projekteket, amelyek logikailag mappákba csoportosítják a fájlokat. 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

Az alábbi lépések végrehajtásához kövesse a NewTypes Pets Sample (Újtípusok háziállatmintája ) lehetőséget, vagy hozzon létre saját fájlokat és mappákat. A típusok logikailag egy olyan mappastruktúrába vannak rendezve, amely lehetővé teszi további típusok hozzáadását később, és a tesztek logikailag is a mappákba kerülnek, amelyek lehetővé teszik a további tesztek későbbi hozzáadását.

A minta két típust tartalmaz, Dog és Categy közös felületet implementál velük: IPet. NewTypes A projekt célja, hogy a kisállatokkal kapcsolatos típusokat egy Háziállat mappába rendezze. Ha később újabb típuskészletet ad hozzá, például a WildAnimals a Háziállatok mappa mellett a NewTypes mappába kerül. A WildAnimals mappa tartalmazhat olyan állattípusokat, 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>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Futtassa 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 új kisállattípust (például egy Bird) adhat hozzá. Adja meg a madár módszerét TalkToOwnerTweet! a tulajdonosnak. Futtassa ismét az alkalmazást. A kimenet a következőket tartalmazza: 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 annak ellenőrzéséhez, hogy megfelelően működnek-e.

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 futtassa 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 add reference következő parancsot:

dotnet add reference ../../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>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>

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 keretrendszere
  • xunit.runner.visualstudio, a tesztfuttató
  • NewTypes, a tesztelni kívánt kód

Módosítsa a UnitTest1.cs nevet PetTests.cs értékre, é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 olyan típust Bird adott hozzá, amely egy értéket ad Tweet! a tulajdonosnak, adjon hozzá egy tesztmetódust a PetTests.cs fájlhoz, hogy ellenőrizze, BirdTalkToOwnerReturnsTweethogy a TalkToOwner metódus megfelelően működik-e a Bird típushoz.

Megjegyzés

Bár elvárja, hogy a és actual az expected értékek egyenlőek legyenek, az Assert.NotEqual ellenőrzéssel való 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, módosítsa a helyességi feltételt, 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árt módon a tesztelés sikertelen lesz, é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)

Módosítsa a tesztek helyességi adatait 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 passz. A kisállattípusok metódusai a megfelelő értékeket adják vissza, amikor a tulajdonoshoz beszélnek.

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