TestCase
NUnit 의 기능은 각 테스트에 대해 별도의 방법이 필요없이 테스트 매개 변수를 지정하는 빠른 방법으로 매우 유용합니다. MSTest에 비슷한 것이 있습니까?
[TestFixture]
public class StringFormatUtilsTest
{
[TestCase("tttt", "")]
[TestCase("", "")]
[TestCase("t3a4b5", "345")]
[TestCase("3&5*", "35")]
[TestCase("123", "123")]
public void StripNonNumeric(string before, string expected)
{
string actual = FormatUtils.StripNonNumeric(before);
Assert.AreEqual(expected, actual);
}
}
답변
Microsoft는 최근 “MSTest V2″를 발표했습니다 ( 블로그 기사 참조 ). 이를 통해 일관되게 (데스크톱, UWP 등) DataRow
-attribute!
[TestClass]
public class StringFormatUtilsTest
{
[DataTestMethod]
[DataRow("tttt", "")]
[DataRow("", "")]
[DataRow("t3a4b5", "345")]
[DataRow("3&5*", "35")]
[DataRow("123", "123")]
public void StripNonNumeric(string before, string expected)
{
string actual = FormatUtils.StripNonNumeric(before);
Assert.AreEqual(expected, actual);
}
}
다시 말하지만, Visual Studio Express의 테스트 탐색기는 불행히도 이러한 테스트를 인식하지 못합니다. 그러나 적어도 “전체”VS 버전은 이제이 기능을 지원합니다!
이를 사용하려면 NuGet 패키지 MSTest.TestFramework 및 MSTest.TestAdapter (모두 현재 시험판)를 설치하면 됩니다.
이전 답변 :
MSTest를 고수 할 필요가없고 테스트 탐색기를 통해 테스트를 실행할 수 있도록 사용하는 경우 Visual Studio Express 에디션 만 있기 때문에, 그러면 이것이 해결책이 될 수 있습니다.
테스트 탐색기를 통해 NUnit 테스트를 실행할 수 있는 VsTestAdapter VSIX 확장 이 있습니다 . 불행히도 VS Express 사용자는 확장을 설치할 수 없습니다 …하지만 다행스럽게도 VsTestAdapter에는 일반 NuGet-Package 도 함께 제공됩니다 !
따라서 VS Express 사용자 인 경우 VsTestAdapter NuGet-Package를 설치하고 테스트 탐색기를 통해 NUnit 테스트 / 테스트 케이스를 즐기십시오!
불행히도 앞서 언급 한 내용은 사실이 아닙니다. Express 에디션을 통해 패키지를 설치할 수는 있지만 테스트 탐색기를 사용할 수 없기 때문에 쓸모가 없습니다. 이전에 2.0.0의 설명 페이지 에서 제거 된 이전 버전 의 TestAdapter에 대한 추가 정보가있었습니다 .
VS Express에서는 작동하지 않습니다.
답변
나는 이것이 늦은 대답이라는 것을 알고 있지만 다른 사람들을 도울 수 있기를 바랍니다.
나는 모든 곳에서 우아한 해결책을 찾았고 결국 직접 작성했습니다. 수천 번의 단위 테스트와 수십만 번의 반복이있는 20 개가 넘는 프로젝트에서 사용합니다. 한 번도 비트를 놓친 적이 없습니다.
https://github.com/Thwaitesy/MSTestHacks
1) NuGet 패키지를 설치합니다 .
2) TestBase에서 테스트 클래스 상속
public class UnitTest1 : TestBase
{ }
3) IEnumerable을 반환하는 속성, 필드 또는 메서드를 만듭니다.
[TestClass]
public class UnitTest1 : TestBase
{
private IEnumerable<int> Stuff
{
get
{
//This could do anything, get a dynamic list from anywhere....
return new List<int> { 1, 2, 3 };
}
}
}
4) 위의 IEnumerable 이름을 다시 가리키면서 테스트 메서드에 MSTest DataSource 특성을 추가합니다. 정규화되어야합니다.
[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
var number = this.TestContext.GetRuntimeDataSourceObject<int>();
Assert.IsNotNull(number);
}
최종 결과 : 일반 DataSource와 마찬가지로 3 회 반복 🙂
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MSTestHacks;
namespace Namespace
{
[TestClass]
public class UnitTest1 : TestBase
{
private IEnumerable<int> Stuff
{
get
{
//This could do anything, get a dynamic list from anywhere....
return new List<int> { 1, 2, 3 };
}
}
[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
var number = this.TestContext.GetRuntimeDataSourceObject<int>();
Assert.IsNotNull(number);
}
}
}
답변
나는 이것이 또 다른 늦은 대답이라는 것을 알고 있지만 MS Test 프레임 워크를 사용하는 데 갇혀있는 팀에서 테스트 데이터 배열을 보유하기 위해 Anonymous Types에만 의존하고 각 행을 반복하고 테스트하는 LINQ 기술을 개발했습니다. 추가 클래스 나 프레임 워크가 필요하지 않으며 읽고 이해하기가 매우 쉽습니다. 또한 외부 파일이나 연결된 데이터베이스를 사용하는 데이터 기반 테스트보다 구현하기가 훨씬 쉽습니다.
예를 들어 다음과 같은 확장 메서드가 있다고 가정합니다.
public static class Extensions
{
/// <summary>
/// Get the Qtr with optional offset to add or subtract quarters
/// </summary>
public static int GetQuarterNumber(this DateTime parmDate, int offset = 0)
{
return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month / 3m);
}
}
LINQ에 결합 된 익명 형식 배열을 사용하여 다음과 같은 테스트를 작성할 수 있습니다.
[TestMethod]
public void MonthReturnsProperQuarterWithOffset()
{
// Arrange
var values = new[] {
new { inputDate = new DateTime(2013, 1, 1), offset = 1, expectedQuarter = 2},
new { inputDate = new DateTime(2013, 1, 1), offset = -1, expectedQuarter = 4},
new { inputDate = new DateTime(2013, 4, 1), offset = 1, expectedQuarter = 3},
new { inputDate = new DateTime(2013, 4, 1), offset = -1, expectedQuarter = 1},
new { inputDate = new DateTime(2013, 7, 1), offset = 1, expectedQuarter = 4},
new { inputDate = new DateTime(2013, 7, 1), offset = -1, expectedQuarter = 2},
new { inputDate = new DateTime(2013, 10, 1), offset = 1, expectedQuarter = 1},
new { inputDate = new DateTime(2013, 10, 1), offset = -1, expectedQuarter = 3}
// Could add as many rows as you want, or extract to a private method that
// builds the array of data
};
values.ToList().ForEach(val =>
{
// Act
int actualQuarter = val.inputDate.GetQuarterNumber(val.offset);
// Assert
Assert.AreEqual(val.expectedQuarter, actualQuarter,
"Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter);
});
}
}
이 기술을 사용할 때 Assert의 입력 데이터를 포함하는 형식화 된 메시지를 사용하면 테스트가 실패하는 원인을 식별하는 데 도움이됩니다.
AgileCoder.net 에서이 솔루션에 대한 자세한 배경 정보와 세부 정보를 블로그에 올렸 습니다 .
답변
Khlr는 자세한 설명을 제공했으며이 접근 방식은 데스크톱 용 VS2015 Express에서 작동하기 시작했습니다. 댓글을 남기려고했지만 평판이 부족해서 그렇게 할 수 없었습니다.
여기에 솔루션을 복사하겠습니다.
[TestClass]
public class StringFormatUtilsTest
{
[TestMethod]
[DataRow("tttt", "")]
[DataRow("", "")]
[DataRow("t3a4b5", "345")]
[DataRow("3&amp;5*", "35")]
[DataRow("123", "123")]
public void StripNonNumeric(string before, string expected)
{
string actual = FormatUtils.StripNonNumeric(before);
Assert.AreEqual(expected, actual);
}
}
이를 사용하려면 NuGet 패키지 MSTest.TestFramework 및 MSTest.TestAdapter를 설치하십시오 .
한 가지 문제는
오류 CS0433 ‘TestClassAttribute’유형은 ‘Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version = 10.0.0.0 및’Microsoft.VisualStudio.TestPlatform.TestFramework, Version = 14.0.0.0 모두에 있습니다.
따라서 프로젝트 참조에서 Microsoft.VisualStudio.QualityTools.UnitTestFramework 를 제거 하십시오 .
원래 답장을 수정하고이 답장을 삭제할 수 있습니다.
답변
MSTest에는 데이터베이스 테이블, csv, xml 등을 제공 할 수있는 DataSource 속성이 있습니다.이 속성을 사용해 보았고 잘 작동합니다. 질문에서와 같이 속성으로 데이터를 바로 위에 배치하는 방법을 모르겠지만 외부 데이터 소스를 설정하는 것은 매우 쉽고 파일을 프로젝트에 포함 할 수 있습니다. 시작했을 때부터 한 시간 동안 실행했고 자동화 된 테스트 전문가가 아닙니다.
https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396 에는 데이터베이스 입력을 기반으로 한 전체 자습서가 있습니다.
http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/ 에는 XML 파일 입력을 기반으로하는 자습서가 있습니다.