MSTest에는 NUnit의 TestCase와 동일한 기능이 있습니까?


107

TestCaseNUnit 의 기능은 각 테스트에 대해 별도의 방법이 필요없이 테스트 매개 변수를 지정하는 빠른 방법으로 매우 유용합니다. 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);  
     }  
 }  


NUnit을 사용하지 않는 이유는 무엇입니까?
Mike de Klerk

1
@MikedeKlerk : Entity Framework를 사용하는 경우 Nunit은 엄청나게 느립니다. 테스트를 실행할 때마다 생성 된 모든 클래스를 반영합니다.
Robert Harvey

일반적으로, NUnit과는 MSTEST보다 더 많은 기능을 가지고 당신이 MSTEST를 사용하는 경우, 바로 다음 NuGet을 통해 NUnit과 테스트 어댑터 확장을 설치하여 NUnit과와 동일한 기능을 수행 할 수 있으며, VS 테스트 Explorer를 사용하여 테스트를 실행할 수 있도록
스택

답변:


62

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.TestFrameworkMSTest.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에서는 작동하지 않습니다.


4
MSTest "v2"는 이제 VS 2017을 사용할 때의 기본 프레임 워크입니다. 이제 최신 버전에서 OOTB가 지원되므로 해당 정보는 아마도 정답의 맨 위로 올라갈 것입니다.
Marc L.

34

나는 이것이 늦은 대답이라는 것을 알고 있지만 다른 사람들을 도울 수 있기를 바랍니다.

나는 모든 곳에서 우아한 해결책을 찾았고 결국 직접 작성했습니다. 수천 번의 단위 테스트와 수십만 번의 반복이있는 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);
        }
    }
}

이것은 또한 각 경우에 여러 매개 변수와 함께 작동합니까?
Lonefish

기본 라이브러리가 변경 되었기 때문에 MsTest "v2" 에서는 작동하지 않습니다 . 이것은 VS15 (VS 2017)의 기본값입니다.
Marc L.

3
예, MSTest V2를 사용하는 경우 NUnit과 유사한 새로운 테스트 케이스 공급자가 있습니다. 따라서이 작업이 필요하지 않습니다 👏
Thwaitesy

이것은 VS 2015에서 작동하지 않는 것 같습니다. 앱 구성 파일이 동적으로 채워지지 않아 데이터 소스를 찾을 수 없습니다
Reed

13

나는 이것이 또 다른 늦은 대답이라는 것을 알고 있지만 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 에서이 솔루션에 대한 자세한 배경 정보와 세부 정보를 블로그에 올렸 습니다 .


4
이것의 가장 큰 문제는 값 배열에서 어떤 케이스가 실패하면 전체 테스트가 실패하고 더 이상 케이스가 테스트되지 않는다는 것입니다.
ytoledano 2014

이것은 서로 영향을 미칠 수있는 테스트 케이스를 생성합니다.
BartoszKP

@BartoszKP 테스트중인 시스템에 부작용이있는 경우에만이 경우 최적의 기술이 아닐 수 있습니다.
Gary.Ray

@ Gary.Ray 또한 시스템에 아직 부작용이 없을 때 . 또한 테스트가 통과되지 않고 다른 개발자가이를 고치려고 할 때 종속성이 중요한지 여부를 파악하는 데 시간을 낭비합니다. 이것은 당신이 절대하지 말아야 할 일입니다.
BartoszKP

충분하다. +1
Trey Mack

7

Khlr는 자세한 설명을 제공했으며이 접근 방식은 데스크톱 용 VS2015 Express에서 작동하기 시작했습니다. 댓글을 남기려고했지만 평판이 부족해서 그렇게 할 수 없었습니다.

여기에 솔루션을 복사하겠습니다.

[TestClass]  
 public class StringFormatUtilsTest  
 {  
     [TestMethod]  
     [DataRow("tttt", "")]  
     [DataRow("", "")]  
     [DataRow("t3a4b5", "345")]  
     [DataRow("3&amp;amp;5*", "35")]  
     [DataRow("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 } 

이를 사용하려면 NuGet 패키지 MSTest.TestFrameworkMSTest.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 를 제거 하십시오 .

원래 답장을 수정하고이 답장을 삭제할 수 있습니다.


0

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 파일 입력을 기반으로하는 자습서가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.