2008-12-07 27 views
41

Tôi biết rằng MSTest không hỗ trợ RowTest và các thử nghiệm tương tự.Làm thế nào để RowTest với MSTest?

Số người dùng MSTests làm gì? Làm cách nào để có thể sống mà không cần hỗ trợ RowTest?

Tôi đã xem DataDriven tính năng thử nghiệm nhưng có vẻ như quá nhiều chi phí, có bản vá hoặc công cụ bên thứ ba nào cho phép tôi thực hiện các thử nghiệm tương tự trong MSTest không?

+1

Đáng buồn thay, DaTest dường như chỉ hoạt động với VS2008. –

+1

http://code.google.com/p/datest/wiki/DaTest –

+0

Bản sao có thể có của [Cách chạy phương pháp thử nghiệm với nhiều thông số trong MSTest?] (Http://stackoverflow.com/questions/9021881/how -to-run-a-test-method-với-nhiều-tham số-trong-mstest) – Rob

Trả lời

35
[TestMethod] 
Test1Row1 
{ 
    Test1(1,4,5); 
} 

[TestMethod] 
Test1Row2 
{ 
    Test1(1,7,8); 
} 

private Test1(int i, int j, int k) 
{ 
    //all code and assertions in here 
} 
+2

Đây là phương pháp tôi đã sử dụng, và nó cũng cho phép bạn cung cấp cho mỗi "hàng" một tên riêng biệt và hy vọng. – Mel

4

Chúng tôi đã thêm hỗ trợ cho DataRow trong VS2012 Update1. See this blog for a breif introduction

Chỉnh sửa: Bạn muốn làm nổi bật rằng tính năng này hiện bị giới hạn trong các ứng dụng cửa hàng Windows.

+7

tại sao ứng dụng này bị giới hạn trong các ứng dụng Windows? Nó sẽ có sẵn cho các dự án thử nghiệm thường xuyên bất cứ lúc nào sớm? – DevDave

+1

xUnit đã có quá lâu. Đây là một kịch bản phổ biến, tại sao điều này chỉ được kích hoạt cho Windows Store Apps? Không có nghĩa lý gì. – CodeMonkeyKing

+0

@DevDave trong khi tôi không biết kế hoạch vnext có một bộ điều hợp có sẵn cho các dự án mstest kế thừa cung cấp chức năng tương tự. Xem blog này để biết chi tiết: http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/extending-the-visual-studio-unit-test-type-part-2.aspx – allen

0

Tôi đã giải quyết vấn đề này bằng cách tạo mã lớp thử nghiệm với số phương pháp thử được tạo khác nhau. Bạn chỉ cần tải xuống 2 tệp và đưa chúng vào dự án của bạn.
Sau đó phân lớp một lớp học với số lượng yêu cầu của các hàng trong mã kiểm tra của bạn và thực hiện 2 phương pháp trừu tượng:

[TestClass] 
public class Ha_ha_ha_Test: MsTestRows.Rows.TestRows_42<string> 
{ 
    public override void TestMethod(string dataRow, int rowNumber) 
    { 
     Console.WriteLine(dataRow); 
     Assert.IsFalse(dataRow.Contains("3")); 
    } 

    public override string GetNextDataRow(int rowNumber) 
    { 
     return "data" + rowNumber; 
    } 
} 

Thông tin chi tiết:

https://github.com/dzhariy/mstest-rows

7

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

Tôi đã xem ở khắp mọi nơi để có giải pháp thanh lịch và tự mình viết một bản. Chúng tôi sử dụng nó trong hơn 20 dự án với hàng ngàn bài kiểm tra đơn vị và hàng trăm nghìn lần lặp. Không bao giờ bỏ lỡ một 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 một tài sản, Field hoặc Method, trả về IEnumerable

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 MSTest Thuộc tính DataSource cho phương thức thử nghiệm của bạn, trỏ trở lại tên IEnumerable ở trên. Điều này cần phải được hoàn toàn đủ điều kiện.

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

    Assert.IsNotNull(number); 
} 

End Result: 3 lần lặp giống như DataSource bình thường :)

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using MSTestHacks; 

namespace Namespace 
{ 
    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 }; 
      } 
     } 

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

      Assert.IsNotNull(number); 
     } 
    } 
} 
+0

Cảm ơn rất nhiều, @Thwaitesy! Bạn đã tiết kiệm cho tôi rất nhiều thời gian. – tsul

1

On đội của tôi mà bị khóa vào sử dụng khuôn khổ MS thử nghiệm, chúng tôi đã phát triển một kỹ thuật mà chỉ dựa vào Anonymous Các loại để 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 đòi hỏi thêm các lớp hoặc khung công tác bổ sung nào, 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 dựa trên dữ liệu bằng cách sử dụng các tệp bên ngoài hoặc một cơ sở dữ liệu được kết nối.

Ví dụ, nói rằng bạn có một phương pháp 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à hàng loạt các loại Anonymous kết hợp để LINQ để viết một bài kiểm tra như thế này:

[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 rất hữu ích khi sử dụng một tin nhắn đượ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 làm cho thử nghiệm thất bại.

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

Các vấn đề liên quan