NUnit에는 아래와 같은 Values라는 기능이 있습니다.
[Test]
public void MyTest(
[Values(1,2,3)] int x,
[Values("A","B")] string s)
{
// ...
}
이는 테스트 방법이 6 번 실행됨을 의미합니다.
MyTest(1, "A")
MyTest(1, "B")
MyTest(2, "A")
MyTest(2, "B")
MyTest(3, "A")
MyTest(3, "B")
지금 MSTest를 사용하고 있지만 여러 매개 변수로 동일한 테스트를 실행할 수 있도록 이에 상응하는 것이 있습니까?
[TestMethod]
public void Mytest()
{
// ...
}
답변
불행히도 이전 버전의 MSTest에서는 지원되지 않습니다. 분명히 확장 성 모델이 있으며 직접 구현할 수 있습니다 . 또 다른 옵션은 데이터 기반 테스트 를 사용 하는 것 입니다.
내 개인적인 의견은 NUnit을 고수하는 것입니다 …
Visual Studio 2012, 업데이트 1부터 MSTest의 기능이 비슷합니다. McAden의 답변을 참조하십시오 .
답변
편집 4 : MSTest V2 2016 년 6 월 17 일에 완료된 것 같습니다 : https://blogs.msdn.microsoft.com/visualstudioalm/2016/06/17/taking-the-mstest-framework-forward-with-mstest- v2 /
원래 답변 :
약 일주일 전 Visual Studio 2012 Update 1에서 비슷한 것이 가능해졌습니다.
[DataTestMethod]
[DataRow(12,3,4)]
[DataRow(12,2,6)]
[DataRow(12,4,3)]
public void DivideTest(int n, int d, int q)
{
Assert.AreEqual( q, n / d );
}
편집 : WinRT / Metro 의 단위 테스트 프로젝트에서만 사용할 수 있습니다. . 버머
편집 2 : 다음은 Visual Studio에서 “정의로 이동”을 사용하여 찾은 메타 데이터입니다.
#region Assembly Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll, v11.0.0.0
// C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\MSTestFramework\11.0\References\CommonConfiguration\neutral\Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll
#endregion
using System;
namespace Microsoft.VisualStudio.TestPlatform.UnitTestFramework
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class DataTestMethodAttribute : TestMethodAttribute
{
public DataTestMethodAttribute();
public override TestResult[] Execute(ITestMethod testMethod);
}
}
편집 3 :이 문제는 Visual Studio의 UserVoice 포럼에서 제기되었습니다. 마지막 업데이트 상태 :
STARTED · Visual Studio Team ADMIN Visual Studio Team (Microsoft Visual Studio 제품 팀)이 응답했습니다. · 2016 년 4 월 25 일 피드백에 감사드립니다. 우리는이 일을 시작했습니다.
프라 탑 락쉬 만 비주얼 스튜디오
답변
이 기능은 시험판에 있습니다 현재 이며 Visual Studio 2015에서 작동합니다.
예를 들면 다음과 같습니다.
[TestClass]
public class UnitTest1
{
[DataTestMethod]
[DataRow(1, 2, 2)]
[DataRow(2, 3, 5)]
[DataRow(3, 5, 8)]
public void AdditionTest(int a, int b, int result)
{
Assert.AreEqual(result, a + b);
}
}
답변
NUnit의 Value
(또는 TestCase
) 속성 과 정확히 동일 하지는 않지만 MSTest에는 DataSource
속성이 있으므로 유사한 작업을 수행 할 수 있습니다.
데이터베이스 나 XML 파일에 연결할 수 있습니다. NUnit의 기능만큼 간단하지는 않지만 작업을 수행합니다.
답변
MSTest에는 DataSource 라는 강력한 특성이 있습니다. 이를 사용하여 요청한대로 데이터 기반 테스트를 수행 할 수 있습니다. 테스트 데이터를 XML, CSV 또는 데이터베이스로 보유 할 수 있습니다. 다음은 귀하를 안내 할 몇 가지 링크입니다.
답변
구현하는 것은 매우 간단합니다 . TestContext
property 및를 사용해야 합니다 TestPropertyAttribute
.
예
public TestContext TestContext { get; set; }
private List<string> GetProperties()
{
return TestContext.Properties
.Cast<KeyValuePair<string, object>>()
.Where(_ => _.Key.StartsWith("par"))
.Select(_ => _.Value as string)
.ToList();
}
//usage
[TestMethod]
[TestProperty("par1", "http://getbootstrap.com/components/")]
[TestProperty("par2", "http://www.wsj.com/europe")]
public void SomeTest()
{
var pars = GetProperties();
//...
}
편집하다:
TestContext
속성에 대한 액세스를 단순화 하고 몇 가지 테스트 사례가있는 것처럼 행동 하기 위해 몇 가지 확장 방법을 준비했습니다 . 간단한 테스트 속성을 처리하는 예제는 다음과 같습니다.
[TestMethod]
[TestProperty("fileName1", @".\test_file1")]
[TestProperty("fileName2", @".\test_file2")]
[TestProperty("fileName3", @".\test_file3")]
public void TestMethod3()
{
TestContext.GetMany<string>("fileName").ForEach(fileName =>
{
//Arrange
var f = new FileInfo(fileName);
//Act
var isExists = f.Exists;
//Asssert
Assert.IsFalse(isExists);
});
}
복잡한 테스트 객체를 만드는 예제 :
[TestMethod]
//Case 1
[TestProperty(nameof(FileDescriptor.FileVersionId), "673C9C2D-A29E-4ACC-90D4-67C52FBA84E4")]
//...
public void TestMethod2()
{
//Arrange
TestContext.For<FileDescriptor>().Fill(fi => fi.FileVersionId).Fill(fi => fi.Extension).Fill(fi => fi.Name).Fill(fi => fi.CreatedOn, new CultureInfo("en-US", false)).Fill(fi => fi.AccessPolicy)
.ForEach(fileInfo =>
{
//Act
var fileInfoString = fileInfo.ToString();
//Assert
Assert.AreEqual($"Id: {fileInfo.FileVersionId}; Ext: {fileInfo.Extension}; Name: {fileInfo.Name}; Created: {fileInfo.CreatedOn}; AccessPolicy: {fileInfo.AccessPolicy};", fileInfoString);
});
}
답변
물론이 스레드에서 다루지 않은 다른 방법, 즉 TestMethod를 포함하는 클래스의 상속 방법이 있습니다. 다음 예에서는 하나의 TestMethod 만 정의되었지만 두 가지 테스트 사례가 작성되었습니다.
Visual Studio 2012에서는 TestExplorer에서 두 가지 테스트를 만듭니다.
- DemoTest_B10_A5.test
-
DemoTest_A12_B4.test
public class Demo { int a, b; public Demo(int _a, int _b) { this.a = _a; this.b = _b; } public int Sum() { return this.a + this.b; } } public abstract class DemoTestBase { Demo objUnderTest; int expectedSum; public DemoTestBase(int _a, int _b, int _expectedSum) { objUnderTest = new Demo(_a, _b); this.expectedSum = _expectedSum; } [TestMethod] public void test() { Assert.AreEqual(this.expectedSum, this.objUnderTest.Sum()); } } [TestClass] public class DemoTest_A12_B4 : DemoTestBase { public DemoTest_A12_B4() : base(12, 4, 16) { } } public abstract class DemoTest_B10_Base : DemoTestBase { public DemoTest_B10_Base(int _a) : base(_a, 10, _a + 10) { } } [TestClass] public class DemoTest_B10_A5 : DemoTest_B10_Base { public DemoTest_B10_A5() : base(5) { } }