다음을 통해 공유


.NET CLI를 사용하여 프로젝트 구성 및 테스트

이 자습서에서는 Visual Studio Code를 사용하여 .NET으로 콘솔 애플리케이션을 만들어 간단한 콘솔 앱을 만들어 고급 및 잘 구성된 애플리케이션을 개발하는 방법을 설명합니다. 폴더를 사용하여 코드를 구성하는 방법을 보여 주면 자습서에서는 xUnit 테스트 프레임워크를 사용하여 콘솔 애플리케이션을 확장하는 방법을 보여 줍니다.

비고

이 자습서에서는 애플리케이션 프로젝트 및 테스트 프로젝트를 별도의 폴더에 배치하는 것이 좋습니다. 일부 개발자는 이러한 프로젝트를 동일한 폴더에 유지하는 것을 선호합니다. 자세한 내용은 GitHub 문제 dotnet/docs #26395를 참조하세요.

폴더를 사용하여 코드 구성

콘솔 앱에 새 형식을 도입하려면 해당 형식이 포함된 파일을 앱에 추가하여 이 작업을 수행할 수 있습니다. 예를 들어 포함된 파일과 MonthlyReportRecords 형식을 AccountInformation 프로젝트에 추가하는 경우 프로젝트 파일 구조는 평평하고 탐색하기 쉽습니다.

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

그러나 이 플랫 구조는 프로젝트의 크기가 상대적으로 작은 경우에만 잘 작동합니다. 프로젝트에 20가지 형식을 추가하면 어떻게 될지 상상할 수 있나요? 이 프로젝트는 프로젝트의 루트 디렉터리를 뒤덮는 많은 파일로 탐색하고 유지 관리하기가 쉽지 않을 것입니다.

프로젝트를 구성하려면 새 폴더를 만들고 이름을 Models 로 지정하여 형식 파일을 저장합니다. 모델 폴더에 형식 파일을 배치합니다.

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

파일을 폴더로 논리적으로 그룹화한 프로젝트는 쉽게 탐색하고 유지 관리할 수 있습니다. 다음 섹션에서는 폴더 및 단위 테스트를 사용하여 더 복잡한 샘플을 만듭니다.

NewTypes 애완 동물 샘플을 사용하여 구성 및 테스트

필수 조건

샘플 빌드

다음 단계에서는 NewTypes Pets 샘플을 사용하거나 사용자 고유의 파일 및 폴더를 만들 수 있습니다. 형식은 나중에 더 많은 형식을 추가하도록 허용하는 폴더 구조로 논리적으로 구성되며, 나중에 더 많은 테스트를 추가하도록 허용하는 테스트도 폴더에 논리적으로 배치됩니다.

샘플에는 두 가지 형식 Dog 이 포함되며 Cat공통 인터페이스 IPet를 구현합니다. NewTypes 프로젝트의 목표는 애완 동물 관련 유형을 애완 동물 폴더로 구성하는 것입니다. 예를 들어 나중에 다른 형식 집합이 추가되면 WildAnimalsPets 폴더와 함께 NewTypes 폴더에 배치됩니다. WildAnimals 폴더에는 애완 동물이 아닌 동물 유형(예: Squirrel 형식)이 Rabbit 포함될 수 있습니다. 이러한 방식으로 형식이 추가되면 프로젝트가 잘 구성됩니다.

파일 콘텐츠가 표시된 다음 폴더 구조를 만듭니다.

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

다음 명령을 실행합니다.

dotnet run

다음 출력을 가져옵니다.

Woof!
Meow!

선택적 연습: 이 프로젝트를 확장하여 새 애완 동물 유형(예: />)을 추가할 수 있습니다. 새의 TalkToOwner 메서드가 소유자에게 제공 Tweet! 되도록 합니다. 앱을 다시 실행합니다. 출력에는 다음이 포함됩니다. Tweet!

샘플 테스트

프로젝트가 NewTypes 준비되었으며, 애완 동물 관련 형식을 폴더에 보관하여 구성했습니다. 다음으로, 테스트 프로젝트를 만들고 xUnit 테스트 프레임워크를 사용하여 테스트 작성을 시작합니다. 단위 테스트를 사용하면 애완 동물 유형의 동작을 자동으로 확인하여 제대로 작동하는지 확인할 수 있습니다.

src 폴더로 돌아가서 NewTypesTests 폴더를 사용하여 테스트 폴더를 만듭니다. NewTypesTests 폴더의 명령 프롬프트에서 .dotnet new xunit 이 명령은 NewTypesTests.csprojUnitTest1.cs 두 개의 파일을 생성합니다.

테스트 프로젝트는 현재 형식 NewTypes 을 테스트할 수 없으며 프로젝트에 대한 프로젝트 참조가 NewTypes 필요합니다. 프로젝트 참조를 추가하려면 다음 dotnet reference add 명령을 사용합니다.

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

또는 NewTypesTests.csproj 파일에 노드를 <ItemGroup> 추가하여 프로젝트 참조를 수동으로 추가할 수도 있습니다.

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

NewTypesTests.csproj 파일에는 다음 패키지 참조가 포함되어 있습니다.

  • Microsoft.NET.Test.Sdk. .NET 테스트 인프라
  • xunit, xUnit 테스트 프레임워크
  • xunit.runner.visualstudio, 테스트 실행기
  • NewTypes, 테스트할 코드

UnitTest1.cs 이름을 PetTests.cs 변경하고 파일의 코드를 다음 코드로 바꿉다.

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

선택적 연습: 이전에 추가한 Bird 형식이 소유자에게 Tweet!을 생성하는 경우, PetTests.cs 파일에 BirdTalkToOwnerReturnsTweet 테스트 메서드를 추가하여 Bird 형식에 대해 TalkToOwner 메서드가 올바르게 작동하는지 확인하세요.

비고

초기 어설션 Assert.NotEqual 검사에 따르면 expected 값과 actual 값이 같을 것으로 예상되지만, 실제로는 이러한 값이 같지 않음을 표시합니다. 항상 처음에 테스트의 논리를 확인하기 위해 실패할 테스트를 만듭니다. 테스트가 실패했음을 확인한 후 테스트를 통과하도록 어설션을 조정합니다.

다음은 전체 프로젝트 구조를 보여줍니다.

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

test/NewTypesTests 디렉터리에서 시작합니다. 명령을 사용하여 테스트를 실행합니다 dotnet test . 이 명령은 프로젝트 파일에 지정된 테스트 실행기를 시작합니다.

예상대로 테스트가 실패하고 콘솔에 다음 출력이 표시됩니다.

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)

테스트의 어설션을 Assert.NotEqual에서 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);
    }
}

명령을 사용하여 테스트를 dotnet test 다시 실행하고 다음 출력을 가져옵니다.

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)

테스트 통과. 애완 동물 유형의 메서드는 소유자와 이야기 할 때 올바른 값을 반환합니다.

xUnit을 사용하여 프로젝트를 구성하고 테스트하는 기술을 배웠습니다. 이러한 기술을 자신의 프로젝트에 적용하고 앞으로 나아가세요. 즐거운 코딩을 경험하시기 바랍니다!