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


140

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()
{
    // ...
}

stackoverflow.com/a/19536942/52277 답변에 설명 된대로 MSTestHacks를 사용할 수 있습니다 .
마이클 Freidgeim


@MichaelFreidgeim이 질문은 귀하의 제안 된 목표보다 나은 답변을 가지고 있습니다
Rob

1
@Rob : IMHO, 가장 적합한 답변 -MSTestHacks- MSTest로 RowTest하는 방법? 이 질문에 빠졌습니다.
Michael Freidgeim

@MichaelFreidgeim 아마도이 기능은 현재 3 년 반 동안 존재 한 것으로 보입니다 ( stackoverflow.com/questions/9021881/… )
Rob

답변:


46

불행히도 이전 버전의 MSTest에서는 지원되지 않습니다. 분명히 확장 성 모델이 있으며 직접 구현할 수 있습니다 . 또 다른 옵션은 데이터 기반 테스트 를 사용 하는 것 입니다.

내 개인적인 의견은 NUnit을 고수하는 것입니다 ...

Visual Studio 2012, 업데이트 1부터 MSTest의 기능이 비슷합니다. McAden의 답변을 참조하십시오 .


우리는 NUnit 코드를 생성하는 Selenium을 사용하고 있으므로 대신 NUnit을 사용하도록 전환했습니다 :)
The Light

4
Visual Studio 2012 Update 1에서도 비슷한 것이 가능하다는 것을 알았습니다.이 답변을 보는 사람을 나중에 고려할 때 참고하십시오.
McAden

@McAden 당신은 설명과 링크가 있습니까?
jeroenh

6
아래에 예와 내 블로그 게시물 링크가 있습니다. 필요한 속성과 테스트 탐색기에서 케이스를 구별하는 속성의 "DisplayName"특성도 언급합니다. 또한 CTP (현재 공식 릴리스가 있음)의 blogs.msdn.com/b/visualstudioalm/archive/2012/10/26/ 의 10 월 발표에서 언급되었습니다 … 나는이 SO 질문에 정보를 추가했습니다. 그것을 찾는 데 꽤 많은 시간을 보냈습니다. 잘하면 이것은 누군가를 구할 수 있기를 바랍니다.
McAden

167

편집 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


4
Windows Phone도 Visual Studio 2012 업데이트 2 (현재 CTP 4)와 함께 지원됩니다.
Pedro Lamas

8
업데이트 1이 있지만 DataTestMethod 및 DataRow가 인식되지 않습니다. 이러한 속성은 어떤 라이브러리에 있습니까?
DevDave

3
DataTestMethod에 대한 공식 소스가 있습니까? 어떤 네임 스페이스가 어떤 어셈블리에 있습니까?
Igor Lankin

2
UnitTestFramework.dll이 내 컴퓨터에 설치되어 있고이를 수동으로 참조한 후 데이터 행과 함께 [DataTestMethod] 특성을 사용하여 메서드를 작성할 수 있었지만 Visual Studio 2012.3에서 테스트 탐색기를 사용하여 메서드를 찾을 수 없습니다.
Josh DeLong

5
컴퓨터의 파일 경로 "C : \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0 \ ExtensionSDKs \ MSTestFramework \ 11.0 \ References \ CommonConfiguration \ neutral \ Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll"로 이동했습니다. 파일이있었습니다. 그래서 나는 기본 단위 테스트 프로젝트에서 그것을 참조했습니다. JustDecompile에서 dll을 열면 라이브러리에 mscorlib, System 및 System.Core에 대한 참조 만 있음이 표시됩니다. Windows 스토어 프로젝트가 아닙니다.
Josh DeLong

34

이 기능은 시험판에 있습니다 현재 이며 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);
    }
}

이것이 정답입니다. [DataRow]를 사용하기 위해 [DataTestMethod]라고 말하지 않아도됩니다 ( stackoverflow.com/a/59162403/2540235 )
mattavatar

11

NUnit의 Value(또는 TestCase) 속성 과 정확히 동일 하지는 않지만 MSTest에는 DataSource속성이 있으므로 유사한 작업을 수행 할 수 있습니다.

데이터베이스 나 XML 파일에 연결할 수 있습니다. NUnit의 기능만큼 간단하지는 않지만 작업을 수행합니다.


7

MSTest에는 DataSource 라는 강력한 특성이 있습니다. 이를 사용하여 요청한대로 데이터 기반 테스트를 수행 할 수 있습니다. 테스트 데이터를 XML, CSV 또는 데이터베이스로 보유 할 수 있습니다. 다음은 귀하를 안내 할 몇 가지 링크입니다.


6

구현하는 것은 매우 간단합니다 . 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);
        });
}

자세한 내용 은 확장 방법샘플 세트를 살펴보십시오 .


2
이 방법은 효과가 있지만 각 매개 변수 세트에 대해 개별 테스트 사례를 작성하지는 않습니다.
usr4896260

TestProperty 값 (예 : "0-100")과 같이 더 복잡한 것을 사용하여 테스트 본문에서 구문 분석하고 처리 할 수 ​​있습니다.
Andrey Burykin

4

물론이 스레드에서 다루지 않은 다른 방법, 즉 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) { }
    }


3

DataRowAttributeVisual Studio 2015에서 The 를 작동 시킬 수 없었 습니다.

[TestClass]
public class Tests
{
    private Foo _toTest;

    [TestInitialize]
    public void Setup()
    {
        this._toTest = new Foo();
    }

    [TestMethod]
    public void ATest()
    {
        this.Perform_ATest(1, 1, 2);
        this.Setup();

        this.Perform_ATest(100, 200, 300);
        this.Setup();

        this.Perform_ATest(817001, 212, 817213);
        this.Setup();
    }

    private void Perform_ATest(int a, int b, int expected)
    {
        // Obviously this would be way more complex...

        Assert.IsTrue(this._toTest.Add(a,b) == expected);
    }
}

public class Foo
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

실제 솔루션은 NUnit을 사용하는 것입니다 (이 특정 인스턴스와 같이 MSTest에 갇혀 있지 않은 한).


3
테스트 중 하나가 중단되는 시간을 절약하려면 각 테스트 호출을 별도의 테스트로 분할해야합니다. (우리 모두가 일어날 것입니다)

물론입니다. 실제로 그것은 그렇게 될 것입니다. 이 경우에 간단하게 설명하기 만했습니다
Brandon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.