2015-09-21 18 views
6

Tôi đã có một bài kiểm tra (Lý thuyết) mà là chậm và một loạt các trường hợp thử nghiệm cho nó. Vì vậy, tôi muốn chúng chạy đồng thời.Làm thế nào để làm cho xUnit chạy một lý thuyết song song?

tôi đã tạo ra một ví dụ đơn giản:

[Theory] 
[MyTestData] 
public void MyTheory(int num, int sleep) 
{ 
    Console.WriteLine("{0:HH:mm:ss.ffff} - Starting {1} - Sleeping {2}", DateTime.Now, num, sleep); 
    Thread.Sleep(sleep); 
    Console.WriteLine("{0:HH:mm:ss.ffff} - Finished {1} - Sleeping {2}", DateTime.Now, num, sleep); 
} 

[AttributeUsage(AttributeTargets.Method)] 
public class MyTestDataAttribute : DataAttribute 
{ 
    public override IEnumerable<object[]> GetData(MethodInfo testMethod) 
    { 
     yield return new object[2] { 1, 5000 }; 
     yield return new object[2] { 2, 2000 }; 
     yield return new object[2] { 3, 4000 }; 
    } 
} 

Các dòng lệnh để chạy thử nghiệm:

"\packages\xunit.runner.console.2.0.0\tools\xunit.console" "\Projects\xUnitTest\xUnitTest\bin\Debug\xUnitTest.dll" -parallel all > xUnitResult.txt 

Và kết quả:

xUnit.net console test runner(64-bit.NET 4.0.30319.42000) 
Copyright(C) 2015 Outercurve Foundation. 

Discovering: xUnitTest 
Discovered: xUnitTest 
Starting: xUnitTest 
21:55:39.0449 - Starting 2 - Sleeping 2000 
21:55:41.0627 - Finished 2 - Sleeping 2000 
21:55:41.0783 - Starting 1 - Sleeping 5000 
21:55:46.0892 - Finished 1 - Sleeping 5000 
21:55:46.0892 - Starting 3 - Sleeping 4000 
21:55:50.0989 - Finished 3 - Sleeping 4000 
Finished: xUnitTest 

=== TEST EXECUTION SUMMARY === 
    xUnitTest Total: 3, Errors: 0, Failed: 0, Skipped: 0, Time: 11,137s 

Đó là khá nối tiếp. Tôi chắc chắn rằng nó có thể làm cho nó song song.

+6

https://xunit.github.io/docs/running-tests-in-parallel.html –

+1

Btw, '[MemberData (nameof (MyTestData))]' sạch hơn việc tạo thuộc tính tùy chỉnh, theo ý kiến ​​của tôi. –

Trả lời

5

Hiện tại, điều này không thể thực hiện được từ xUnit 2.1. Theo số parallelization docs,

Theo mặc định, mỗi lớp thử nghiệm là một bộ sưu tập thử nghiệm duy nhất. Các thử nghiệm trong cùng một lớp kiểm tra sẽ không chạy song song với nhau.

gì các tài liệu không thực hiện một cách rõ ràng rõ ràng là:

  • đơn vị nhỏ nhất "parallelizable" trong xUnit là một bộ sưu tập
  • không có cách nào để kiểm tra trong cùng một lớp được ở khác nhau bộ sưu tập

Bằng cách gia hạn, không thể có các lý thuyết song song vì lý thuyết không thể chia thành nhiều lớp.


Trong trường hợp của bạn, điều này có nghĩa bạn có ít nhất hai lựa chọn:

  • Refactor mã của bạn trong thử nghiệm để bất cứ điều gì đang diễn rất nhiều thời gian là trừu tượng đi. Ví dụ, giả sử bạn phải chạy một số logic nghiệp vụ và sau đó thực hiện một cuộc gọi cơ sở dữ liệu. Nếu bạn có thể tách logic nghiệp vụ có thể kiểm tra thành một lớp khác, bạn có thể chạy lý thuyết của mình dựa trên lý thuyết đó (không song song, nhưng trong < 1 ms) và kiểm tra riêng mã truy cập dữ liệu chậm.

  • Nếu bạn có đủ trường hợp kiểm tra, chỉ cần tạo một lớp mới cho mỗi trường hợp thử nghiệm và sử dụng Fact thay vì Theory. Bạn thậm chí có thể đặt tất cả trong một tệp. Đó là chi tiết hơn, và bạn bị mất yếu tố "mát mẻ" của việc sử dụng các lý thuyết, nhưng bạn sẽ nhận được thực hiện song song.

3

Mặc dù không thể trực tiếp với xUnit, bạn có thể làm việc xung quanh nếu bạn cần. Với những hạn chế, như bạn phải tự định nghĩa số lượng các phép thực hiện song song thông qua các lớp, vì vậy nếu bạn muốn song song nó trên hai luồng, bạn cần tạo hai lớp.

public abstract class ParellelTheoryBase 
{ 
    public static List<int> testValues = new List<int> {1, 2, 3, 4, 5, 6}; 
} 

public class ParallelTheory_1of2 : ParellelTheoryBase 
{ 
    public static List<object[]> theoryData = testValues.Where((data, index) => index % 2 == 0).Select(data => new object[] { data }).ToList(); 

    [Theory] 
    [MemberData(nameof(theoryData))] 
    public void DoSomeLongRunningAddition(int data) 
    { 
     Assert.True(data < 7); 
     Thread.Sleep(5000); 
    } 
} 

public class ParallelTheory_2of2 : ParellelTheoryBase 
{ 
    public static List<object[]> theoryData = testValues.Where((data, index) => index % 2 == 1).Select(data => new object[] { data }).ToList(); 

    [Theory] 
    [MemberData(nameof(theoryData))] 
    public void DoSomeLongRunningAddition(int data) 
    { 
     Assert.True(data < 7); 
     Thread.Sleep(5000); 
    } 
} 

Trong ví dụ này, tôi đã xác định thuộc tính trong ParellelTheoryBase, là lớp cơ sở cho các lớp thử nghiệm thực tế. Sau đó, ParallelTheory_1of2ParallelTheory_2of2 kế thừa từ lớp đó để có quyền truy cập vào testValues.Bây giờ, Theory sử dụng theoryData này để thực hiện kiểm tra và chỉ chọn dữ liệu lẻ hoặc thậm chí (index % 2 == 1 hoặc index % 2 == 0) từ danh sách.

Nó được nhặt trong Visual kiểm tra Studio explorer: Visual Studio test explorer

Và chạy song song:

[xUnit.net 00:00:00.3397963] Starting 
[xUnit.net 00:00:15.5696617] Finished 

Đây có thể là một giải pháp mà nó không phải là dễ dàng để biết trong dữ liệu thử nghiệm trước bao nhiêu bạn có. Ví dụ, tôi sử dụng, trong tích hợp kiểm tra một trình phân tích cú pháp tệp trong đó đầu vào là bất kỳ tệp nào trong một thư mục và các tệp mới được thêm sẽ tự động được chọn cho các thử nghiệm.

Trong ví dụ của bạn, tôi nghĩ bạn có thể dễ dàng sửa đổi thuộc tính MyTestData để chấp nhận tham số cho totalCountParallelscurrentIndex.

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