자습서: Visual Studio Code를 사용하여 .NET 클래스 라이브러리 테스트
이 자습서에서는 솔루션에 테스트 프로젝트를 추가하여 단위 테스트를 자동화하는 방법을 보여줍니다.
필수 구성 요소
- 이 자습서는 Visual Studio Code사용하여 .NET 클래스 라이브러리 만들기
만드는 솔루션에서 작동합니다.
단위 테스트 프로젝트 만들기
단위 테스트는 개발 및 게시 중에 자동화된 소프트웨어 테스트를 제공합니다. 이 자습서에서 사용하는 테스트 프레임워크는 MSTest입니다. MSTest 선택할 수 있는 세 가지 테스트 프레임워크 중 하나입니다. 다른 항목은 xUnit과 nUnit입니다.
Visual Studio Code를 시작합니다.
ClassLibraryProjects
를 사용하여 .NET 클래스 라이브러리를 만든 후 생성된 솔루션을 엽니다.솔루션 탐색기에서 새 프로젝트을(를) 선택하거나, 명령 팔레트에서 .NET: 새 프로젝트을(를) 선택합니다.
MSTest 테스트 프로젝트선택하고 이름을 "StringLibraryTest"로 지정하고, 기본 디렉터리를 선택한 다음, 프로젝트만들기를 선택합니다.
프로젝트 템플릿은 다음 코드를 사용하여 UnitTest1.cs 파일을 만듭니다.
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }
단위 테스트 템플릿에서 만든 소스 코드는 다음을 수행합니다.
-
TestClassAttribute 특성을
UnitTest1
클래스에 적용합니다. -
TestMethodAttribute 특성을 적용하여
TestMethod1
정의합니다. - 단위 테스트에 사용되는 형식을 포함하는 Microsoft.VisualStudio.TestTools.UnitTesting 네임스페이스를 가져옵니다. 네임스페이스는
global using
지시문을 통해 GlobalUsings.cs에서 가져옵니다.
[TestClass] 태그가 지정된 테스트 클래스에서 [TestMethod] 태그가 지정된 각 메서드는 단위 테스트가 호출될 때 자동으로 실행됩니다.
-
TestClassAttribute 특성을
프로젝트 참조 추가
테스트 프로젝트가 StringLibrary
클래스와 함께 작동하려면 StringLibraryTest
프로젝트의 참조를 StringLibrary
프로젝트에 추가합니다.
솔루션 탐색기에서 'StringLibraryTest' 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 참조 추가를 선택합니다.
"StringLibrary"를 선택합니다.
단위 테스트 메서드 추가 및 실행
Visual Studio는 단위 테스트를 호출할 때 TestMethodAttribute 특성으로 표시된 클래스에서 TestClassAttribute 특성으로 표시된 각 메서드를 실행합니다. 첫 번째 오류가 발견되거나 메서드에 포함된 모든 테스트가 성공하면 테스트 메서드가 종료됩니다.
가장 일반적인 테스트는 Assert 클래스의 멤버를 호출합니다. 많은 어설션 메서드에는 두 개 이상의 매개 변수가 포함되며, 그 중 하나는 예상 테스트 결과이고 다른 하나는 실제 테스트 결과입니다.
Assert
클래스의 가장 자주 호출되는 메서드 중 일부는 다음 표에 나와 있습니다.
Assert 메서드 | 기능 |
---|---|
Assert.AreEqual |
두 값 또는 개체가 같은지 확인합니다. 값이나 개체가 같지 않으면 어설션이 실패합니다. |
Assert.AreSame |
두 개체 변수가 동일한 개체를 참조하는지 확인합니다. 변수가 다른 개체를 참조하는 경우 어설션이 실패합니다. |
Assert.IsFalse |
조건이 false 인지 검증합니다. 조건이 true 경우 어설션이 실패합니다. |
Assert.IsNotNull |
개체가 null 이 아닌지 확인합니다. 개체가 null 경우 어설션이 실패합니다. |
테스트 메서드에서 Assert.ThrowsException(또는 MSTest 3.8 이상을 사용하는 경우 Assert.Throws
및 Assert.ThrowsExactly
) 메서드를 사용하여 예상되는 예외 유형을 나타낼 수 있습니다. 지정된 예외가 throw되지 않으면 테스트가 실패합니다.
StringLibrary.StartsWithUpper
메서드를 테스트할 때 대문자로 시작하는 여러 문자열을 제공하려고 합니다. 이러한 경우에 메서드가 true
를 반환할 것으로 기대하므로, Assert.IsTrue 메서드를 호출할 수 있습니다. 마찬가지로 대문자로 시작하지 않는 문자열 여러 개를 제공하려고 합니다. 이러한 경우에 메서드가 false
를 반환할 것으로 기대하므로, Assert.IsFalse 메서드를 호출할 수 있습니다.
라이브러리 메서드가 문자열을 처리하므로 빈 문자열(String.Empty
) 및 null
문자열을 성공적으로 처리해야 합니다. 빈 문자열은 문자가 없고 Length가 0인 문자열입니다.
null
문자열은 초기화되지 않은 문자열입니다.
StartsWithUpper
직접 정적 메서드로 호출하고 단일 String 인수를 전달할 수 있습니다.
StartsWithUpper
을 확장 메서드로, string
에 할당된 null
변수에서 호출할 수 있습니다.
각각 문자열 배열의 각 요소에 대해 Assert 메서드를 호출하는 세 가지 메서드를 정의합니다. 테스트 실패 시 표시할 오류 메시지를 지정할 수 있는 메서드 오버로드를 호출합니다. 메시지는 오류를 발생시킨 문자열을 식별합니다.
테스트 메서드를 만들려면 다음을 수행합니다.
StringLibraryTest/UnitTest1.cs 파일을 열고 모든 코드를 다음 코드로 바꿉니다.
using Microsoft.VisualStudio.TestTools.UnitTesting; using UtilityLibraries; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestStartsWithUpper() { // Tests that we expect to return true. string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsTrue(result, string.Format("Expected for '{0}': true; Actual: {1}", word, result)); } } [TestMethod] public void TestDoesNotStartWithUpper() { // Tests that we expect to return false. string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word, result)); } } [TestMethod] public void DirectCallWithNullOrEmpty() { // Tests that we expect to return false. string?[] words = { string.Empty, null }; foreach (var word in words) { bool result = StringLibrary.StartsWithUpper(word); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word == null ? "<null>" : word, result)); } } } }
TestStartsWithUpper
메서드의 대문자 테스트에는 그리스어 대문자 알파(U+0391) 및 키릴 자모 대문자 EM(U+041C)이 포함됩니다.TestDoesNotStartWithUpper
메서드의 소문자 테스트에는 그리스어 작은 문자 알파(U+03B1) 및 키릴 자모 작은 문자 Ghe(U+0433)가 포함됩니다.변경 내용을 저장합니다.
테스트 빌드 및 실행
솔루션 탐색기에서 솔루션을 마우스 오른쪽 버튼으로 클릭하고 빌드 를 선택하거나, 명령 팔레트에서 .NET: 빌드를 선택합니다.
테스트 창을 선택하고테스트 실행을 선택하거나 명령 팔레트에서 테스트: 모든 테스트 실행합니다.
테스트 오류 처리
TDD(테스트 기반 개발)를 수행하는 경우 먼저 테스트를 작성하고 테스트를 처음 실행할 때 실패합니다. 그런 다음 테스트가 성공하도록 하는 코드를 앱에 추가합니다. 이 자습서에서는 유효성을 검사하는 앱 코드를 작성한 후 테스트를 생성했기 때문에 테스트가 실패하는 것을 본 적이 없습니다. 테스트가 실패할 것으로 예상할 때 실패하는지 확인하려면 테스트 입력에 잘못된 값을 추가합니다.
"Error" 문자열을 포함하도록
words
메서드의TestDoesNotStartWithUpper
배열을 수정합니다.string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
편집기에서 테스트 옆에 있는 녹색 오류를 클릭하여 테스트를 실행합니다.
출력은 테스트가 실패했음을 보여 줍니다. 그리고 실패한 테스트에 대한 오류 메시지를 제공합니다. "Assert.IsFalse가 실패했습니다. 'Error'에 대한 기대값: false; 실제값: True". 오류로 인해 "Error" 이후 배열의 문자열이 테스트되지 않았습니다.
Visual Studio Code
단계에서 추가한 문자열 "Error"를 제거합니다.
테스트를 다시 실행하고 테스트가 통과합니다.
라이브러리 릴리스 버전을 테스트하세요
이제 라이브러리의 디버그 빌드를 실행할 때 테스트가 모두 통과되었으므로 라이브러리의 릴리스 빌드에 대해 테스트를 추가로 실행합니다. 컴파일러 최적화를 비롯한 다양한 요소는 디버그 빌드와 릴리스 빌드 간에 서로 다른 동작을 생성할 수 있습니다.
릴리스 빌드 구성을 사용하여 테스트를 실행합니다.
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
테스트가 통과합니다.
디버그 테스트
Visual Studio Code를 IDE로 사용하는 경우 Visual Studio Code 사용하여 .NET 콘솔 애플리케이션을 디버그하는
Visual Studio Code는 디버거가 연결된 상태에서 테스트 프로젝트를 시작합니다. 테스트 프로젝트 또는 기본 라이브러리 코드에 추가한 중단점에서 실행이 중지됩니다.
추가 리소스
- .NET
단위 테스트
다음 단계
이 튜토리얼에서는 클래스 라이브러리를 단위 테스트했습니다. 라이브러리를 패키지로 NuGet 게시하여 다른 사용자가 라이브러리를 사용할 수 있도록 할 수 있습니다. 방법을 알아보려면 NuGet 자습서를 따릅니다.
dotnet CLI 사용하여 패키지 만들기 및 게시
라이브러리를 NuGet 패키지로 게시하는 경우 다른 사용자가 라이브러리를 설치하고 사용할 수 있습니다. 방법을 알아보려면 NuGet 자습서를 따릅니다.
dotnet CLI 사용하여 패키지 설치 및 사용
라이브러리는 패키지로 배포할 필요가 없습니다. 이를 사용하는 콘솔 앱과 함께 번들로 묶을 수 있습니다. 콘솔 앱을 게시하는 방법을 알아보려면 이 시리즈의 이전 자습서를 참조하세요.
Visual Studio Code 확장 C# Dev Kit는 C# 앱 및 라이브러리를 개발하기 위한 추가 도구를 제공합니다.
.NET