이 자습서에서는 단위 테스트 프로젝트 및 라이브러리 프로젝트를 포함하는 솔루션을 빌드하는 방법을 보여줍니다. 미리 빌드된 솔루션을 사용하여 자습서를 수행하려면 샘플 코드를 보거나 다운로드합니다. 다운로드 지침은 샘플 및 자습서참조하세요.
솔루션 만들기
이 섹션에서는 원본 및 테스트 프로젝트를 포함하는 솔루션을 만듭니다. 완료된 솔루션에는 다음과 같은 디렉터리 구조가 있습니다.
/unit-testing-using-dotnet-test
unit-testing-using-dotnet-test.sln
/PrimeService
PrimeService.vb
PrimeService.vbproj
/PrimeService.Tests
PrimeService_IsPrimeShould.vb
PrimeServiceTests.vbproj
다음 지침에서는 테스트 솔루션을 만드는 단계를 제공합니다. 한 단계로 테스트 솔루션을 만들기 위한 지침은 테스트 솔루션 만들기 명령을 참조하세요.
셸 창을 엽니다.
다음 명령을 실행합니다.
dotnet new sln -o unit-testing-using-dotnet-test
이
dotnet new sln
명령은 unit-testing-using-dotnet-test 디렉터리에 새 솔루션을 만듭니다.디렉터리를 unit-testing-using-dotnet-test 폴더로 변경합니다.
다음 명령을 실행합니다.
dotnet new classlib -o PrimeService -lang VB
이
dotnet new classlib
명령은 PrimeService 폴더에 새 클래스 라이브러리 프로젝트를 만듭니다. 새 클래스 라이브러리에는 테스트할 코드가 포함됩니다.Class1.vb 이름을 PrimeService.vb 바꿉니다.
PrimeService.vb 코드를 다음 코드로 바꿉다.
Imports System Namespace Prime.Services Public Class PrimeService Public Function IsPrime(candidate As Integer) As Boolean Throw New NotImplementedException("Not implemented.") End Function End Class End Namespace
앞의 코드는 다음과 같습니다.
- NotImplementedException가 구현되지 않았음을 나타내는 메시지와 함께 던져집니다.
- 자습서의 뒷부분에서 업데이트됩니다.
unit-testing-using-dotnet-test 디렉터리에서 다음 명령을 실행하여 클래스 라이브러리 프로젝트를 솔루션에 추가합니다.
dotnet sln add ./PrimeService/PrimeService.vbproj
다음 명령을 실행하여 PrimeService.Tests 프로젝트를 만듭니다.
dotnet new xunit -o PrimeService.Tests -lang VB
이전 명령:
- PrimeService.Tests 디렉터리에 PrimeService.Tests 프로젝트를 만듭니다. 테스트 프로젝트는 xUnit 을 테스트 라이브러리로 사용합니다.
- 프로젝트 파일에 다음
<PackageReference />
요소를 추가하여 테스트 실행기를 구성합니다.- "Microsoft.NET.Test.Sdk"
- xunit(엑스유닛 테스트 프레임워크)
- xunit.runner.visualstudio
다음 명령을 실행하여 솔루션 파일에 테스트 프로젝트를 추가합니다.
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
클래스 라이브러리를
PrimeService
PrimeService.Tests 프로젝트에 종속성으로 추가합니다.dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
솔루션을 만드는 명령
이 섹션에서는 이전 섹션의 모든 명령을 요약합니다. 이전 섹션의 단계를 완료한 경우 이 섹션을 건너뜁니다.
다음 명령은 Windows 머신에서 테스트 솔루션을 만듭니다. macOS 및 Unix의 경우, 파일 이름을 변경하려면 ren
명령을 ren
의 OS 버전에 맞게 업데이트합니다.
dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.vb PrimeService.vb
dotnet sln add ./PrimeService/PrimeService.vbproj
dotnet new xunit -o PrimeService.Tests -lang VB
dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
이전 섹션의 " PrimeService.vb 코드를 다음 코드로 바꿉니다"에 대한 지침을 따릅니다.
테스트 만들기
TDD(테스트 기반 개발)에서 널리 사용되는 방법은 대상 코드를 구현하기 전에 테스트를 작성하는 것입니다. 이 자습서에서는 TDD 방법을 사용합니다. 메서드는 IsPrime
호출할 수 있지만 구현되지는 않습니다. 테스트 호출이 IsPrime
에 실패했습니다. TDD를 사용하면 실패한 것으로 알려진 테스트가 작성됩니다. 테스트 통과를 위해 대상 코드가 업데이트됩니다. 이 접근 방식을 계속 반복하면서, 먼저 실패하는 테스트를 작성하고 코드를 업데이트하여 통과하게 만듭니다.
PrimeService.Tests 프로젝트를 업데이트합니다.
- PrimeService.Tests/UnitTest1.vb 삭제합니다.
- PrimeService.Tests/PrimeService_IsPrimeShould.vb 파일을 만듭니다.
- PrimeService_IsPrimeShould.vb 코드를 다음 코드로 바꿉다.
Imports Xunit
Namespace PrimeService.Tests
Public Class PrimeService_IsPrimeShould
Private ReadOnly _primeService As Prime.Services.PrimeService
Public Sub New()
_primeService = New Prime.Services.PrimeService()
End Sub
<Fact>
Sub IsPrime_InputIs1_ReturnFalse()
Dim result As Boolean = _primeService.IsPrime(1)
Assert.False(result, "1 should not be prime")
End Sub
End Class
End Namespace
이 특성은 [Fact]
테스트 실행기에서 실행하는 테스트 메서드를 선언합니다.
PrimeService.Tests 폴더에서 실행dotnet test
합니다.
dotnet test 명령은 두 프로젝트를 빌드하고 테스트를 실행합니다. xUnit 테스트 실행기는 테스트를 실행할 프로그램 진입점을 포함합니다.
dotnet test
는 단위 테스트 프로젝트를 사용하여 테스트 실행기를 시작합니다.
구현되지 않았기 때문에 IsPrime
테스트가 실패합니다. TDD 방법을 사용하여 이 테스트가 통과되도록 충분한 코드만 작성합니다. 다음 코드를 사용하여 IsPrime
을 업데이트합니다.
Public Function IsPrime(candidate As Integer) As Boolean
If candidate = 1 Then
Return False
End If
Throw New NotImplementedException("Not implemented.")
End Function
dotnet test
를 실행합니다. 테스트가 통과합니다.
더 많은 테스트 추가
0 및 -1에 대한 소수 테스트를 추가합니다. 이전 테스트를 복사하고 0 및 -1을 사용하도록 다음 코드를 변경할 수 있습니다.
Dim result As Boolean = _primeService.IsPrime(1)
Assert.False(result, "1 should not be prime")
매개 변수만 변경되면 테스트 코드를 복사하면 코드가 중복되고 테스트가 bloat됩니다. 다음 xUnit 특성을 사용하면 유사한 테스트 모음을 작성할 수 있습니다.
-
[Theory]
는 동일한 코드를 실행하지만 입력 인수가 다른 테스트 제품군을 나타냅니다. -
[InlineData]
특성은 해당 입력에 대한 값을 지정합니다.
새 테스트를 만드는 대신 위의 xUnit 특성을 적용하여 단일 이론을 만듭니다. 다음 코드를 바꿉다.
<Fact>
Sub IsPrime_InputIs1_ReturnFalse()
Dim result As Boolean = _primeService.IsPrime(1)
Assert.False(result, "1 should not be prime")
End Sub
다음 코드를 사용합니다.
<Theory>
<InlineData(-1)>
<InlineData(0)>
<InlineData(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(ByVal value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.False(result, $"{value} should not be prime")
End Sub
위의 코드 [Theory]
[InlineData]
에서 두 개 미만의 여러 값을 테스트할 수 있습니다. 2개는 가장 작은 소수입니다.
실행 dotnet test
하면 두 테스트가 실패합니다. 모든 테스트를 통과하려면 메서드 IsPrime
를 다음 코드로 업데이트합니다.
Public Function IsPrime(candidate As Integer) As Boolean
If candidate < 2 Then
Return False
End If
Throw New NotImplementedException("Not fully implemented.")
End Function
TDD 접근 방식에 따라 실패한 테스트를 더 추가한 다음 대상 코드를 업데이트합니다. 테스트의 완성된 버전과 라이브러리의 전체 구현을 참조하세요.
완료된 IsPrime
메서드는 원시성을 테스트하기 위한 효율적인 알고리즘이 아닙니다.
추가 리소스
.NET