dotnet test 및 xUnit을 사용하여 .NET Core에서 F# 라이브러리 유닛 테스트
이 자습서에서는 샘플 솔루션을 단계별로 빌드하는 대화형 환경을 통해 단위 테스트 개념을 알아볼 수 있습니다. 미리 빌드된 솔루션을 사용하여 이 자습서를 진행하려는 경우 시작하기 전에 샘플 코드를 보거나 다운로드. 다운로드 지침은 샘플 및 자습서를 참조하세요.
이 문서에서는 .NET Core 프로젝트를 테스트하는 방법에 대해 설명합니다. ASP.NET Core 프로젝트를 테스트하는 경우 ASP.NET Core의 통합 테스트를 참조하세요.
소스 프로젝트 만들기
셸 창을 엽니다. 솔루션을 저장할 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 xunit -lang "F#"
을 사용하여 새 프로젝트를 만듭니다. xUnit을 테스트 라이브러리로 사용하는 테스트 프로젝트가 만들어집니다. 생성된 템플릿은 MathServiceTests.fsproj에 Test Runner를 구성합니다.
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170628-02" />
<PackageReference Include="xunit" Version="2.2.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
</ItemGroup>
테스트 프로제트는 다른 패키지에 단위 테스트를 만들고 실행하도록 요구합니다. 이전 단계의 dotnet new
는 xUnit 및 xUnit runner를 추가했습니다. 이제 MathService
클래스 라이브러리를 프로젝트에 다른 종속성으로 추가합니다. dotnet add reference
명령을 사용합니다.
dotnet add reference ../MathService/MathService.fsproj
GitHub의 샘플 리포지토리에서 전체 파일을 볼 수 있습니다.
최종 솔루션 레이아웃은 다음과 같습니다.
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Test Source Files
MathServiceTests.fsproj
unit-testing-with-fsharp 디렉터리에서 dotnet sln add .\MathService.Tests\MathService.Tests.fsproj
를 실행합니다.
첫 번째 테스트 만들기
하나의 실패 테스트를 작성하고, 테스트가 성공하도록 만듭니다. 이 작업을 반복합니다. Tests.fs를 열고 다음 코드를 추가합니다.
[<Fact>]
let ``My test`` () =
Assert.True(true)
[<Fact>]
let ``Fail every time`` () = Assert.True(false)
[<Fact>]
특성은 Test Runner에서 실행하는 테스트 메서드를 나타냅니다. unit-testing-with-fsharp에서 dotnet test
를 실행하여 테스트 및 클래스 라이브러리를 빌드한 다음 테스트를 실행합니다. xUnit Test Runner에는 테스트를 실행할 프로그램 진입점이 포함되어 있습니다. dotnet test
는 만든 단위 테스트 프로젝트를 사용하여 Test Runner를 시작합니다.
이러한 두 테스트는 가장 기본적인 통과 및 실패 테스트를 보여 줍니다. My test
는 통과하고 Fail every time
은 실패합니다. 이제 squaresOfOdds
메서드에 대한 테스트를 만듭니다. squaresOfOdds
메서드는 입력 시퀀스에 포함된 모든 홀수 정수 값 제곱의 시퀀스를 반환합니다. 이러한 모든 함수를 한 번에 작성하지 않고 기능의 유효성을 검사하는 테스트를 반복적으로 만들 수 있습니다. 각 테스트 패스를 만들면 메서드에 필요한 기능이 만들어집니다.
작성할 수 있는 가장 간단한 테스트는 모든 짝수를 사용하여 squaresOfOdds
를 호출하는 것입니다. 이 경우 결과는 빈 정수 시퀀스여야 합니다. 해당 테스트는 다음과 같습니다.
[<Fact>]
let ``Sequence of Evens returns empty collection`` () =
let expected = Seq.empty<int>
let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
Assert.Equal<Collections.Generic.IEnumerable<int>>(expected, actual)
테스트가 실패합니다. 구현은 아직 만들지 않았습니다. MathService
클래스에서 작동하는 가장 간단한 코드를 작성하여 이 테스트를 통과시킵니다.
let squaresOfOdds xs =
Seq.empty<int>
unit-testing-with-fsharp 디렉터리에서 dotnet test
를 다시 실행합니다. dotnet test
명령은 MathService
프로젝트에 대한 빌드를 실행한 다음 MathService.Tests
프로젝트에 대한 빌드를 실행합니다. 두 프로젝트를 모두 빌드한 후 이 단일 테스트를 실행합니다. 전달합니다.
요구 사항 완료
이제 하나의 테스트를 통과했으므로 더 작성할 수 있습니다. 다음의 단순한 사례에서는 유일한 홀수가 1
인 시퀀스를 사용합니다. 숫자 1은 제곱이 1이므로 더 간단합니다. 이 테스트는 다음과 같습니다.
[<Fact>]
let ``Sequences of Ones and Evens returns Ones`` () =
let expected = [1; 1; 1; 1]
let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
Assert.Equal<Collections.Generic.IEnumerable<int>>(expected, actual)
dotnet test
를 실행하면 테스트가 실행되고 새 테스트가 실패합니다. 이제 squaresOfOdds
메서드를 업데이트하여 이 새 테스트를 처리합니다. 시퀀스에서 모든 짝수를 필터링하여 이 테스트가 통과하게 만듭니다. 이렇게 하려면 작은 필터 함수를 작성하고 Seq.filter
를 사용합니다.
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
한 가지 단계가 남았습니다. 즉, 각 홀수를 제곱합니다. 먼저 새 테스트를 작성합니다.
[<Fact>]
let ``SquaresOfOdds works`` () =
let expected = [1; 9; 25; 49; 81]
let actual = MyMath.squaresOfOdds [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
Assert.Equal(expected, actual)
맵 작업을 통해 필터링된 시퀀스를 파이프하여 각 홀수의 제곱을 계산하는 방법으로 테스트를 수정합니다.
let private square x = x * x
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
|> Seq.map square
작은 라이브러리 및 이 라이브러리에 대한 단위 테스트 집합을 작성했습니다. 새 패키지 및 테스트 추가가 정상 워크플로에 포함되도록 솔루션을 구조화했습니다. 애플리케이션의 목표를 해결하는 데 대부분의 시간과 노력을 들였습니다.
참고 항목
.NET