2011-02-03 40 views
92

Bối cảnh:
Chúng tôi có một số người dùng báo cáo vấn đề với một tính năng tải lên tập tin trong ứng dụng web của chúng tôi. Nó chỉ thỉnh thoảng xảy ra và không có bất kỳ mẫu đặc biệt nào. Chúng tôi đã cố gắng tìm ra nó trong một thời gian dài, thêm thông tin gỡ lỗi ở bất cứ nơi nào chúng tôi có thể nghĩ rằng nó có thể giúp đỡ, thu thập thông tin các bản ghi vv, nhưng chúng tôi đã không thể tái tạo hoặc tìm ra nó.Làm thế nào để viết thư cho Console.Out trong khi thì hành một thử nghiệm MSTest

Vấn đề:
Tôi bây giờ cố gắng để tái sản xuất này bằng cách sử dụng MSTest và WatiN để lặp lại các hoạt động đó là nghĩa vụ để thất bại một số lượng lớn các lần (vài trăm). Chỉ cần để có một đầu mối về cách xa trong vòng lặp thử nghiệm đã nhận được, tôi muốn in một cái gì đó như:

Console.WriteLine(String.Format("Uploaded file, attempt {0} of {1}", i, maxUploads)); 

Điều này không xuất hiện trong cửa sổ đầu ra. Bây giờ tôi biết rằng bạn sẽ nhận được kết quả đầu ra của giao diện điều khiển trong kết quả kiểm tra (cũng như những gì bạn xuất từ ​​Debug.Writeline v.v.), nhưng điều này không có sẵn cho đến khi sau khi kiểm tra kết thúc. Và kể từ khi thử nghiệm của tôi với hàng trăm lần lặp lại có thể mất nhiều thời gian, tôi muốn biết nó đã nhận được bao xa.

Câu hỏi:
Có cách nào tôi có thể nhận được đầu ra giao diện điều khiển trong cửa sổ Output trong thực hiện bài kiểm tra?

Trả lời

92

Đầu ra Console không xuất hiện là do mã phụ trợ không chạy trong ngữ cảnh của thử nghiệm.

Có lẽ bạn nên sử dụng Trace.WriteLine (Trong System.Diagnostics) và sau đó thêm trình theo dõi ghi vào tệp.

This topic from MSDN cho biết cách thực hiện việc này.

+61

về cơ bản, 'Trace.Listeners.Add (new TextWriterTraceListener (Console.Out));' 'Trace.WriteLine (" Hello World ");' –

+0

Tốt, tôi thích nó. Để có được xung quanh này tôi đã sử dụng log4net với một filelogger. Bạn sẽ phải thay đổi các cuộc gọi của bạn từ Console.WriteLine thành Logger.Info (...) – joshgo

+7

Hmmm, tôi thấy rằng gợi ý của @Martin Neal gửi cả hai 'Trace.WriteLine()' và 'Console.WriteLine () 'đầu ra cho ** Kết quả kiểm tra xem **, * không * ** Xem đầu ra **. (Và lưu ý rằng trong ** Xem kết quả kiểm tra **, có thể cần thêm cột ** Output (Stdout) ** bằng cách nhấn chuột phải và chọn ** Add/Remove Columns ... **.) Nhưng , có lẽ tôi vẫn không nhìn thấy đầu ra trong ** Xem đầu ra ** có nghĩa là tôi đang thiếu một cái gì đó ... – DavidRR

1

Bạn nên thiết lập một thử nghiệm đơn giản hơn và tạo thử nghiệm hiệu suất từ ​​thử nghiệm này. Bằng cách này bạn có thể theo dõi tiến độ bằng cách sử dụng bộ công cụ mặc định.

+0

"Bằng cách này bạn có thể theo dõi tiến trình bằng cách sử dụng bộ công cụ mặc định". - làm sao? Vấn đề tôi thấy chính xác là khi chạy thử, nó là một hộp đen và tôi chỉ nhận được kết quả đầu ra (rằng tôi đang dần viết trong khi thử nghiệm đang chạy) sau khi thử nghiệm đã kết thúc chạy, trong đầu ra * * cửa sổ. –

+0

https://www.visualstudio.com/en-us/docs/test/performance-testing/run-performance-tests-app-before-release#create-a-load-test – riezebosch

12

Tôi đã tìm được giải pháp của riêng mình. Tôi biết rằng câu trả lời Andras có lẽ là nhất quán với MSTEST, nhưng tôi không cảm thấy muốn tái cấu trúc mã của mình.

[TestMethod] 
public void OneIsOne() 
{ 
    using (ConsoleRedirector cr = new ConsoleRedirector()) 
    { 
     Assert.IsFalse(cr.ToString().Contains("New text")); 
     /* call some method that writes "New text" to stdout */ 
     Assert.IsTrue(cr.ToString().Contains("New text")); 
    } 
} 

Các dùng một lần ConsoleRedirector được định nghĩa là:

internal class ConsoleRedirector : IDisposable 
{ 
    private StringWriter _consoleOutput = new StringWriter(); 
    private TextWriter _originalConsoleOutput; 
    public ConsoleRedirector() 
    { 
     this._originalConsoleOutput = Console.Out; 
     Console.SetOut(_consoleOutput); 
    } 
    public void Dispose() 
    { 
     Console.SetOut(_originalConsoleOutput); 
     Console.Write(this.ToString()); 
     this._consoleOutput.Dispose(); 
    } 
    public override string ToString() 
    { 
     return this._consoleOutput.ToString(); 
    } 
} 
60

Sử dụng Debug.WriteLine. Thao tác này sẽ hiển thị tin nhắn của bạn trong cửa sổ Output ngay lập tức. Hạn chế duy nhất là bạn phải chạy thử nghiệm của mình ở chế độ Debug.

[TestMethod] 
public void TestMethod1() 
{ 
    Debug.WriteLine("Time {0}", DateTime.Now); 
    System.Threading.Thread.Sleep(30000); 
    Debug.WriteLine("Time {0}", DateTime.Now); 
} 

Output

enter image description here

+6

yêu cầu 'using System.Diagnostics; ' – kmote

+4

Không sử dụng DateTime.Now. Tốt hơn nên sử dụng Đồng hồ bấm giờ (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) – suizo

+1

Tôi không thể làm việc này. Khi tôi chạy thử nghiệm, Cửa sổ Đầu ra sẽ chuyển sang Xây dựng ngay lập tức và không có gì được gửi tới Debug. Suy nghĩ của bạn? – InteXX

3

tôi đã cùng một vấn đề và tôi đã "chạy" các bài kiểm tra. Nếu tôi thay vào đó "Debug" các bài kiểm tra kết quả Debug cho thấy tốt như tất cả những người khác Trace và Console. Tôi không biết làm thế nào để xem đầu ra nếu bạn "Chạy" các bài kiểm tra.

+0

Tôi có thể nhận được một cái gì đó để hiển thị bằng cách sử dụng 'System.Diagnostics.Debug.WriteLine' trong khi gỡ lỗi kiểm tra, nhưng làm thế nào để bạn có được' Console.WriteLine' để làm việc? Điều này không kết thúc ở đầu ra bình thường (cập nhật trực tiếp) cho tôi. –

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