Cách ghi vào Console.Out trong khi thực hiện kiểm tra MSTest


113

Bối cảnh:
Chúng tôi có một số người dùng báo cáo sự cố với tính năng tải tệp lên trong ứng dụng web của chúng tôi. Nó chỉ xảy ra thỉnh thoảng và không có bất kỳ mô hình đặc biệt nào. Chúng tôi đã cố gắng tìm ra điều đó trong một thời gian dài, thêm thông tin gỡ lỗi vào bất cứ đâu mà chúng tôi nghĩ rằng nó có thể hữu ích, thu thập thông tin nhật ký, v.v. nhưng chúng tôi không thể tái tạo hoặc tìm ra nó.

Vấn đề:
Bây giờ tôi đang cố gắng tái tạo điều này bằng cách sử dụng MSTest và WatiN để lặp lại hoạt động được cho là không thành công một số lượng lớn lần (vài trăm). Chỉ để có manh mối về việc kiểm tra đã đi được bao xa, tôi muốn in một cái gì đó như:

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

Tuy nhiên, đ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 đầu ra bảng điều khiển trong kết quả kiểm tra (cũng như những gì bạn xuất ra từ Debug.Writelinev.v.), nhưng điều này không khả dụng cho đến khi quá trình kiểm tra kết thúc. Và vì bài kiểm tra của tôi với hàng trăm lần lặp lại có thể mất khá nhiều thời gian, tôi muốn biết nó đã đi được bao xa.

Câu hỏi:
Có cách nào tôi có thể lấy đầu ra bảng điều khiển trong cửa sổ Đầu ra trong quá trình thực thi thử nghiệm không?


Nếu bạn tìm kiếm một cách để in kết quả đầu ra: stackoverflow.com/a/4787047/621690
Risadinha

Câu trả lời:


110

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

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

Chủ đề này từ MSDN cho thấy một cách để làm điều này.


Theo bình luận của Marty Neal và Dave Anderson:

using System;
using System.Diagnostics;

...

Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");

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

7
Hmmm, tôi thấy rằng những gợi ý bởi @ Martin Neal gửi cả Trace.WriteLine()Console.WriteLine()đầu ra cho Kết Quả Thi Xem , không những Output Xem . (Và lưu ý rằng trong Chế độ xem Kết quả Kiểm tra , có thể cần thêm cột Đầu ra (Stdout) bằng cách nhấp chuột phải và chọn Thêm / Loại bỏ Cột .... ) Nhưng, có lẽ tôi vẫn không thấy đầu ra trong Đầu ra Xem có nghĩa là tôi đang thiếu một cái gì đó ...
DavidRR

2
Trace.Listeners.Add(new ConsoleTraceListener());là đủ và sau đó Hiển thị đầu ra từ Gỡ lỗi trong cửa sổ đầu ra.
Dave Anderson

3
Tôi đang vật lộn để thực sự tìm thấy đầu ra trong VS2017 ... Cửa sổ TestExplorer -> Nhấp vào một bài kiểm tra cá nhân -> Nếu bài kiểm tra có lỗi, trong cửa sổ chi tiết trong khoảng thời gian trôi qua có từ "ouput" là một liên kết đến một cửa sổ mới.
Mike Walsh,

1
Nếu bạn đang sử dụng Xunit, chỉ cần đưa ITestOutputHelper vào thông qua ctor và gọi WriteLine trên đó. Mất một thời gian trước khi tôi tìm ra cách viết trong quá trình kiểm tra tích hợp, hy vọng điều này sẽ giúp ích cho ai đó.
Alexander Høst

69

Sử dụng Debug.WriteLine. Điều này sẽ hiển thị tin nhắn của bạn trong Outputcửa sổ 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 ở Debugchế độ.

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

Đầu ra

nhập mô tả hình ảnh ở đây


8
đòi hỏiusing 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ờ ( msdn.microsoft.com/en-us/library/… )
suizo

1
Tôi không thể làm cho nó hoạt động. Khi tôi chạy thử nghiệm, Cửa sổ đầu ra ngay lập tức chuyển sang Xây dựng và không có gì được gửi đến Gỡ lỗi. Suy nghĩ của bạn?
InteXX

5
@InteXX đảm bảo bạn nhấp vào "Gỡ lỗi kiểm tra", không phải "Chạy kiểm tra". nó làm việc cho tôi
John Henckel

@JohnHenckel: Gotcha. Cảm ơn. Sẽ làm điều đó. Trên thực tế, Schaliasos nói chính xác điều đó ngay trong câu trả lời của mình; không chắc chắn làm thế nào tôi đã bỏ lỡ nó.
InteXX

13

Tôi đã tìm thấy một giải pháp của riêng mình. Tôi biết rằng câu trả lời Andras có lẽ phù hợp nhất với MSTEST, nhưng tôi không cảm thấy muốn cấu trúc lại 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"));
    }
}

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();
    }
}

3

Tôi đã gặp vấn đề tương tự và tôi đang "Chạy" các bài kiểm tra. Nếu tôi "Gỡ lỗi" thay vào đó, các bài kiểm tra đầu ra Gỡ lỗi hiển thị 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 kết quả nếu bạn "Chạy" các bài kiểm tra.


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.WriteLinetrong khi gỡ lỗi các thử nghiệm, nhưng làm thế nào để bạn Console.WriteLinelàm việc? Điều này không kết thúc trong đầu ra bình thường (cập nhật trực tiếp) đối với tôi.
HOẶC Người lập bản đồ

Bạn có tìm thấy bất kỳ cách nào để xem kết quả đầu ra trong khi chạy thử nghiệm không?
hea

0

Tốt hơn bạn nên thiết lập một thử nghiệm duy nhất 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 trình bằng bộ công cụ mặc định.


"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 đang gặp phải chính xác là sau khi chạy thử nghiệm, đó là một hộp đen và tôi chỉ thấy kết quả đầu ra (mà tôi đang viết dần trong khi thử nghiệm đang chạy) sau khi chạy thử nghiệm xong, trong cửa sổ Đầu ra. .
HOẶC Người vẽ bản đồ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.