2012-02-09 31 views
12

Tôi đã viết các trường hợp kiểm tra xUnit trong C#. Lớp kiểm tra đó chứa rất nhiều phương thức. Tôi cần phải chạy toàn bộ các trường hợp thử nghiệm trong một chuỗi. Làm thế nào tôi có thể thiết lập trình tự trường hợp thử nghiệm trong xUnit?Cách đặt chuỗi trường hợp thử nghiệm trong xUnit

+5

Tại sao bạn quan tâm đến thứ tự các thử nghiệm được thực thi? Nó thường là một ý tưởng tồi cho các xét nghiệm phụ thuộc vào nhau theo bất kỳ cách nào - chúng phải độc lập với nhau. –

+7

Trong khi đó thực sự là đúng cho các bài kiểm tra đơn vị đó không phải là trường hợp cho các bài kiểm tra tích hợp. –

Trả lời

0

Bạn không thể, theo thiết kế. Nó là cố ý ngẫu nhiên để ngăn chặn bất cứ ai nhận được một trong những người, hoặc bằng mong muốn hoặc do tai nạn.

Tính ngẫu nhiên chỉ dành cho một lớp thử nghiệm nhất định, vì vậy bạn có thể đạt được mục tiêu của mình bằng cách gói các mục bạn muốn kiểm soát thứ tự bên trong lớp lồng nhau - nhưng trong trường hợp đó, bạn vẫn sẽ kết thúc với thứ tự ngẫu nhiên bất cứ khi nào bạn có nhiều hơn hai Phương pháp thử nghiệm trong một lớp học.

Nếu bạn đang cố gắng quản lý việc xây dựng đồ đạc hoặc bối cảnh, cơ chế IUseFixture<T> tích hợp có thể phù hợp. Xem các ví dụ xUnit Cheat Sheet.

Nhưng bạn thực sự cần phải cho chúng tôi biết thêm về những gì bạn đang cố gắng làm hoặc chúng tôi sẽ chỉ phải suy đoán.

14

Tính kiểm tra: ở cuối trang this.

[PrioritizedFixture] 
public class MyTests 
{ 
    [Fact, TestPriority(1)] 
    public void FirstTest() 
    { 
     // Test code here is always run first 
    } 
    [Fact, TestPriority(2)] 
    public void SeccondTest() 
    { 
     // Test code here is run second 
    } 
} 

BTW, tôi có cùng một vấn đề ngay bây giờ. Và có, nó không phải là nghệ thuật sạch sẽ .. nhưng QA muốn có một thử nghiệm thủ công .. vì vậy một thử nghiệm tự động với một thứ tự cụ thể đã là một bước nhảy vọt lớn cho họ .. (ho) và có, nó không phải là thử nghiệm đơn vị thực sự ..

+0

Chính xác câu trả lời tôi đã đưa ra. ;) – bricelam

+0

Thực ra, bây giờ tôi thấy bình luận của bạn .. Tôi nhớ. :) TestPriority chỉ hoạt động trên cơ sở mỗi mô-đun/lớp. Vì vậy, các lớp khác nhau vẫn được thực hiện theo thứ tự ngẫu nhiên. (Trình biên dịch C# nhúng các lớp trong một thứ tự không thể dự đoán được vào trong assembly.) Để làm cho chuỗi kiểm tra (testers có một giao thức thử nghiệm) dễ dàng hơn và lặp lại, tôi đã thêm phân loại theo thứ tự chữ cái. Vì vậy, tôi đã tạo một phiên bản sửa đổi của xunit 1.9 để thực thi các lớp thử nghiệm theo thứ tự bảng chữ cái. Hãy xem http://www.andreas-reiff.de/2012/06/xunit-with-alphabetically-sorted-classes-and-proper-display-list-matching-execution-order/. –

+0

@ bricelam, liên kết đó dường như bị hỏng, nó đi vào một số vòng lặp chuyển hướng. –

12

Trong xUnit 2. * điều này có thể đạt được bằng cách sử dụng thuộc tính TestCaseOrderer để chỉ định chiến lược đặt hàng, có thể được sử dụng để tham chiếu thuộc tính được chú thích trên mỗi thử nghiệm để biểu thị đơn đặt hàng.

Ví dụ:

đặt hàng Chiến lược

public class PriorityOrderer : ITestCaseOrderer 
{ 
    public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase 
    { 
     var sortedMethods = new SortedDictionary<int, List<TTestCase>>(); 

     foreach (TTestCase testCase in testCases) 
     { 
      int priority = 0; 

      foreach (IAttributeInfo attr in testCase.TestMethod.Method.GetCustomAttributes((typeof(TestPriorityAttribute).AssemblyQualifiedName))) 
       priority = attr.GetNamedArgument<int>("Priority"); 

      GetOrCreate(sortedMethods, priority).Add(testCase); 
     } 

     foreach (var list in sortedMethods.Keys.Select(priority => sortedMethods[priority])) 
     { 
      list.Sort((x, y) => StringComparer.OrdinalIgnoreCase.Compare(x.TestMethod.Method.Name, y.TestMethod.Method.Name)); 
      foreach (TTestCase testCase in list) 
       yield return testCase; 
     } 
    } 

    static TValue GetOrCreate<TKey, TValue>(IDictionary<TKey, TValue> dictionary, TKey key) where TValue : new() 
    { 
     TValue result; 

     if (dictionary.TryGetValue(key, out result)) return result; 

     result = new TValue(); 
     dictionary[key] = result; 

     return result; 
    } 
} 

Thuộc tính

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] 
public class TestPriorityAttribute : Attribute 
{ 
    public TestPriorityAttribute(int priority) 
    { 
     Priority = priority; 
    } 

    public int Priority { get; private set; } 
} 

Test Cases

[TestCaseOrderer("FullNameOfOrderStrategyHere", "OrderStrategyAssemblyName")] 
public class PriorityOrderExamples 
{ 
    [Fact, TestPriority(5)] 
    public void Test3() 
    { 
     //called third 
    } 

    [Fact, TestPriority(0)] 
    public void Test2() 
    { 
     //called second 
    } 

    [Fact, TestPriority(-5)] 
    public void Test1() 
    { 
     // called first 
    } 

} 

xUnit 2. * đặt hàng mẫu here

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