developer tip

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

copycodes 2020. 8. 22. 09:07
반응형

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


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);  
     }  
 }  

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


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

나는 모든 곳에서 우아한 해결책을 찾았고 결국 직접 작성했습니다. 수천 번의 단위 테스트와 수십만 번의 반복이있는 20 개가 넘는 프로젝트에서 사용합니다. 한 번도 비트를 놓친 적이 없습니다.

https://github.com/Thwaitesy/MSTestHacks

1) NuGet 패키지를 설치합니다 .

2) Inherit your test class from TestBase

public class UnitTest1 : TestBase
{ }

3) Create a Property, Field or Method, that returns 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) Add the MSTest DataSource attribute to your test method, pointing back to the IEnumerable name above. This needs to be fully qualified.

[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
    var number = this.TestContext.GetRuntimeDataSourceObject<int>();

    Assert.IsNotNull(number);
}

End Result: 3 iterations just like the normal DataSource :)

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);
        }
    }
}

I know this is another late answer, but on my team that is locked into using the MS Test framework, we developed a technique that relies only on Anonymous Types to hold an array of test data, and LINQ to loop through and test each row. It requires no additional classes or frameworks, and tends to be fairly easy to read and understand. It's also much easier to implement than the data-driven tests using external files or a connected database.

For example, say you have an extension method like this:

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);
    }
}

You could use and array of Anonymous Types combined to LINQ to write a tests like this:

[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); 
        }); 
    }
}

When using this technique it's helpful to use a formatted message that includes the input data in the Assert to help you identify which row causes the test to fail.

I've blogged about this solution with more background and detail at AgileCoder.net.


Khlr gave a good detailed explanations and apparently this approach started working in VS2015 Express for Desktop. I tried to leave the comment, but my lack of reputation didn't allow me to do so.

Let me copy the solution here:

[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);  
     }  
 } 

To use it, just install the NuGet packages MSTest.TestFramework and MSTest.TestAdapter.

One problem is

Error CS0433 The type 'TestClassAttribute' exists in both 'Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0 and 'Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0

So, please remove Microsoft.VisualStudio.QualityTools.UnitTestFramework from references of the project.

You're very welcome to edit the original reply and delete this one.


MSTest has the DataSource attribute, which will allow you to feed it a database table, csv, xml, etc. I've used it and it works well. I don't know of a way to put the data right above as attributes as in your question, but it's very easy to set up the external data sources and files can be included in the project. I had it running an hour from when I started, and I'm not an automated test expert.

https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396 has a full tutorial based on database input.

http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/ has a tutorial based on XML file input.

참고URL : https://stackoverflow.com/questions/1010685/does-mstest-have-an-equivalent-to-nunits-testcase

반응형