다음을 통해 공유


dotnet test 및 MSTest를 사용하여 .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 mstest -lang "F#"사용하여 만드세요. 그러면 MSTest를 테스트 프레임워크로 사용하는 테스트 프로젝트가 만들어집니다. 생성된 템플릿은 MathServiceTests.fsproj에서 테스트 실행기를 구성합니다.

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170628-02" />
  <PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
  <PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>

테스트 프로젝트에는 단위 테스트를 만들고 실행하는 다른 패키지가 필요합니다. dotnet new 이전 단계에서 MSTest를 추가했습니다. 이제 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
        MathServiceTests.fsproj

dotnet sln add .\MathService.Tests\MathService.Tests.fsproj을(를) unit-testing-with-fsharp 디렉터리에서 실행하세요.

첫 번째 테스트 만들기

실패한 테스트 하나를 작성하고 통과한 다음 프로세스를 반복합니다. Tests.fs를 열고 다음 코드를 추가합니다.

namespace MathService.Tests

open System
open Microsoft.VisualStudio.TestTools.UnitTesting
open MathService

[<TestClass>]
type TestClass () =

    [<TestMethod>]
    member this.TestMethodPassing() =
        Assert.IsTrue(true)

    [<TestMethod>]
     member this.FailEveryTime() = Assert.IsTrue(false)

이 특성은 [<TestClass>] 테스트가 포함된 클래스를 표시합니다. 이 특성은 [<TestMethod>] 테스트 실행기에서 실행하는 테스트 메서드를 표시합니다. unit-testing-with-fsharp 디렉터리에서 실행 dotnet test 하여 테스트 및 클래스 라이브러리를 빌드한 다음 테스트를 실행합니다. MSTest 테스트 실행기는 테스트를 실행할 프로그램 진입점을 포함합니다. dotnet test이(가) 당신이 만든 단위 테스트 프로젝트를 사용하여 테스트 실행기를 시작합니다.

이 두 테스트는 가장 기본적인 통과 및 실패 테스트를 보여 줍니다. My test은 통과하고 Fail every time은 실패합니다. 이제 메서드에 대한 테스트를 만듭니다 squaresOfOdds . 이 메서드는 squaresOfOdds 입력 시퀀스의 일부인 모든 홀수 정수 값의 제곱 목록을 반환합니다. 이러한 모든 함수를 한 번에 작성하는 대신 기능의 유효성을 검사하는 테스트를 반복적으로 만들 수 있습니다. 각 테스트 통과를 만드는 것은 메서드에 필요한 기능을 만드는 것을 의미합니다.

작성할 수 있는 가장 간단한 테스트는 모든 짝수로 호출 squaresOfOdds 하는 것입니다. 여기서 결과는 빈 정수 시퀀스여야 합니다. 해당 테스트는 다음과 같습니다.

[<TestMethod>]
member this.TestEvenSequence() =
    let expected = Seq.empty<int> |> Seq.toList
    let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
    Assert.AreEqual(expected, actual)

expected 시퀀스가 목록으로 변환되었습니다. MSTest 라이브러리는 많은 표준 .NET 형식을 사용합니다. 이러한 종속성은 공용 인터페이스 및 예상 결과에서 ICollection 지원되는 것이 아니라 IEnumerable는 것을 의미합니다.

테스트를 실행하면 테스트가 실패하는 것을 볼 수 있습니다. 아직 구현을 만들지 않았습니다. 작동하는 Mathservice 클래스에서 가장 간단한 코드를 작성하여 이 테스트를 통과합니다.

let squaresOfOdds xs =
    Seq.empty<int> |> Seq.toList

unit-testing-with-fsharp 디렉터리에서 다시 실행 dotnet test 합니다. dotnet test 명령은 MathService 프로젝트 및 MathService.Tests 프로젝트에 대한 빌드를 실행합니다. 두 프로젝트를 모두 빌드한 후 이 단일 테스트를 실행합니다. 통과합니다.

요구 사항 완료

이제 한 번의 테스트를 완료했으니 더 많은 테스트를 작성해야 합니다. 다음 간단한 사례는 홀수만 있는 시퀀스에서 작동합니다 1. 제곱 1이 1이므로 숫자 1이 더 쉽습니다. 다음 테스트는 다음과 같습니다.

[<TestMethod>]
member public this.TestOnesAndEvens() =
    let expected = [1; 1; 1; 1]
    let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
    Assert.AreEqual(expected, actual)

dotnet test을(를) 실행하면 새 테스트가 실패합니다. 이 새 테스트를 처리하려면 메서드를 업데이트 squaresOfOdds 해야 합니다. 이 테스트를 통과하려면 시퀀스에서 모든 짝수 수를 필터링해야 합니다. 이 작업은 작은 필터 함수를 작성하고 다음을 사용하여 수행할 수 있습니다 Seq.filter.

let private isOdd x = x % 2 <> 0

let squaresOfOdds xs =
    xs
    |> Seq.filter isOdd |> Seq.toList

Seq.toList 호출을 주의하십시오. 그러면 ICollection 인터페이스를 구현하는 목록이 만들어집니다.

다음 단계로 넘어가세요: 각 홀수를 제곱하세요. 먼저 새 테스트를 작성합니다.

[<TestMethod>]
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.AreEqual(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
    |> Seq.toList

작은 라이브러리와 해당 라이브러리에 대한 단위 테스트 집합을 빌드했습니다. 새 패키지 및 테스트를 추가하는 것이 일반적인 워크플로의 일부가 되도록 솔루션을 구성했습니다. 애플리케이션의 목표를 해결하는 데 대부분의 시간과 노력을 집중했습니다.

참고하십시오