MSTest có tương đương với TestCase của NUnit không?


107

Tôi thấy TestCasetính năng trong NUnit khá hữu ích như một cách nhanh chóng để chỉ định các thông số kiểm tra mà không cần một phương pháp riêng biệt cho mỗi bài kiểm tra. Có điều gì tương tự trong MSTest không?

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


Tại sao bạn không sử dụng NUnit?
Mike de Klerk

1
@MikedeKlerk: Nunit cực kỳ chậm nếu bạn đang sử dụng Entity Framework ... Nó dường như phản ánh tất cả các lớp đã tạo của bạn mỗi khi bạn chạy thử nghiệm.
Robert Harvey

Nói chung, NUnit có nhiều tính năng hơn MSTest, nếu bạn đang sử dụng MSTest chỉ để có thể chạy các bài kiểm tra của mình với VS Test Explorer, thì bạn có thể làm điều tương tự với NUnit bằng cách cài đặt phần mở rộng NUnit Test Adapter thông qua NuGet
Stacked

1
Hãy thử DataRow(), hãy xem: blog.msdn.microsoft.com/devops/2016/06/17/…
Babak

Câu trả lời:


62

Microsoft gần đây đã công bố "MSTest V2" (xem bài viết trên blog ). Điều này cho phép bạn nhất quán (máy tính để bàn, UWP, ...) sử dụng-thuộc DataRowtính!

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

Một lần nữa, Visual Studio Express 'Test Explorer rất tiếc không nhận ra các thử nghiệm này. Nhưng ít nhất các phiên bản VS "đầy đủ" hiện đã hỗ trợ tính năng đó!

Để sử dụng nó, chỉ cần cài đặt các gói NuGet MSTest.TestFrameworkMSTest.TestAdapter (cả hai đều đã phát hành trước).

Câu trả lời cũ hơn:

Nếu không phải gắn bó với MSTest và bạn chỉ sử dụng nó để có thể chạy các bài kiểm tra thông qua Test Explorer vì bạn chỉ có phiên bản Visual Studio Express, thì đây có thể là một giải pháp cho bạn:

phần mở rộng VsTestAdapter VSIX để có thể chạy các bài kiểm tra NUnit thông qua Test Explorer. Rất tiếc, người dùng VS Express không thể cài đặt tiện ích mở rộng ... Nhưng may mắn thay, VsTestAdapter đi kèm với NuGet-Package đơn giản !

Vì vậy, nếu bạn là người dùng VS Express, chỉ cần cài đặt VsTestAdapter NuGet-Package và tận hưởng chạy các bài kiểm tra / testcase NUnit của bạn thông qua Test Explorer!


Thật không may, tuyên bố nói trên không đúng. Mặc dù hoàn toàn có thể cài đặt gói này qua phiên bản Express, nhưng nó vô dụng vì nó không thể sử dụng Trình khám phá thử nghiệm. Trước đây, có một ghi chú bên lề trên phiên bản TestAdapter cũ hơn , đã bị xóa khỏi trang mô tả của 2.0.0 :

Lưu ý rằng nó không hoạt động với VS Express


4
MSTest "v2" hiện là khuôn khổ mặc định khi sử dụng VS 2017. Giờ đây, điều này sẽ được hỗ trợ OOTB trên phiên bản mới nhất, thông tin đó có lẽ sẽ nằm ở đầu câu trả lời.
Marc L.

34

Tôi biết đây là một câu trả lời muộn nhưng hy vọng nó sẽ giúp những người khác.

Tôi đã tìm kiếm khắp nơi để tìm một giải pháp thanh lịch và cuối cùng đã tự viết ra một giải pháp. Chúng tôi sử dụng nó trong hơn 20 dự án với hàng nghìn bài kiểm tra đơn vị và hàng trăm nghìn lần lặp. Chưa một lần lỡ nhịp.

https://github.com/Thwaitesy/MSTestHacks

1) Cài đặt gói NuGet .

2) Kế thừa lớp thử nghiệm của bạn từ TestBase

public class UnitTest1 : TestBase
{ }

3) Tạo Thuộc tính, Trường hoặc Phương thức, trả về 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) Thêm thuộc tính MSTest DataSource vào phương pháp thử nghiệm của bạn, trỏ lại tên IEnumerable ở trên. Điều này cần phải được đáp ứng đầy đủ.

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

    Assert.IsNotNull(number);
}

Kết quả cuối cùng: 3 lần lặp lại giống như DataSource thông thường :)

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ều này cũng sẽ hoạt động với nhiều tham số cho mỗi trường hợp?
Lonefish

Vì đã có sự thay đổi trong thư viện cơ bản, điều này không hoạt động với MsTest "v2" . Đây là mặc định cho VS15 (VS 2017).
Marc L.

3
Có, nếu bạn đang sử dụng MSTest V2, có một nhà cung cấp trường hợp thử nghiệm mới tương tự như của NUnit. Vì vậy, không cần công việc này xung quanh 👏
Thwaitesy

Điều này dường như không hoạt động trong VS 2015, tệp cấu hình ứng dụng không tự động điền và do đó nguồn dữ liệu không được tìm thấy
Reed vào

13

Tôi biết đây là một câu trả lời muộn khác, nhưng trong nhóm của tôi, những người bị khóa trong việc sử dụng khung MS Test, chúng tôi đã phát triển một kỹ thuật chỉ dựa vào Loại ẩn danh để lưu giữ một mảng dữ liệu thử nghiệm và LINQ để lặp lại và kiểm tra từng hàng. Nó không yêu cầu các lớp hoặc khuôn khổ bổ sung và có xu hướng khá dễ đọc và dễ hiểu. Nó cũng dễ thực hiện hơn nhiều so với các bài kiểm tra theo hướng dữ liệu bằng cách sử dụng các tệp bên ngoài hoặc cơ sở dữ liệu được kết nối.

Ví dụ: giả sử bạn có một phương thức mở rộng như thế này:

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

Bạn có thể sử dụng và kết hợp mảng các Loại Ẩn danh với LINQ để viết các bài kiểm tra như sau:

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

Khi sử dụng kỹ thuật này, sẽ hữu ích khi sử dụng một thông báo được định dạng bao gồm dữ liệu đầu vào trong Assert để giúp bạn xác định hàng nào khiến thử nghiệm không thành công.

Tôi đã viết blog về giải pháp này với nhiều thông tin cơ bản và chi tiết hơn tại AgileCoder.net .


4
Vấn đề lớn nhất với điều này là nếu có bất kỳ trường hợp nào không ra khỏi mảng giá trị - thì toàn bộ thử nghiệm không thành công và không có trường hợp nào được kiểm tra nữa.
ytoledano

Điều này tạo ra các trường hợp thử nghiệm có thể ảnh hưởng lẫn nhau.
BartoszKP

@BartoszKP Chỉ khi hệ thống đang thử nghiệm có tác dụng phụ, trong trường hợp đó, đây có thể không phải là kỹ thuật tối ưu.
Gary.Ray

@ Gary.Ray Ngoài ra khi hệ thống không có tác dụng phụ chưa . Ngoài ra, khi một bài kiểm tra không vượt qua và một nhà phát triển khác cố gắng khắc phục điều đó và lãng phí hàng giờ để tìm hiểu xem liệu sự phụ thuộc có quan trọng hay không. Đây chỉ là điều bạn không nên làm, kỳ.
BartoszKP

Đủ tốt. +1
Trey Mack,

7

Khlr đã giải thích chi tiết và rõ ràng cách tiếp cận này đã bắt đầu hoạt động trong VS2015 Express cho Máy tính để bàn. Tôi đã cố gắng để lại bình luận, nhưng sự thiếu uy tín của tôi không cho phép tôi làm như vậy.

Hãy để tôi sao chép giải pháp ở đây:

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

Để sử dụng nó, chỉ cần cài đặt các gói NuGet MSTest.TestFrameworkMSTest.TestAdapter .

Một vấn đề là

Lỗi CS0433 Loại 'TestClassAttribute' tồn tại trong cả 'Microsoft.VisualStudio.QualityTools.UnitTestFramework, Phiên bản = 10.0.0.0 và' Microsoft.VisualStudio.TestPlatform.TestFramework, Phiên bản = 14.0.0.0

Vì vậy, hãy gỡ bỏ Microsoft.VisualStudio.QualityTools.UnitTestFramework khỏi các tham chiếu của dự án.

Rất hoan nghênh bạn chỉnh sửa câu trả lời gốc và xóa câu trả lời này.


0

MSTest có thuộc tính DataSource, cho phép bạn cung cấp cho nó một bảng cơ sở dữ liệu, csv, xml, v.v. Tôi đã sử dụng nó và nó hoạt động tốt. Tôi không biết có cách nào để đặt dữ liệu ngay trên dưới dạng thuộc tính như trong câu hỏi của bạn, nhưng rất dễ dàng để thiết lập các nguồn dữ liệu bên ngoài và các tệp có thể được đưa vào dự án. Tôi đã chạy nó một giờ kể từ khi tôi bắt đầu và tôi không phải là chuyên gia kiểm tra tự động.

https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396 có hướng dẫn đầy đủ dựa trên đầu vào cơ sở dữ liệu.

http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/ có một hướng dẫn dựa trên đầu vào tệp XML.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.