[C#] MSTest에서 여러 매개 변수로 테스트 방법을 어떻게 실행할 수 있습니까?

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 일 피드백에 감사드립니다. 우리는이 일을 시작했습니다.

프라 탑 락쉬 만 비주얼 스튜디오

https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/3865310-allow-use-of-datatestmethod-datarow-in-all-unit


답변

이 기능은 시험판에 있습니다 현재 이며 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 또는 데이터베이스로 보유 할 수 있습니다. 다음은 귀하를 안내 할 몇 가지 링크입니다.


답변

구현하는 것은 매우 간단합니다 . TestContextproperty 및를 사용해야 합니다 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에서 두 가지 테스트를 만듭니다.

  1. DemoTest_B10_A5.test
  2. 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) { }
    }