2009-05-16 38 views
6

Một số thử nghiệm đơn vị mstest của tôi giúp phát hiện các điều kiện đa luồng, và vì vậy chúng hữu ích nhất khi chạy nhiều lần liên tiếp, nhưng tôi chỉ muốn thực hiện điều này cho các lần kiểm tra cụ thể - - không phải lúc nào.Lặp lại thử nghiệm chạy thử nhiều lần

Có cách nào để định cấu hình mstest (trong Trình chỉnh sửa danh sách kiểm tra tốt nhất) để chạy thử nghiệm nhiều lần không?

Trả lời

10

Tôi cần phải làm điều gì đó tương tự, vì vậy tôi đã đưa ra giải pháp cho điều này.

Nó không đơn giản, nhưng sau khi mọi thứ được thiết lập, bạn có thể tái sử dụng nó trên các dự án. Tôi cũng có một tải về mã này trên GitHub (https://github.com/johnkoerner/MSTestLooper), nhưng trong trường hợp đó biến mất tại một số điểm, đây là cách tôi đã làm nó.

Trước tiên, chúng tôi tạo thuộc tính mà chúng tôi sẽ áp dụng cho lớp học của chúng tôi để cho nó chạy tất cả các bài kiểm tra nhiều lần. Làm tất cả điều này trong một hội đồng riêng biệt, vì DLL cần phải sống ở một vị trí đặc biệt.

[Serializable] 
public class TestLooperAttribute : TestClassExtensionAttribute 
{ 
    private static readonly Uri thisGuy = new Uri("urn:TestLooperAttribute"); 

    private string _PropertyName; 
    public string PropertyName 
    { 
     get 
     { return _PropertyName; } 
     set 
     { 
      _PropertyName = value; 
     } 
    } 
    public override Uri ExtensionId 
    { 

     get { 
      return thisGuy; } 
    } 


     public override TestExtensionExecution GetExecution() 
    { 

     return new TestLooperExecution(PropertyName); 
    } 
} 

Tiếp theo chúng ta phải tạo một bài kiểm tra tùy chỉnh lớp thi lớp:

class TestLooperExecution : TestExtensionExecution 
{ 
    private string PropertyName; 

    public TestLooperExecution(string PropertyName) 
    { 
     this.PropertyName = PropertyName; 
    } 

    public override ITestMethodInvoker CreateTestMethodInvoker(TestMethodInvokerContext InvokerContext) 
    { 
     return new TestLooperInvoker(InvokerContext, PropertyName); 
    } 

    public override void Dispose() 
    { 
     //TODO: Free, release or reset native resources 
    } 

    public override void Initialize(TestExecution Execution) 
    { 
     //TODO: Wire up event handlers for test events if needed 

    } 
} 

Cuối cùng chúng ta thêm một Invoker tùy chỉnh, đó là nơi mà chúng tôi thực hiện các vòng lặp:

class TestLooperInvoker : ITestMethodInvoker 
{ 
    private TestMethodInvokerContext m_invokerContext; 
    private string PropertyName; 

    public TestLooperInvoker(TestMethodInvokerContext InvokerContext, string PropertyName) 
    { 
     m_invokerContext = InvokerContext; 
     this.PropertyName = PropertyName; 
    } 

    public TestMethodInvokerResult Invoke(params object[] args) 
    { 

     // Our helper results class to aggregate our test results 
     HelperTestResults results = new HelperTestResults(); 

     IEnumerable<object> objects = m_invokerContext.TestContext.Properties[PropertyName] as IEnumerable<object>; 

     foreach (var d in objects) 
      results.AddTestResult(m_invokerContext.InnerInvoker.Invoke(d), new object[1] { d.GetType().ToString()}); 

     var output = results.GetAllResults(); 
     m_invokerContext.TestContext.WriteLine(output.ExtensionResult.ToString()); 

     return output; 
    } 
} 

Các HelperTestResults lớp chỉ xây dựng chuỗi cho đầu ra, bạn có thể xử lý này như thế nào bạn muốn và tôi không muốn bao gồm mã đó bởi vì nó sẽ chỉ làm cho bài đăng này lâu hơn nữa.

Biên dịch này thành một DLL và sau đó bạn cần phải sao chép nó vào

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\PublicAssemblies 

Bạn cũng phải tạo một mục đăng ký cho lớp:

Windows Registry Editor Version 5.00 
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\EnterpriseTools\QualityTools\TestTypes\{13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b}\TestTypeExtensions\TestLooperAttribute] 
"AttributeProvider"="TestLooper.TestLooperAttribute, TestLooper" 

Bây giờ bạn có tất cả điều đó xong, cuối cùng bạn có thể sử dụng lớp học:

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using TestLooper; 
using System.Collections.Generic; 
namespace UnitTestSamples 
{ 
    [TestLooper(PropertyName="strings")] 
    public class UnitTest1 
    { 
     public static List<String> strings = new List<String>(); 
     private TestContext testContextInstance; 

     public TestContext TestContext 
     { 
      get 
      { 
       return testContextInstance; 
      } 
      set 
      { 
       testContextInstance = value; 
      } 
     } 
     [ClassInitialize()] 
     public static void Init(TestContext x) 
     { 
      strings.Add("A"); 
      strings.Add("B"); 
      strings.Add("C"); 
      strings.Add("D"); 

     } 

     [TestInitialize()] 
     public void TestInit() 
     { 
      if (!TestContext.Properties.Contains("strings")) 
      testContextInstance.Properties.Add("strings", strings); 
     } 

     [TestMethod] 
     [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "DataDriven1.csv", "DataDriven1#csv", DataAccessMethod.Sequential)] 
     [DeploymentItem("DataDriven1.csv")] 
     public void TestMethodStrings(string s) 

     { 
      int value1 = Convert.ToInt32(TestContext.DataRow["Col1"]); ; 
      TestContext.WriteLine(String.Format("{0}:{1}", s, value1)); 
     } 
    } 
} 

Lưu ý rằng phương pháp thử nghiệm của chúng tôi chấp nhận tham số, rom các looper thử nghiệm. Tôi cũng cho thấy điều này bằng cách sử dụng một thử nghiệm dữ liệu điều khiển, để cho thấy bạn có thể kết hợp hai với nhau để tạo ra hoán vị lớn trên các tập dữ liệu của bạn.

+0

Tôi thậm chí không biết MSTest có khả năng mở rộng như vậy. Điều này thật tuyệt vời, cảm ơn! –

2

Cân nhắc tạo thử nghiệm để tắt một vài chuỗi. Danh sách kiểm tra sẽ không cho phép bạn có nhiều mục nhập cho cùng một thử nghiệm. Tuy nhiên, bạn có thể chỉ định thử nghiệm đa luồng cho danh sách riêng của nó và chỉ gọi nó khi bạn muốn chạy thử nghiệm cụ thể đó.

+0

Đó là một cách tiếp cận thú vị. Cảm ơn. –

2

Tôi đoán câu trả lời là không.

3
[TestMethod()] 
public void RepetableTest(){ 
    for(int i = 0; i < repeatNumber; i++){ 

    //test code goes here 


    } 
} 
+1

Xem http://stackoverflow.com/questions/25565574/run-unittest-several-time-not-just-loop-it? cho lý do tại sao điều này không luôn luôn đạt được kết quả yêu cầu. – Ricibob

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