단위 테스트를 만들고 실행하여 코드가 예상대로 작동하는지 확인합니다. 프로그램의 기능을 개별 단위로 테스트할 수 있는 개별 테스트 가능한 동작으로 세분화하기 때문에 단위 테스트라고 합니다. Visual Studio 테스트 탐색기는 Visual Studio에서 단위 테스트를 실행하고 결과를 볼 수 있는 유연하고 효율적인 방법을 제공합니다. Visual Studio는 관리 코드 및 네이티브 코드에 대한 Microsoft 단위 테스트 프레임워크를 설치합니다. 단위 테스트 프레임워크를 사용하여 단위 테스트를 만들고, 실행하고, 이러한 테스트의 결과를 보고합니다. 코드가 여전히 제대로 작동하는지 테스트하기 위해 변경할 때 단위 테스트를 다시 실행합니다. Visual Studio Enterprise는 코드 변경의 영향을 받는 테스트를 검색하고 입력할 때 백그라운드에서 실행하는 Live Unit Testing을 사용하여 이 작업을 자동으로 수행할 수 있습니다.
단위 테스트는 소프트웨어 개발 워크플로의 필수적인 부분인 경우 코드 품질에 가장 큰 영향을 줍니다. 함수 또는 다른 애플리케이션 코드 블록을 작성하는 즉시 입력 데이터의 표준, 경계 및 잘못된 사례에 대한 응답으로 코드의 동작을 확인하고 코드에서 명시적 또는 암시적 가정을 확인하는 단위 테스트를 만듭니다. 테스트 기반 개발을 사용하면 코드를 작성하기 전에 단위 테스트를 만들 수 있으므로 단위 테스트를 디자인 설명서와 기능 사양 모두로 사용합니다.
테스트 탐색기는 테스트 탐색기 추가 기능 인터페이스를 구현한 타사 및 오픈 소스 단위 테스트 프레임워크를 실행할 수도 있습니다. Visual Studio 확장 관리자 및 Visual Studio 갤러리를 통해 이러한 프레임워크를 많이 추가할 수 있습니다. 자세한 내용은 타사 단위 테스트 프레임워크 설치를 참조하세요.
코드에서 테스트 프로젝트 및 테스트 메서드를 빠르게 생성하거나 필요에 따라 테스트를 수동으로 만들 수 있습니다. IntelliTest를 사용하여 .NET 코드를 탐색하는 경우 테스트 데이터와 단위 테스트 제품군을 생성할 수 있습니다. 코드의 모든 문에 대해 해당 문을 실행할 테스트 입력이 생성됩니다. .NET 코드에 대한 단위 테스트를 생성하는 방법을 알아보세요.
시작하기
코딩으로 직접 이동되는 단위 테스트에 대한 소개는 다음 문서 중 하나를 참조하세요.
은행 솔루션 예제
이 문서에서는 예제로 호출 MyBank 되는 가상 애플리케이션의 개발을 사용합니다. 이 문서의 설명을 따르기 위해 실제 코드가 필요하지 않습니다. 테스트 메서드는 C#으로 작성되며 관리 코드용 Microsoft Unit Testing Framework를 사용하여 제공됩니다. 그러나 개념은 다른 언어 및 프레임워크로 쉽게 전송됩니다.
애플리케이션 디자인 MyBank 의 첫 번째 시도에는 개별 계정 및 은행과의 거래를 나타내는 계정 구성 요소와 개별 계정을 집계하고 관리하는 기능을 나타내는 데이터베이스 구성 요소가 포함됩니다.
우리는 두 개의 프로젝트가 포함된 솔루션을 Bank 만듭니다.
AccountsBankDB
프로젝트를 디자인하는 Accounts 첫 번째 시도에는 계정에 대한 기본 정보를 보유하는 클래스, 계정에서 자산을 입금 및 인출하는 것과 같은 모든 유형의 계정의 공통 기능을 지정하는 인터페이스 및 체크 아웃 계정을 나타내는 인터페이스에서 파생된 클래스가 포함됩니다. 다음 원본 파일을 만들어 계정 프로젝트를 시작합니다.
AccountInfo.cs 계정에 대한 기본 정보를 정의합니다.
IAccount.cs 계정에서 자산을 입금 및 인출하고 계정 잔액을 검색하는 방법을 포함하여 계정에 대한 표준
IAccount인터페이스를 정의합니다.CheckingAccount.cs 확인 계정에 대한 인터페이스를
CheckingAccount구현하는 클래스를 포함합니다IAccount.
우리는 경험을 통해 당좌 예금 계좌에서 인출할 때 필수적으로 확인해야 할 사항은 인출 금액이 계좌 잔고보다 적은지 확인하는 것입니다. 그래서 IAccount.Withdraw 내 CheckingAccount 메서드를 이 조건을 확인하는 메서드로 오버라이드합니다. 메서드는 다음과 같이 표시될 수 있습니다.
public void Withdraw(double amount)
{
if(m_balance >= amount)
{
m_balance -= amount;
}
else
{
throw new ArgumentException(nameof(amount), "Withdrawal exceeds balance!");
}
}
이제 몇 가지 코드가 있으므로 테스트할 시간입니다.
Copilot를 사용하여 단위 테스트 만들기
Copilot /tests 슬래시 명령을 사용하여 코드에서 단위 테스트를 생성할 수도 있습니다. 예를 들어 NUnit 테스트를 생성하기 위해 입력 /tests using NUnit Framework 할 수 있습니다. 자세한 내용은 코필로트 채팅에서 슬래시 명령 사용을 참조하세요.
단위 테스트 프로젝트 및 테스트 메서드 만들기(C#)
C#의 경우 코드에서 단위 테스트 프로젝트 및 단위 테스트 스텁을 생성하는 것이 더 빠른 경우가 많습니다. 또는 요구 사항에 따라 단위 테스트 프로젝트 및 테스트를 수동으로 만들도록 선택할 수 있습니다. 타사 프레임워크를 사용하여 코드에서 단위 테스트를 만들려면 NUnit 또는 xUnit 확장 중 하나가 설치되어 있어야 합니다. C#을 사용하지 않는 경우 이 섹션을 건너뛰고 단위 테스트 프로젝트 및 단위 테스트 만들기로 수동으로 이동합니다.
단위 테스트 프로젝트 및 단위 테스트 스텁 생성
코드 편집기 창에서 마우스 오른쪽 단추를 클릭하고 오른쪽 클릭 메뉴에서 단위 테스트 만들기 를 선택합니다.
비고
단위 테스트 만들기 메뉴 명령은 C# 코드에만 사용할 수 있습니다. .NET Core 또는 .NET Standard에서 이 메서드를 사용하려면 Visual Studio 2019 이상이 필요합니다.
비고
단위 테스트 만들기 메뉴 명령은 C# 코드에만 사용할 수 있습니다. .NET Core 또는 .NET Standard에서 이 메서드를 사용하려면 Visual Studio 2019 이상이 필요합니다.
기본값을 적용하여 단위 테스트를 만들거나 단위 테스트 프로젝트 및 단위 테스트를 만들고 이름을 지정하는 데 사용되는 값을 변경하려면 [확인 ]을 선택합니다. 단위 테스트 메서드에 기본적으로 추가되는 코드를 선택할 수 있습니다.
단위 테스트 스텁은 클래스의 모든 메서드에 대한 새 단위 테스트 프로젝트에서 만들어집니다.
이제 단위 테스트를 의미 있게 만드는 테스트를 작성하는 방법과 코드를 철저히 테스트하기 위해 추가할 수 있는 추가 단위 테스트에 대해 알아봅니다.
단위 테스트 프로젝트 및 단위 테스트를 수동으로 만들기
단위 테스트 프로젝트는 일반적으로 단일 코드 프로젝트의 구조를 미러링합니다. MyBank 예제에서는 AccountsTests 솔루션에 명명된 BankDbTests 및 Bank 두 개의 단위 테스트 프로젝트를 추가합니다. 테스트 프로젝트 이름은 임의이지만 표준 명명 규칙을 채택하는 것이 좋습니다.
솔루션에 단위 테스트 프로젝트를 추가하려면 다음을 수행합니다.
솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고새>추가를 선택합니다.
프로젝트 템플릿 검색 상자에 테스트를 입력하여 사용하려는 테스트 프레임워크에 대한 단위 테스트 프로젝트 템플릿을 찾습니다. (이 문서의 예제에서는 MSTest를 사용합니다.)
다음 페이지에서 프로젝트 이름을 지정합니다. 예제의
Accounts프로젝트를 테스트하려면 프로젝트AccountsTests이름을 지정할 수 있습니다.단위 테스트 프로젝트에서 테스트 중인 코드 프로젝트에 대한 참조를 계정 프로젝트에 추가합니다.
코드 프로젝트에 대한 참조를 만들려면 다음을 수행합니다.
솔루션 탐색기의 단위 테스트 프로젝트에서 참조 또는 종속성 노드를 마우스 오른쪽 단추로 클릭한 다음 사용할 수 있는 프로젝트 참조 추가 또는 참조 추가를 선택합니다.
참조 관리자 대화 상자에서 솔루션 노드를 열고 프로젝트를 선택합니다. 코드 프로젝트 이름을 선택하고 대화 상자를 닫습니다.
각 단위 테스트 프로젝트에는 코드 프로젝트의 클래스 이름을 미러링하는 클래스가 포함되어 있습니다. 이 예제에서 AccountsTests 프로젝트에는 다음 클래스가 포함됩니다.
AccountInfoTests클래스는AccountInfo프로젝트의Accounts클래스에 대한 단위 테스트 메서드를 포함합니다.CheckingAccountTests클래스는CheckingAccount클래스에 대한 단위 테스트 메서드를 포함합니다.
테스트 작성
사용하는 단위 테스트 프레임워크와 Visual Studio IntelliSense는 코드 프로젝트에 대한 단위 테스트에 대한 코드 작성을 안내합니다. 테스트 탐색기에서 실행하려면 대부분의 프레임워크에서 단위 테스트 메서드를 식별하기 위해 특정 특성을 추가해야 합니다. 또한 프레임워크는 일반적으로 어설션 문 또는 메서드 특성을 통해 테스트 메서드의 통과 여부를 나타내는 방법을 제공합니다. 다른 특성은 클래스 초기화 및 각 테스트 메서드 이전 및 각 테스트 메서드 후 및 클래스가 제거되기 전에 실행되는 해체 메서드 앞에 있는 선택적 설정 메서드를 식별합니다.
AAA(정렬, 작업, 어설션) 패턴은 테스트 중인 메서드에 대한 단위 테스트를 작성하는 일반적인 방법입니다.
단위 테스트 메서드의 Arrange 섹션은 개체를 초기화하고 테스트 중인 메서드에 전달되는 데이터의 값을 설정합니다.
Act 섹션은 정렬된 매개 변수를 사용하여 테스트 중인 메서드를 호출합니다.
Assert 섹션에서는 테스트 중인 메서드의 동작이 예상대로 작동하는지 확인합니다. .NET의 경우 클래스의 Assert 메서드는 종종 확인에 사용됩니다.
예제의 메서드를 CheckingAccount.Withdraw 테스트하기 위해 두 가지 테스트를 작성할 수 있습니다. 하나는 메서드의 표준 동작을 확인하는 테스트이고, 다른 하나는 잔액 이상의 인출이 실패하는 것을 확인하는 것입니다(다음 코드는 .NET에서 지원되는 MSTest 단위 테스트를 보여 줍니다.). 클래스에서 CheckingAccountTests 다음 메서드를 추가합니다.
[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
// arrange
double currentBalance = 10.0;
double withdrawal = 1.0;
double expected = 9.0;
var account = new CheckingAccount("JohnDoe", currentBalance);
// act
account.Withdraw(withdrawal);
// assert
Assert.AreEqual(expected, account.Balance);
}
[TestMethod]
public void Withdraw_AmountMoreThanBalance_Throws()
{
// arrange
var account = new CheckingAccount("John Doe", 10.0);
// act and assert
Assert.ThrowsException<System.ArgumentException>(() => account.Withdraw(20.0));
}
Microsoft 단위 테스트 프레임워크에 대한 자세한 내용은 다음 문서 중 하나를 참조하세요.
단위 테스트에 대한 시간 제한 설정
MSTest 프레임워크를 사용하는 경우 개별 테스트 메서드에서 시간 제한을 설정하는 데 사용할 TimeoutAttribute 수 있습니다.
[TestMethod]
[Timeout(2000)] // Milliseconds
public void My_Test()
{ ...
}
제한 시간을 허용되는 최대값으로 설정하려면 다음을 수행합니다.
[TestMethod]
[Timeout(TestTimeout.Infinite)] // Milliseconds
public void My_Test ()
{ ...
}
테스트 탐색기에서 테스트 실행
테스트 프로젝트를 빌드하면 테스트 탐색기에 테스트가 표시됩니다. 테스트 탐색기가 표시되지 않으면 Visual Studio 메뉴에서 테스트를 선택하고 Windows를 선택한 다음 테스트 탐색기를 선택합니다(또는 Ctrl + E, T를 누릅니다).
테스트를 실행, 쓰기 및 다시 실행할 때 테스트 탐색기는실패한 테스트, 통과한 테스트, 건너뛴 테스트 및 테스트 실행 안 됨 그룹의 결과를 표시할 수 있습니다. 도구 모음에서 옵션별로 다른 그룹을 선택할 수 있습니다.
전역 수준의 검색 상자에서 텍스트를 일치하거나 미리 정의된 필터 중 하나를 선택하여 모든 보기에서 테스트를 필터링할 수도 있습니다. 언제든지 모든 테스트를 실행할 수 있습니다. 테스트 실행 결과는 탐색기 창 맨 위에 있는 통과/실패 표시줄에서 즉시 표시됩니다. 테스트를 선택하면 테스트 메서드 결과의 세부 정보가 표시됩니다.
테스트 실행 및 보기
테스트 탐색기 도구 모음을 사용하면 관심 있는 테스트를 검색, 구성 및 실행할 수 있습니다.
모두 실행을 선택하여 모든 테스트를 실행하거나(또는 Ctrl + R, V를 누르거나) 실행을 선택하여 실행할 테스트 하위 집합(Ctrl + R, T)을 선택할 수 있습니다. 테스트를 선택하여 테스트 세부 정보 창에서 해당 테스트의 세부 정보를 봅니다. 마우스 오른쪽 단추 클릭 메뉴(키보드: F12)에서 테스트 열기를 선택하여 선택한 테스트의 소스 코드를 표시합니다.
개별 테스트에 순서대로 실행되지 않도록 하는 종속성이 없는 경우 도구 모음의 설정 메뉴에서 병렬 테스트 실행을 켭니다. 이렇게 하면 모든 테스트를 실행하는 데 걸리는 시간을 눈에 띄게 줄일 수 있습니다.
모든 빌드 후 테스트 실행
각 로컬 빌드 후에 단위 테스트를 실행하려면 테스트 탐색기 도구 모음에서 설정 아이콘을 열고 빌드 후 테스트 실행을 선택합니다.
테스트 목록 필터링 및 그룹화
테스트 수가 많은 경우 테스트 탐색기 검색 상자에 입력하여 지정된 문자열로 목록을 필터링할 수 있습니다. 필터 목록에서 선택하여 필터 이벤트를 더 제한할 수 있습니다.
| 단추 | Description |
|---|---|
|
범주별로 테스트를 그룹화하려면 그룹화 단추를 선택합니다. |
자세한 내용은 테스트 탐색기를 사용하여 단위 테스트 실행을 참조하세요.
질문 및 답변
Q: 단위 테스트를 디버그하려면 어떻게 하나요?
A:테스트 탐색기를 사용하여 테스트 에 대한 디버깅 세션을 시작합니다. Visual Studio 디버거를 사용하여 코드를 단계별로 실행하면 단위 테스트와 테스트 중인 프로젝트 간에 원활하게 앞뒤로 이동할 수 있습니다. 디버깅을 시작하려면:
Visual Studio 편집기에서 디버그하려는 하나 이상의 테스트 메서드에서 중단점을 설정합니다.
비고
테스트 메서드는 순서에 따라 실행할 수 있으므로 디버그하려는 모든 테스트 메서드에서 중단점을 설정합니다.
테스트 탐색기에서 테스트 메서드를 선택한 다음 바로 가기 메뉴에서 선택한 테스트 디버그를 선택합니다.
단위 테스트 디버깅에 대한 자세한 내용을 알아봅니다.
Q: TDD를 사용하는 경우 테스트에서 코드를 생성하려면 어떻게 해야 하나요?
A: 빠른 작업을 사용하여 프로젝트 코드에서 클래스 및 메서드를 생성합니다. 생성하려는 클래스 또는 메서드를 호출하는 문을 테스트 메서드에 작성한 다음 오류 아래에 나타나는 전구를 엽니다. 새 클래스의 생성자에 대한 호출인 경우 메뉴에서 형식 생성 을 선택하고 마법사에 따라 코드 프로젝트에 클래스를 삽입합니다. 메서드에 대한 호출인 경우 IntelliSense 메뉴에서 메서드 생성 을 선택합니다.
Q: 여러 데이터 집합을 입력으로 사용하여 테스트를 실행하는 단위 테스트를 만들 수 있나요?
A: 예.
데이터 기반 테스트 메서드 를 사용하면 단일 단위 테스트 메서드를 사용하여 값 범위를 테스트할 수 있습니다.
DataRow
DynamicData
DataSource 테스트하려는 변수 값이 포함된 데이터 원본을 지정하는 테스트 메서드 또는 특성을 사용합니다.
특성이 지정된 메서드는 데이터 원본의 각 행에 대해 한 번씩 실행됩니다. 테스트 탐색기는 반복이 실패하는 경우 메서드에 대한 테스트 실패를 보고합니다. 메서드의 테스트 결과 세부 정보 창에는 각 데이터 행에 대한 통과/실패 상태 메서드가 표시됩니다.
데이터 기반 단위 테스트에 대해 자세히 알아봅니다.
Q: 단위 테스트에서 테스트하는 코드의 양을 볼 수 있나요?
A: 예. Visual Studio의 Visual Studio Code 검사 도구를 사용하여 단위 테스트에서 실제로 테스트되는 코드의 양을 확인할 수 있습니다. 네이티브 및 관리되는 언어와 단위 테스트 프레임워크에서 실행할 수 있는 모든 단위 테스트 프레임워크가 지원됩니다.
A: 예. Visual Studio Enterprise의 Visual Studio Code 검사 도구를 사용하여 단위 테스트에서 실제로 테스트되는 코드의 양을 확인할 수 있습니다. 네이티브 및 관리되는 언어와 단위 테스트 프레임워크에서 실행할 수 있는 모든 단위 테스트 프레임워크가 지원됩니다.
선택한 테스트 또는 솔루션의 모든 테스트에서 코드 검사를 실행할 수 있습니다. 코드 검사 결과 창에는 줄, 함수, 클래스, 네임스페이스 및 모듈별로 실행된 제품 코드 블록의 백분율이 표시됩니다.
솔루션에서 테스트 메서드에 대한 코드 검사를 실행하려면모든 테스트에 대한 테스트> 분석 코드 검사를 선택합니다.
검사 결과는 코드 검사 결과 창에 표시됩니다.
코드 검사에 대해 자세히 알아봅니다.
Q: 코드에서 외부 종속성이 있는 메서드를 테스트할 수 있나요?
A: 예. Visual Studio Enterprise가 있는 경우 관리 코드에 단위 테스트 프레임워크를 사용하여 작성하는 테스트 메서드와 함께 Microsoft Fakes를 사용할 수 있습니다.
Microsoft Fakes는 다음 두 가지 방법을 사용하여 외부 종속성에 대한 대체 클래스를 만듭니다.
스텁은 대상 종속성 클래스의 부모 인터페이스에서 파생된 대체 클래스를 생성합니다. 스텁 메서드는 대상 클래스의 공용 가상 메서드로 대체할 수 있습니다.
Shim은 런타임 계측을 사용하여 대상 메서드에 대한 호출을 가상이 아닌 메서드에 대한 대체 shim 메서드로 전환합니다.
두 방법 모두 종속성 메서드에 대한 호출의 생성된 대리자를 사용하여 테스트 메서드에서 원하는 동작을 지정합니다.
Microsoft Fakes를 사용하여 단위 테스트 메서드를 격리하는 방법에 대해 자세히 알아봅니다.
Q: 다른 단위 테스트 프레임워크를 사용하여 단위 테스트를 만들 수 있나요?
A: 예, 다음 단계에 따라 다른 프레임워크를 찾아 설치합니다. Visual Studio를 다시 시작한 후 솔루션을 다시 열어 단위 테스트를 만든 다음, 여기에서 설치된 프레임워크를 선택합니다.
선택한 프레임워크를 사용하여 단위 테스트 스텁을 만듭니다.
Q: 단위 테스트 결과를 내보내려면 어떻게 해야 하나요?
A: 명령줄 또는 Visual Studio IDE와 함께 .runsettings 파일을 사용하여 단위 테스트를 구성하고 테스트 결과 파일을 설정할 수 있습니다. 자세한 내용은 LoggerRunSettings 요소를 참조하세요.