데이터 기반 단위 테스트 만들기
관리 코드에 MICROSOFT MSTest(단위 테스트 프레임워크)를 사용하여 데이터 원본에서 값을 검색하는 단위 테스트 메서드를 설정할 수 있습니다. 이 메서드는 데이터 원본의 각 행에 대해 연속적으로 실행되므로 단일 메서드를 사용하여 다양한 입력을 쉽게 테스트할 수 있습니다.
데이터 기반 단위 테스트는 다음 종류 중에서 사용할 수 있습니다.
-
DataRow
특성을 사용하는 인라인 데이터 -
DynamicData
특성을 사용하는 멤버 데이터 -
DataSource
특성을 사용하여 잘 알려진 일부 원본 공급자에서
테스트 중인 메서드
예를 들어 다음이 있다고 가정해 보겠습니다.
다양한 유형의 계정에 대한 트랜잭션을 수락하고 처리하는
MyBank
솔루션입니다.MyBank
에 있는 계정 트랜잭션을 관리하는BankDb
프로젝트입니다.모든 트랜잭션이 은행에 유리하도록 수학적 기능을 수행하는
Maths
프로젝트에서BankDb
클래스입니다.BankDbTests
구성 요소의 동작을 테스트하기 위해BankDb
호출된 단위 테스트 프로젝트입니다.MathsTests
클래스의 동작을 확인하기 위해Maths
호출된 단위 테스트 클래스입니다.
루프를 사용하여 두 개의 정수가 추가되는 Maths
메서드를 테스트합니다.
public int AddIntegers(int first, int second)
{
int sum = first;
for (int i = 0; i < second; i++)
{
sum += 1;
}
return sum;
}
테스트 테스트 방법
인라인 데이터 기반 테스트
인라인 테스트의 경우 MSTest는 DataRow
사용하여 데이터 기반 테스트에서 사용되는 값을 지정합니다. 이 예제의 테스트는 각 데이터 행에 대해 연속적으로 실행됩니다.
[TestMethod]
[DataRow(1, 1, 2)]
[DataRow(2, 2, 4)]
[DataRow(3, 3, 6)]
[DataRow(0, 0, 1)] // The test run with this row fails
public void AddIntegers_FromDataRowTest(int x, int y, int expected)
{
var target = new Maths();
int actual = target.AddIntegers(x, y);
Assert.AreEqual(expected, actual,
"x:<{0}> y:<{1}>",
new object[] {x, y});
}
멤버 데이터 기반 테스트
MSTest는 DynamicData
특성을 사용하여 데이터 기반 테스트에서 사용되는 데이터를 제공할 멤버의 이름, 종류 및 정의 형식(기본적으로 현재 형식이 사용됨)을 지정합니다.
메모
MSTest 3.8 이전에는 DynamicDataSourceType
열거형에 Property
및 Method
두 개의 멤버가 있었습니다. 기본값은 Property
. MSTest 3.8부터 새 멤버 AutoDetect
열거형에 추가되고 기본값입니다. 따라서 더 이상 DynamicDataSourceType
지정할 필요가 없습니다.
public static IEnumerable<object[]> AdditionData
{
get
{
return new[]
{
new object[] { 1, 1, 2 },
new object[] { 2, 2, 4 },
new object[] { 3, 3, 6 },
new object[] { 0, 0, 1 }, // The test run with this row fails
};
}
}
[TestMethod]
[DynamicData(nameof(AdditionData))]
public void AddIntegers_FromDynamicDataTest(int x, int y, int expected)
{
var target = new Maths();
int actual = target.AddIntegers(x, y);
Assert.AreEqual(expected, actual,
"x:<{0}> y:<{1}>",
new object[] {x, y});
}
DynamicDataDisplayName
특성의 DynamicData
속성을 사용하여 생성된 기본 표시 이름을 재정의할 수도 있습니다. 표시 이름 메서드 서명은 public static string
있어야 하며 두 개의 매개 변수인 MethodInfo
형식의 첫 번째 매개 변수와 object[]
형식의 두 번째 매개 변수를 허용해야 합니다.
public static string GetCustomDynamicDataDisplayName(MethodInfo methodInfo, object[] data)
{
return string.Format("DynamicDataTestMethod {0} with {1} parameters", methodInfo.Name, data.Length);
}
[DynamicData(nameof(AdditionData), DynamicDataDisplayName = nameof(GetCustomDynamicDataDisplayName))]
원본 공급자 데이터 기반 테스트
데이터 원본 기반 단위 테스트를 만들려면 다음 단계를 수행합니다.
테스트 메서드에서 사용하는 값이 포함된 데이터 원본을 만듭니다. 데이터 원본은 테스트를 실행하는 컴퓨터에 등록된 모든 형식일 수 있습니다.
TestContext
형식의 공용 TestContext 속성을 테스트 클래스에 추가합니다.단위 테스트 메서드 만들기
DataSourceAttribute 특성을 추가합니다.
DataRow 인덱서 속성을 사용하여 테스트에서 사용하는 값을 검색합니다.
데이터 원본 만들기
AddIntegers
메서드를 테스트하려면 매개 변수의 값 범위와 반환될 것으로 예상되는 합계를 지정하는 데이터 원본을 만듭니다. 이 예제에서는 MathsData
이라는 Sql Compact 데이터베이스와 다음 열 이름과 값이 포함된 AddIntegersData
테이블을 만듭니다.
퍼스트넘버 | 두 번째 숫자 | 합계 |
---|---|---|
0 | 1 | 1 |
1 | 1 | 2 |
2 | -3 | -1 |
테스트 클래스에 TestContext 추가
단위 테스트 프레임워크는 데이터 기반 테스트에 대한 데이터 원본 정보를 저장하는 TestContext
개체를 만듭니다. 그런 다음 프레임워크는 이 개체를 사용자가 만든 TestContext
속성의 값으로 설정합니다.
public TestContext TestContext { get; set; }
테스트 메서드에서 DataRow
TestContext
인덱서 속성을 통해 데이터에 액세스합니다.
메모
.NET Core는 DataSource 특성을 지원하지 않습니다. .NET Core, UWP 또는 WinUI 단위 테스트 프로젝트에서 이러한 방식으로 테스트 데이터에 액세스하려고 하면 "'TestContext'에 'DataRow'에 대한 정의가 없고 'TestContext' 형식의 첫 번째 인수를 수락하는 액세스 가능한 확장 메서드 'DataRow'가 없습니다(using 지시문 또는 어셈블리 참조가 누락되었나요?)"와 유사한 오류가.
테스트 메서드 작성
AddIntegers
테스트 방법은 매우 간단합니다. 데이터 원본의 각 행에 대해 AddIntegers
및 SecondNumber 열 값을 매개변수로 하여 를 호출하고, 반환 값을 Sum 열 값과 비교하여 확인합니다.
[TestMethod]
[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0; Data Source=C:\Data\MathsData.sdf;", "Numbers")]
public void AddIntegers_FromDataSourceTest()
{
var target = new Maths();
// Access the data
int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]);
int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
int actual = target.AddIntegers(x, y);
Assert.AreEqual(expected, actual,
"x:<{0}> y:<{1}>",
new object[] {x, y});
}
DataSourceAttribute를 지정하십시오
DataSource
특성은 데이터 원본에 대한 연결 문자열과 테스트 메서드에서 사용하는 테이블의 이름을 지정합니다. 연결 문자열의 정확한 정보는 사용 중인 데이터 원본의 종류에 따라 다릅니다. 이 예제에서는 SqlServerCe 데이터베이스를 사용했습니다.
[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0;Data Source=C:\Data\MathsData.sdf", "AddIntegersData")]
주의
연결 문자열에는 중요한 데이터(예: 암호)가 포함될 수 있습니다. 연결 문자열은 소스 코드 및 컴파일된 어셈블리에 일반 텍스트로 저장됩니다. 소스 코드 및 어셈블리에 대한 액세스를 제한하여 이 중요한 정보를 보호합니다.
DataSource 특성에는 세 개의 생성자가 있습니다.
[DataSource(dataSourceSettingName)]
하나의 매개 변수가 있는 생성자는 솔루션의 app.config 파일에 저장된 연결 정보를 사용합니다. dataSourceSettingsName 연결 정보를 지정하는 구성 파일의 Xml 요소 이름입니다.
app.config 파일을 사용하면 단위 테스트 자체를 변경하지 않고도 데이터 원본의 위치를 변경할 수 있습니다. app.config 파일을 만들고 사용하는 방법에 대한 자세한 내용은 연습: 구성 파일을 사용하여 데이터 원본 정의
[DataSource(connectionString, tableName)]
두 매개 변수가 있는 DataSource
생성자는 데이터 원본의 연결 문자열과 테스트 메서드에 대한 데이터가 포함된 테이블의 이름을 지정합니다.
연결 문자열은 데이터 원본 형식에 따라 달라지지만 데이터 공급자의 고정 이름을 지정하는 Provider 요소를 포함해야 합니다.
[DataSource(
dataProvider,
connectionString,
tableName,
dataAccessMethod
)]
TestContext.DataRow를 사용하여 데이터에 액세스
AddIntegersData
테이블의 데이터에 액세스하려면 TestContext.DataRow
인덱서를 사용합니다.
DataRow
DataRow 개체이므로 인덱스 또는 열 이름으로 열 값을 검색합니다. 값이 개체로 반환되므로 해당 형식으로 변환합니다.
int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
테스트 실행 및 결과 보기
테스트 메서드 작성을 마쳤으면 테스트 프로젝트를 빌드합니다. 테스트 메서드는 테스트 탐색기의 실행되지 않은 테스트 그룹에 나타납니다. 테스트를 실행, 쓰기 및 다시 실행할 때 테스트 탐색기실패한 테스트, 통과한 테스트및 테스트 실행 안 됨그룹에 결과를 표시합니다. 모두 실행을 선택하여 모든 테스트를 실행하거나, 실행을 선택하여 실행할 테스트의 하위 집합을 선택할 수 있습니다.
테스트 탐색기 맨 위에 있는 테스트 결과 표시줄은 테스트가 실행되면 애니메이션 효과를 줍니다. 테스트 실행이 끝나면 모든 테스트가 통과하면 표시줄이 녹색으로 표시되고, 테스트가 실패한 경우 빨간색이 됩니다. 테스트 실행 요약은 테스트 탐색기 창의 아래쪽에 있는 세부 정보 창에 표시됩니다. 테스트를 선택하여 아래쪽 창에서 해당 테스트의 세부 정보를 봅니다.
메모
각 데이터 행에 대한 결과와 하나의 요약 결과도 있습니다. 각 데이터 행에서 테스트가 통과된 경우 요약 실행에는 통과로 표시됩니다. 데이터 행에서 테스트가 실패한 경우 요약 실행은 실패한표시됩니다.
예제에서 AddIntegers_FromDataRowTest
, AddIntegers_FromDynamicDataTest
또는 AddIntegers_FromDataSourceTest
메서드를 실행한 경우 결과 표시줄이 빨간색으로 바뀌고 테스트 메서드가 실패한 테스트이동합니다. 데이터 원본의 반복된 메서드가 실패하면 데이터 기반 테스트가 실패합니다.
테스트 탐색기 창에서 실패한 데이터 기반 테스트를 선택하면 세부 정보 창에 데이터 행 인덱스로 식별되는 각 반복의 결과가 표시됩니다. 이 예제에서는 AddIntegers
알고리즘이 음수 값을 올바르게 처리하지 않는 것으로 보입니다.
테스트 중인 메서드가 수정되고 테스트가 다시 실행되면 결과 표시줄이 녹색으로 바뀌고 테스트 메서드가 통과한 테스트 그룹으로 이동됩니다.
관련 콘텐츠
- Microsoft.VisualStudio.TestTools.UnitTesting.DataSourceAttribute
- Microsoft.VisualStudio.TestTools.UnitTesting.TestContext
- Microsoft.VisualStudio.TestTools.UnitTesting.TestContext.DataRow
- Microsoft.VisualStudio.TestTools.UnitTesting.Assert
- 코드에 대한 단위 테스트를 수행하세요
- 테스트 탐색기 사용하여 단위 테스트 실행
- Microsoft 단위 테스트 프레임워크를 사용하여 .NET에 대한 단위 테스트 작성