이 자습서에서는 단위 테스트 개념을 알아보기 위해 샘플 솔루션을 단계별로 빌드하는 대화형 환경을 안내합니다. 미리 빌드된 솔루션을 사용하여 자습서를 수행하려면 시작하기 전에 샘플 코드를 보거나 다운로드 합니다. 다운로드 지침은 샘플 및 자습서를 참조하세요.
이 문서에서는 .NET Core 프로젝트를 테스트하는 방법에 대해 알아봅니다. ASP.NET Core 프로젝트를 테스트하는 경우 ASP.NET Core 통합 테스트를 참조하세요.
필수 조건
- .NET 8 SDK 이상 버전.
- 선택하는 텍스트 편집기 또는 코드 편집기입니다.
원본 프로젝트 만들기
셸 창을 엽니다. 솔루션을 저장할 unit-testing-with-fsharp 라는 디렉터리를 만듭니다. 이 새 디렉터리 내에서 다음 명령을 실행하여 클래스 라이브러리 및 테스트 프로젝트에 대한 새 솔루션 파일을 만듭니다.
dotnet new sln
다음으로 MathService 디렉터리를 만듭니다. 다음 개요는 지금까지의 디렉터리 및 파일 구조를 보여줍니다.
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
MathService를 현재 디렉터리로 만들고 다음 명령을 실행하여 원본 프로젝트를 만듭니다.
dotnet new classlib -lang "F#"
수학 서비스의 실패한 구현을 만듭니다.
module MyMath =
let squaresOfOdds xs = raise (System.NotImplementedException("You haven't written a test yet!"))
디렉터리를 다시 unit-testing-with-fsharp 디렉터리로 변경합니다. 다음 명령을 실행하여 솔루션에 클래스 라이브러리 프로젝트를 추가합니다.
dotnet sln add .\MathService\MathService.fsproj
테스트 프로젝트 만들기
다음으로 MathService.Tests 디렉터리를 만듭니다. 다음 개요는 디렉터리 구조를 보여줍니다.
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
MathService.Tests 디렉터리를 현재 디렉터리로 만들고 다음 명령을 사용하여 새 프로젝트를 만듭니다.
dotnet new nunit -lang "F#"
이 명령은 NUnit을 테스트 프레임워크로 사용하는 테스트 프로젝트를 만듭니다. 생성된 템플릿은 MathServiceTests.fsproj에서 테스트 실행기를 구성합니다.
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="NUnit" Version="4.1.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
</ItemGroup>
테스트 프로젝트에는 단위 테스트를 만들고 실행하는 다른 패키지가 필요합니다.
dotnet new
이전 단계에서 NUnit 및 NUnit 테스트 어댑터를 추가했습니다. 이제 MathService
클래스 라이브러리를 프로젝트에 다른 종속성으로 추가합니다.
dotnet reference add
명령을 사용합니다.
dotnet reference add ../MathService/MathService.fsproj
GitHub의 샘플 리포지토리 전체 파일을 볼 수 있습니다.
다음과 같은 최종 솔루션 레이아웃이 있습니다.
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Test Source Files
MathService.Tests.fsproj
unit-testing-with-fsharp 디렉터리에서 다음 명령을 실행합니다.
dotnet sln add .\MathService.Tests\MathService.Tests.fsproj
첫 번째 테스트 만들기
실패한 테스트 하나를 작성하고 통과한 다음 프로세스를 반복합니다. UnitTest1.fs를 열고 다음 코드를 추가합니다.
namespace MathService.Tests
open System
open NUnit.Framework
open MathService
[<TestFixture>]
type TestClass () =
[<Test>]
member this.TestMethodPassing() =
Assert.That(true, Is.True)
[<Test>]
member this.FailEveryTime() = Assert.That(false, Is.True)
이 특성은 [<TestFixture>]
테스트가 포함된 클래스를 표시합니다. 이 특성은 [<Test>]
테스트 실행기에서 실행하는 테스트 메서드를 표시합니다.
unit-testing-with-fsharp 디렉터리에서 실행 dotnet test
하여 테스트 및 클래스 라이브러리를 빌드한 다음 테스트를 실행합니다. NUnit 테스트 실행기는 테스트를 실행할 프로그램 진입점을 포함합니다.
dotnet test
이(가) 당신이 만든 단위 테스트 프로젝트를 사용하여 테스트 실행기를 시작합니다.
이 두 테스트는 가장 기본적인 통과 및 실패 테스트를 보여 줍니다.
My test
은 통과하고 Fail every time
은 실패합니다. 이제 메서드에 대한 테스트를 만듭니다 squaresOfOdds
. 이 메서드는 squaresOfOdds
입력 시퀀스의 일부인 모든 홀수 정수 값의 제곱 시퀀스를 반환합니다. 이러한 모든 함수를 한 번에 작성하는 대신 기능의 유효성을 검사하는 테스트를 반복적으로 만들 수 있습니다. 각 테스트 통과 수단을 만들려면 메서드에 필요한 기능을 만듭니다.
작성할 수 있는 가장 간단한 테스트는 모든 짝수로 호출 squaresOfOdds
하는 것입니다. 여기서 결과는 빈 정수 시퀀스여야 합니다. 해당 테스트는 다음과 같습니다.
[<Test>]
member this.TestEvenSequence() =
let expected = Seq.empty<int>
let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
Assert.That(actual, Is.EqualTo(expected))
시퀀스가 expected
목록으로 변환됩니다. NUnit 프레임워크는 많은 표준 .NET 형식을 사용합니다. 이러한 종속성은 공용 인터페이스 및 예상 결과에서 ICollection 지원되는 것이 아니라 IEnumerable는 것을 의미합니다.
테스트를 실행하면 테스트가 실패하는 것을 볼 수 있습니다. 구현을 아직 만들지 않았기 때문입니다. 작동하는 MathService 프로젝트의 Library.fs 클래스에서 가장 간단한 코드를 작성하여 이 테스트를 통과합니다.
let squaresOfOdds xs =
Seq.empty<int>
unit-testing-with-fsharp 디렉터리에서 다시 실행 dotnet test
합니다.
dotnet test
명령은 MathService
프로젝트 및 MathService.Tests
프로젝트에 대한 빌드를 실행합니다. 두 프로젝트를 모두 빌드한 후 테스트를 실행합니다. 이제 두 개의 테스트가 통과합니다.
요구 사항 완료
이제 한 번의 테스트를 완료했으니 더 많은 테스트를 작성해야 합니다. 다음 간단한 사례는 홀수만 있는 시퀀스에서 작동합니다 1
. 제곱 1이 1이므로 숫자 1이 더 쉽습니다. 다음 테스트는 다음과 같습니다.
[<Test>]
member public this.TestOnesAndEvens() =
let expected = [1; 1; 1; 1]
let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
Assert.That(actual, Is.EqualTo(expected))
dotnet test
을(를) 실행하면 새 테스트가 실패합니다. 이 새 테스트를 처리하려면 메서드를 업데이트 squaresOfOdds
해야 합니다. 이 테스트를 통과하려면 시퀀스에서 모든 짝수 수를 필터링해야 합니다. 이 작업은 작은 필터 함수를 작성하고 다음을 사용하여 수행할 수 있습니다 Seq.filter
.
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
다음 단계로 넘어가세요: 각 홀수를 제곱하세요. 먼저 새 테스트를 작성합니다.
[<Test>]
member public this.TestSquaresOfOdds() =
let expected = [1; 9; 25; 49; 81]
let actual = MyMath.squaresOfOdds [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
Assert.That(actual, Is.EqualTo(expected))
맵 작업을 통해 필터링된 시퀀스를 파이핑하여 각 홀수의 제곱을 계산하여 테스트를 수정할 수 있습니다.
let private square x = x * x
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
|> Seq.map square
작은 라이브러리와 해당 라이브러리에 대한 단위 테스트 집합을 빌드했습니다. 새 패키지 및 테스트를 추가하는 것이 일반 워크플로의 일부가 되도록 솔루션을 구성했습니다. 대부분의 시간과 노력을 집중하여 애플리케이션의 목표를 해결했습니다.
참고하십시오
- dotnet reference add - .NET 참조 추가 명령어
- dotnet 테스트
.NET