이 문서에서는 Visual Studio에서 UWP(유니버설 Windows 플랫폼) 앱을 단위 테스트하는 방법을 설명합니다. Visual Studio는 C#, Visual Basic 및 C++용 UWP 단위 테스트 프로젝트 템플릿을 제공합니다. UWP 앱 개발에 대한 자세한 내용은 UWP 앱 시작을 참조하세요.
이 문서에서는 UWP 앱에서 C# 클래스를 만들고 단위 테스트하는 예제를 안내합니다. 이 예제에서는 테스트 기반 개발을 사용하여 특정 동작을 확인하는 테스트를 작성한 다음 테스트를 통과하는 코드를 작성합니다.
단위 테스트 프로젝트 만들기 및 실행
다음 절차에서는 UWP 앱용 단위 테스트 프로젝트를 만들고 실행하는 방법을 설명합니다.
UWP 단위 테스트 프로젝트 만들기
Visual Studio 시작 창에서 새 프로젝트 만들기를 선택합니다.
새 프로젝트 만들기 페이지에서 검색 상자에 unit test를 입력합니다. 템플릿 목록은 단위 테스트 프로젝트로 필터링됩니다.
C# 또는 Visual Basic에 대한 올바른 UWP 단위 테스트 템플릿을 선택한 다음, 다음을 선택합니다.
Visual Studio 2022 버전 17.14부터 C# 및 .NET 9에 권장되는 단위 테스트 템플릿은 UWP 단위 테스트 앱 이며 네이티브 AOT를 대상으로 합니다. 이전 UWP 템플릿의 이름은 UWP 단위 테스트 앱(.NET 네이티브) 및 단위 테스트 앱(유니버설 Windows)입니다.
필요에 따라 프로젝트 또는 솔루션 이름 및 위치를 변경한 다음, 만들기를 선택합니다.
필요에 따라 대상 및 최소 플랫폼 버전을 변경한 다음, 확인을 선택합니다.
Visual Studio에서 테스트 프로젝트를 만들고 Visual Studio 솔루션 탐색기에서 엽니다.
Visual Studio 시작 창에서 새 프로젝트 만들기를 선택합니다.
새 프로젝트 만들기 페이지에서 검색 상자에 unit test를 입력합니다. 템플릿 목록은 단위 테스트 프로젝트로 필터링됩니다.
C# 또는 Visual Basic에 대한 단위 테스트 앱(유니버설 Windows) 템플릿을 선택한 다음, 다음을 선택합니다.
필요에 따라 프로젝트 또는 솔루션 이름 및 위치를 변경한 다음, 만들기를 선택합니다.
필요에 따라 대상 및 최소 플랫폼 버전을 변경한 다음, 확인을 선택합니다.
Visual Studio에서 테스트 프로젝트를 만들고 Visual Studio 솔루션 탐색기에서 엽니다.
프로젝트의 응용 프로그램 매니페스트 편집Edit the project's application manifest
솔루션 탐색기에서 Package.appxmanifest 파일을 마우스 오른쪽 단추로 클릭하고 열기를 선택합니다.
매니페스트 디자이너에서 기능 탭을 선택합니다.
기능 목록에서 코드 및 단위 테스트에 필요한 기능을 선택합니다. 예를 들어 코드와 해당 단위 테스트가 인터넷에 액세스해야 하는 경우 인터넷 확인란을 선택합니다.
단위 테스트가 올바르게 작동하는 데 필요한 기능만 선택합니다.
UWP 앱 단위 테스트를 위한 코드 추가
Visual Studio 코드 편집기에서 단위 테스트 코드 파일을 편집하여 테스트에 필요한 어설션 및 논리를 추가합니다. 예제는 이 문서의 뒷부분에 있는 C# 클래스 단위 테스트를 참조하세요.
테스트 탐색기를 사용하여 단위 테스트 실행
솔루션을 빌드하고 테스트 탐색기를 사용하여 단위 테스트를 실행합니다.
Visual Studio 테스트 메뉴에서 테스트 탐색기를 선택합니다. 테스트 탐색기 창이 열립니다.
테스트 탐색기에서 모두 실행 아이콘을 선택합니다. UWP 프로젝트에서 테스트를 검색하려면 모두 실행을 사용해야 합니다.
솔루션이 빌드되고 단위 테스트가 실행됩니다. 테스트가 실행되면 결과 및 기간에 대한 정보와 함께 테스트 탐색기 테스트 목록에 테스트가 표시됩니다.
또한 테스트 탐색기에서 개별 테스트를 선택하고 마우스 오른쪽 단추를 클릭하여 테스트를 실행 또는 디버그 하거나 테스트로 이동을 클릭하여 테스트 코드를 열 수 있습니다. 상단 메뉴에서 테스트를 그룹화하거나, 재생 목록에 테스트를 추가하거나, 테스트 옵션을 열 수 있습니다.
솔루션을 빌드하고 테스트 탐색기를 사용하여 단위 테스트를 실행합니다.
Visual Studio 테스트 메뉴에서 테스트 탐색기를 선택합니다. 테스트 탐색기 창이 열립니다.
테스트 탐색기에서 모두 실행 아이콘을 선택합니다. UWP 프로젝트에서 테스트를 검색하려면 모두 실행을 사용해야 합니다.
솔루션이 빌드되고 단위 테스트가 실행됩니다. 테스트가 실행되면 결과 및 기간에 대한 정보와 함께 테스트 탐색기 테스트 목록에 테스트가 표시됩니다.
또한 테스트 탐색기에서 개별 테스트를 선택하고 마우스 오른쪽 단추를 클릭하여 테스트를 실행 또는 디버그 하거나 테스트로 이동을 클릭하여 테스트 코드를 열 수 있습니다. 상단 메뉴에서 테스트를 그룹화하거나, 재생 목록에 테스트를 추가하거나, 테스트 옵션을 열 수 있습니다.
C# 클래스 단위 테스트
좋은 단위 테스트의 안정적인 집합은 코드를 변경할 때 버그가 발생하지 않았다는 확신을 높입니다. 다음 예제에서는 UWP 앱에서 C# 클래스에 대한 단위 테스트를 만드는 한 가지 방법을 안내합니다. 이 예제에서는 테스트 기반 개발을 사용하여 특정 동작을 확인하는 테스트를 작성한 다음 테스트를 통과하는 코드를 작성합니다.
예제 Maths 코드 프로젝트에서 Rooter 클래스는 숫자의 예상 제곱근을 계산하는 함수를 구현합니다. RooterTests 프로젝트 단위는 Rooter 클래스를 테스트합니다.
솔루션 및 프로젝트 만들기
UWP 앱 프로젝트를 만듭니다.
- Visual Studio 파일 메뉴에서 새 프로젝트를 선택합니다.
- 새 프로젝트 만들기 페이지에서 검색 상자에 빈 앱을 입력한 다음, C# 비어 있는 앱(유니버설 Windows) 프로젝트 템플릿을 선택합니다.
- 새 프로젝트 구성 페이지에서 프로젝트 이름을 Maths로 지정하고 만들기를 선택합니다.
- 필요에 따라 대상 및 최소 플랫폼 버전을 변경한 다음, 확인을 선택합니다. Visual Studio에서 프로젝트를 만들고 솔루션 탐색기에서 엽니다.
단위 테스트 프로젝트를 만듭니다.
- 솔루션 탐색기에서 Maths 솔루션을 마우스 오른쪽 단추로 클릭하고새 프로젝트추가를> 선택합니다.
- 새 프로젝트 추가 페이지에서 검색 상자에 단위 테스트를 입력한 다음 C# 단위 테스트 앱(유니버설 Windows) 프로젝트 템플릿을 선택합니다.
- 테스트 프로젝트의 이름을 RooterTests로 지정하고 만들기를 선택합니다.
- 필요에 따라 대상 및 최소 플랫폼 버전을 변경한 다음, 확인을 선택합니다. RooterTests 프로젝트가 솔루션 탐색기의 Maths 솔루션 아래에 나타납니다.
테스트 탐색기에서 테스트가 실행되는지 확인
이 Assert 클래스는 테스트 메서드에서 결과를 확인하는 데 사용할 수 있는 몇 가지 정적 메서드를 제공합니다.
솔루션 탐색기에서 RooterTests 프로젝트의 UnitTest.cs 파일을 선택합니다.
다음 코드를 삽입하십시오.
TestMethod1
[TestMethod] public void TestMethod1() { Assert.AreEqual(0, 0); }
테스트 탐색기에서 모든 테스트 실행을 선택합니다.
테스트 프로젝트가 빌드되고 실행되며 테스트가 통과한 테스트 아래에 나타납니다. 오른쪽의 그룹 요약 창에서는 테스트에 대한 세부 정보를 제공합니다.
앱 프로젝트에 클래스 추가
솔루션 탐색기에서 Maths 프로젝트를 마우스 오른쪽 단추로 클릭하고클래스추가를> 선택합니다.
클래스 파일의 이름을 Rooter.cs 지정한 다음 추가를 선택합니다.
코드 편집기에서 Rooter.cs 파일의 클래스에 다음 코드를
Rooter
추가합니다.public Rooter() { } // estimate the square root of a number public double SquareRoot(double x) { return 0.0; }
클래스는
Rooter
생성자와SquareRoot
추정기 메서드를 선언합니다. 이SquareRoot
방법은 기본 테스트 설정을 테스트하기 위한 최소 구현입니다.클래스 선언에서
Rooter
키워드를internal
topublic
로 변경하여 테스트 코드가 액세스할 수 있도록 합니다.public class Rooter
솔루션 탐색기에서 Maths 프로젝트를 마우스 오른쪽 단추로 클릭하고클래스추가를> 선택합니다.
클래스 파일의 이름을 Rooter.cs 지정한 다음 추가를 선택합니다.
코드 편집기에서 Rooter.cs 파일의 클래스에 다음 코드를
Rooter
추가합니다.public Rooter() { } // estimate the square root of a number public double SquareRoot(double x) { return 0.0; }
클래스는
Rooter
생성자와SquareRoot
추정기 메서드를 선언합니다. 이SquareRoot
방법은 기본 테스트 설정을 테스트하기 위한 최소 구현입니다.public
테스트 코드가 액세스할 수 있도록 클래스 선언에 키워드Rooter
를 추가합니다.public class Rooter
테스트 프로젝트의 참조를 앱 프로젝트로 추가합니다
솔루션 탐색기에서 RooterTests 프로젝트를 마우스 오른쪽 단추로 클릭하고참조추가를> 선택합니다.
참조 관리자 - RooterTests 대화 상자에서 프로젝트를 확장하고 Maths 프로젝트를 선택합니다.
확인을 선택합니다.
UnitTest.cs에서 줄 뒤에 다음
using
문을 추가합니다.using Microsoft.VisualStudio.TestTools.UnitTesting;
using Maths;
솔루션 탐색기에서 RooterTests 프로젝트를 마우스 오른쪽 단추로 클릭하고참조추가를> 선택합니다.
참조 관리자 - RooterTests 대화 상자에서 프로젝트를 확장하고 Maths 프로젝트를 선택합니다.
확인을 선택합니다.
UnitTest.cs 줄 뒤에
using Microsoft.VisualStudio.TestTools.UnitTesting;
다음using
문을 추가합니다.using Maths;
app 함수를 사용하는 테스트 추가
다음 테스트 메서드를 UnitTest.cs 추가합니다.
[TestMethod] public void BasicTest() { Maths.Rooter rooter = new Rooter(); double expected = 0.0; double actual = rooter.SquareRoot(expected * expected); double tolerance = .001; Assert.AreEqual(expected, actual, tolerance); }
새 테스트가 솔루션 탐색기와 테스트 탐색기의 테스트 실행 안 함 노드에 나타납니다.
"페이로드에 대상 경로가 동일한 두 개 이상의 파일이 포함되어 있습니다." 오류를 방지하려면 솔루션 탐색기에서 Maths 프로젝트 아래의 속성 노드를 확장하고 Default.rd.xml 파일을 삭제합니다.
모든 파일 저장.
테스트 실행
테스트 탐색기에서 모든 테스트 실행 아이콘을 선택합니다. 솔루션이 빌드되고 테스트가 실행 및 통과됩니다.
테스트 탐색기에서 모든 테스트 실행 아이콘을 선택합니다. 솔루션이 빌드되고 테스트가 실행 및 통과됩니다.
테스트를 실행할 때 중복 엔터티 오류가 발생하면 테스트 프로젝트에서 런타임 지시문 파일을 Properties\Default.rd.xml
삭제하고 다시 시도합니다.
테스트 및 앱 프로젝트를 설정하고 앱 프로젝트에서 함수를 호출하는 테스트를 실행할 수 있는지 확인했습니다. 이제 실제 테스트와 코드를 작성할 수 있습니다.
테스트 추가 및 통과
통과한 테스트는 변경하지 않는 것이 가장 좋습니다. 대신 새 테스트를 추가합니다. 테스트를 한 번에 하나씩 추가하여 코드를 개발하고 각 반복 후에 모든 테스트가 통과하는지 확인합니다.
UnitTest.cs 호출된
RangeTest
새 테스트를 추가합니다.[TestMethod] public void RangeTest() { Rooter rooter = new Rooter(); for (double v = 1e-6; v < 1e6; v = v * 3.2) { double expected = v; double actual = rooter.SquareRoot(v*v); double tolerance = expected/1000; Assert.AreEqual(expected, actual, tolerance); } }
RangeTest 테스트를 실행하고 실패하는지 확인합니다.
팁 (조언)
테스트 기반 개발에서는 테스트를 작성한 직후 실행합니다. 이 연습은 절대 실패하지 않는 테스트를 작성하는 쉬운 실수를 방지하는 데 도움이 됩니다.
새 테스트를 통과하도록 앱 코드를 수정합니다. Rooter.cs에서 함수를 다음과 같이 변경합니다.
SquareRoot
public double SquareRoot(double x) { double estimate = x; double diff = x; while (diff > estimate / 1000) { double previousEstimate = estimate; estimate = estimate - (estimate * estimate - x) / (2 * estimate); diff = Math.Abs(previousEstimate - estimate); } return estimate; }
테스트 탐색기에서 모든 테스트 실행 아이콘을 선택합니다. 이제 세 가지 테스트를 모두 통과했습니다.
UnitTest.cs 호출된
RangeTest
새 테스트를 추가합니다.[TestMethod] public void RangeTest() { Rooter rooter = new Rooter(); for (double v = 1e-6; v < 1e6; v = v * 3.2) { double expected = v; double actual = rooter.SquareRoot(v*v); double tolerance = expected/1000; Assert.AreEqual(expected, actual, tolerance); } }
RangeTest 테스트를 실행하고 실패하는지 확인합니다.
팁 (조언)
테스트 기반 개발에서는 테스트를 작성한 직후 실행합니다. 이 연습은 절대 실패하지 않는 테스트를 작성하는 쉬운 실수를 방지하는 데 도움이 됩니다.
새 테스트를 통과하도록 앱 코드를 수정합니다. Rooter.cs에서 함수를 다음과 같이 변경합니다.
SquareRoot
public double SquareRoot(double x) { double estimate = x; double diff = x; while (diff > estimate / 1000) { double previousEstimate = estimate; estimate = estimate - (estimate * estimate - x) / (2 * estimate); diff = Math.Abs(previousEstimate - estimate); } return estimate; }
테스트 탐색기에서 모든 테스트 실행 아이콘을 선택합니다. 이제 세 가지 테스트를 모두 통과했습니다.
코드 리팩터링
이 섹션에서는 앱과 테스트 코드를 모두 리팩터링한 다음 테스트를 다시 실행하여 여전히 통과하는지 확인합니다.
제곱근 추정을 단순화합니다.
Rooter.cs에서 다음 줄을 변경하여 함수의 중심 계산을
SquareRoot
단순화합니다.estimate = estimate - (estimate * estimate - x) / (2 * estimate);
에게
estimate = (estimate + x/estimate) / 2.0;
모든 테스트를 실행하여 회귀가 발생하지 않았는지 확인합니다. 테스트는 모두 통과해야 합니다.
중복 테스트 코드 제거
메서드는 RangeTest
메서드에 전달된 변수의 분 tolerance
모를 하드 코딩합니다 Assert . 동일한 허용 오차 계산을 사용하는 테스트를 더 추가하려는 경우 여러 위치에서 하드 코드된 값을 사용하면 코드를 유지 관리하기가 더 어려워집니다. 대신 클래스에 private 도우미 메서드를 UnitTest1
추가하여 허용 오차 값을 계산한 다음 에서 RangeTest
해당 메서드를 호출할 수 있습니다.
도우미 메서드를 추가하려면 UnitTest.cs에서 다음을 수행합니다.
UnitTest1
클래스에 다음 메서드를 추가합니다.private double ToleranceHelper(double expected) { return expected / 1000; }
에서
RangeTest
다음 줄을 변경합니다.double tolerance = expected/1000;
에게
double tolerance = ToleranceHelper(expected);
RangeTest 테스트를 실행하여 여전히 통과하는지 확인합니다.
팁 (조언)
테스트 클래스에 도우미 메서드를 추가하고 도우미 메서드가 테스트 탐색기의 목록에 표시되지 않도록 하려면 메서드에 특성을 추가 TestMethodAttribute 하지 마세요.