Cara menulis ke Console.Out selama eksekusi tes MSTest

114

Konteks:
Kami memiliki beberapa pengguna yang melaporkan masalah dengan fitur unggah file di aplikasi web kami. Itu hanya terjadi sesekali dan tanpa pola khusus. Kami telah mencoba mencari tahu untuk waktu yang lama, menambahkan informasi debug di mana pun yang menurut kami dapat membantu, merayapi log, dll, tetapi kami belum dapat mereproduksi atau mengetahuinya.

Masalah:
Saya sekarang mencoba mereproduksi ini dengan menggunakan MSTest dan WatiN untuk mengulangi operasi yang seharusnya gagal berkali-kali (beberapa ratus). Hanya untuk mendapatkan petunjuk tentang seberapa jauh pengujian telah dilakukan, saya ingin mencetak sesuatu seperti:

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

Namun ini tidak muncul di jendela Output. Sekarang saya tahu bahwa Anda akan mendapatkan output konsol dalam hasil tes (serta apa yang Anda output dari Debug.Writelinedll), tetapi ini tidak tersedia sampai setelah tes selesai. Dan karena pengujian saya dengan ratusan pengulangan bisa memakan waktu cukup lama, saya ingin tahu sejauh mana perkembangannya.

Pertanyaan:
Apakah ada cara agar saya bisa mendapatkan output konsol di jendela Output selama eksekusi pengujian?

Julian
sumber
Jika Anda mencari cara untuk mencetak ke keluaran hasil tes: stackoverflow.com/a/4787047/621690
Risadinha

Jawaban:

111

Keluaran konsol tidak muncul karena kode backend tidak berjalan dalam konteks pengujian.

Anda mungkin lebih baik menggunakan Trace.WriteLine(Dalam System.Diagnostics) lalu menambahkan pemroses pelacakan yang menulis ke file.

Topik dari MSDN ini menunjukkan cara melakukan ini.


Menurut komentar Marty Neal dan Dave Anderson:

using System;
using System.Diagnostics;

...

Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");
Andras Zoltan
sumber
73
jadi pada dasarnya, Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Neal
7
Hmmm, saya menemukan bahwa saran oleh @ Martin Neal mengirim baik Trace.WriteLine()dan Console.WriteLine()output ke Hasil Uji View , bukan yang Keluaran View . (Dan perhatikan bahwa di Tampilan Hasil Tes , mungkin perlu untuk menambahkan kolom Output (Stdout) dengan mengklik kanan dan memilih Tambah / Hapus Kolom .... ) Tapi, mungkin saya masih tidak melihat output di Output Lihat berarti saya melewatkan sesuatu ...
DavidRR
3
Trace.Listeners.Add(new ConsoleTraceListener());cukup dan kemudian Tampilkan keluaran dari Debug di jendela keluaran.
Dave Anderson
3
Saya berjuang untuk benar-benar menemukan output di VS2017 ... jendela TestExplorer -> Klik pada tes individu -> Jika tes memiliki ouput, di jendela detail di bawah waktu yang telah berlalu ada kata "ouput" yang merupakan tautan ke jendela baru.
Mike Walsh
2
Jika Anda menggunakan Xunit, cukup gunakan ITestOutputHelper melalui ctor dan panggil WriteLine di atasnya. Butuh beberapa saat sebelum saya menemukan cara menulis selama pengujian integrasi, semoga ini membantu seseorang.
Alexander Høst
69

Gunakan Debug.WriteLine. Ini akan segera menampilkan pesan Anda di Outputjendela. Satu-satunya batasan adalah Anda harus menjalankan pengujian Anda dalam Debugmode.

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

Keluaran

masukkan deskripsi gambar di sini

chaliasos
sumber
8
membutuhkanusing System.Diagnostics;
kmote
5
Jangan gunakan DateTime.Now. Lebih baik menggunakan Stopwatch ( msdn.microsoft.com/en-us/library/… )
suizo
1
Saya tidak bisa mendapatkan ini untuk bekerja. Ketika saya menjalankan pengujian, Jendela Keluaran segera beralih ke Build dan tidak ada yang dikirim ke Debug. Pikiran Anda?
InteXX
5
@InteXX pastikan Anda mengklik "Debug tes", bukan "Jalankan tes". itu berhasil untuk saya
John Henckel
@JohnHenckel: Gotcha. Terima kasih. Akan melakukan itu. Nyatanya Schaliasos mengatakan dengan tepat dalam jawabannya; tidak yakin bagaimana saya melewatkannya.
InteXX
13

Saya menemukan solusi saya sendiri. Saya tahu bahwa jawaban Andras mungkin yang paling konsisten dengan MSTEST, tetapi saya tidak ingin memfaktorkan ulang kode saya.

[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"));
    }
}

Barang sekali pakai ConsoleRedirectordidefinisikan sebagai:

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

Saya memiliki masalah yang sama dan saya "Menjalankan" tes. Jika saya malah melakukan "Debug" pengujian, keluaran Debug menunjukkan dengan baik seperti semua Trace dan Konsol lainnya. Saya tidak tahu bagaimana melihat output jika Anda "Menjalankan" tes.

Gökhan Kurt
sumber
Saya bisa mendapatkan sesuatu untuk ditampilkan System.Diagnostics.Debug.WriteLinesaat melakukan uji debug, tetapi bagaimana Anda mulai Console.WriteLinebekerja? Ini tidak berakhir dalam output normal (langsung diperbarui) untuk saya.
ATAU Mapper
Apakah Anda menemukan cara untuk melihat keluaran saat menjalankan pengujian?
hima
0

Anda lebih baik menyiapkan satu pengujian dan membuat pengujian kinerja dari pengujian ini. Dengan cara ini Anda dapat memantau kemajuan menggunakan set alat default.

riezebosch.dll
sumber
"Dengan cara ini Anda dapat memantau kemajuan menggunakan set alat default." - bagaimana caranya? Masalah yang saya lihat adalah persis bahwa setelah tes berjalan, itu adalah kotak hitam dan saya hanya bisa melihat output (yang saya tulis secara bertahap saat tes berjalan) setelah tes selesai berjalan, di jendela Output .
ATAU Mapper