2013-02-26 19 views
23

Tôi đang sử dụng xUnit với nhân vật thử nghiệm ReSharper và plugin xUnitContrib resharper.Sử dụng ReSharper, làm thế nào để hiển thị đầu ra gỡ lỗi trong một thử nghiệm đơn vị chạy dài?

Khi tôi có một thử nghiệm dài hạn, tôi muốn có thể xuất một số chỉ báo tiến trình đến cửa sổ Kiểm tra Đơn vị Đầu ra.

Tôi đã thử Debug.WriteLines, Trace.WriteLineConsole.WriteLine. Tất cả đều có hành vi tương tự - không có gì hiển thị trong cửa sổ đầu ra cho đến khi thử nghiệm hoàn tất.

Ví dụ:

[Fact] 
public void Test() 
{ 
    Debug.WriteLine("A"); 
    Trace.WriteLine("B"); 
    Console.WriteLine("C"); 

    Thread.Sleep(10000); 
} 

thử nghiệm cho thấy không có đầu ra cho đến khi 10 giây đã trôi qua và thử nghiệm hoàn tất. Làm thế nào để tôi có được đầu ra trên đường đi?

CẬP NHẬT 1

Tôi cũng đã cố gắng với MSTest và NUnit. NUnit là người duy nhất cho thấy đầu ra trên đường đi.

MSTest và XUnit không trả lại bất kỳ đầu ra nào cho đến khi thử nghiệm hoàn tất. Phần lạ là trong khi các XUnit và NUnit kiểm tra đầu ra trông như thế này:

A 
B 
C 

Sản lượng MSTest trông như thế này:

C 


Debug Trace: 

A 
B 

Với tất cả các biến thể, tôi nghĩ câu trả lời là nó tùy thuộc vào việc thực hiện runner thử nghiệm để quyết định cách thức và thời điểm xuất. Có ai biết nếu nó có thể cấu hình Á hậu thử nghiệm XUnit?

UPDATE 2

Tôi nghĩ rằng đây phải là một sự thiếu hụt trong xUnitContrib. Đã đăng lên CodePlex issue tracker của họ.

+0

Debug.WriteLine() hoạt động hoàn hảo tốt cho tôi khi tôi đang ở chế độ gỡ lỗi. Vì vậy, nếu bạn muốn đăng nhập một cách chung tôi khuyên bạn nên trả lời của brenton – derape

+0

@derape - Không, nó không hoạt động với xunit. Không có đầu ra nào xuất hiện cho đến khi thử nghiệm hoàn tất. –

+0

Tôi hiểu, tôi đã không chơi với XUnit - chỉ NUnit. Và NUnit đăng nhập không hoạt động dọc theo các chủ đề gỡ lỗi ... – brenton

Trả lời

0

Cách đơn giản nhất tôi thấy là sử dụng log4net và tạo trình ghi nhật ký. Trên đường đi, khi bạn đang chạy, bạn sẽ gọi logger.Info ("info here"); hoặc log.Debug ("thông tin ở đây"); - thực sự bất kể mức độ ghi nhật ký ưa thích của bạn - và đầu ra sẽ hiển thị trong Phiên kiểm tra đơn vị Resharper.

Đọc thêm về khung đăng nhập on the Apache log4net homepage. Các configuration examples cũng sẽ là vô giá.

+0

Không. Đăng nhập log4net, và những tin nhắn thậm chí không làm cho nó vào đầu ra kiểm tra đơn vị ở tất cả. Tôi đã sử dụng một appender console đơn giản - một trong những ví dụ. –

7

ReSharper bằng cách nào đó lấy người nghe mặc định trong các thử nghiệm đơn vị.Để hiển thị văn bản trong cửa sổ Output, chỉ cần thêm dòng này:

Debug.Listeners.Add(new DefaultTraceListener()); 
+0

Điều này không có tác dụng đối với tôi, trong cửa sổ Unit Test Sessions hoặc cửa sổ Output (sử dụng MSTest). –

21

Nếu bạn sử dụng xUnit.net 1.x, bạn có thể trước đây đã được viết ra để Console, gỡ lỗi, hoặc Trace. Khi xUnit.net v2 được vận chuyển với chế độ song song được bật theo mặc định, cơ chế chụp đầu ra này không còn phù hợp nữa; không thể biết được bài kiểm tra nào trong số nhiều thử nghiệm có thể chạy song song có trách nhiệm viết cho các tài nguyên được chia sẻ đó. Người dùng đang chuyển mã từ v1.x sang v2.x nên sử dụng một trong hai phương pháp mới thay thế.

Có một cái nhìn vào đây để ví dụ về làm thế nào để thực hiện khai thác gỗ với xUnit.net v2:

http://xunit.github.io/docs/capturing-output.html

Đây là ví dụ:

using Xunit; 
using Xunit.Abstractions; 

public class MyTestClass 
{ 
    private readonly ITestOutputHelper output; 

    public MyTestClass(ITestOutputHelper output) 
    { 
     this.output = output; 
    } 

    [Fact] 
    public void MyTest() 
    { 
     var temp = "my class!"; 
     output.WriteLine("This is output from {0}", temp); 
    } 
} 
+0

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn! – nrodic

+0

Điều này rất hữu ích cho việc viết đầu ra từ bên trong các bài kiểm tra, nhưng khi bạn cần thông tin đầu ra trong thời gian thực từ mã được gọi bằng các bài kiểm tra, bạn phải sửa đổi mã đang được thử nghiệm để truyền vào và sử dụng 'ITestOutputHelper'. Tôi hiểu vấn đề đồng thời làm cho nó khó khăn để xử lý đầu ra từ mã, tôi chỉ muốn chỉ ra cho những người khác rằng giải pháp này không có một giới hạn. Nó sẽ là tốt đẹp để tận dụng một cái gì đó như nghe theo dõi hoặc cướp dòng đầu ra mặc định cho các phương pháp 'Debug.Write *'. –