Bisakah saya menulis ke konsol dalam unit test? Jika ya, mengapa jendela konsol tidak terbuka?


148

Saya punya proyek uji di Visual Studio. Saya menggunakan Microsoft.VisualStudio.TestTools.UnitTesting .

Saya menambahkan baris ini di salah satu tes unit saya:

Console.WriteLine("Some foo was very angry with boo");
Console.ReadLine();

Ketika saya menjalankan tes, tes berlalu, tetapi jendela konsol tidak dibuka sama sekali.

Apakah ada cara untuk membuat jendela konsol tersedia untuk berinteraksi melalui uji unit?


1
Itu sangat tergantung pada pelari. Anda dapat menggunakan TestDriven.Net (hebat, gratis untuk penggunaan pribadi, test runner) - Console.WriteLine akan menulis ke panel output VS.
seldary

1
Terima kasih telah menyebarkan berita di TestDriven.Net
GrayFox374

NCrunch juga memiliki fitur ini, yang sendirian membuatnya sebanding dengan harga IMO. Saya memiliki Dumpmetode ekstensi yang menampilkan konten objek ke konsol, membuat semuanya jauh lebih mudah untuk di-debug. i.imgur.com/MEZwy7X.png
DharmaTurtle

Jawaban:


125

CATATAN: Jawaban asli di bawah ini akan berfungsi untuk versi Visual Studio hingga Visual Studio 2012. Visual Studio 2013 tampaknya tidak memiliki jendela Hasil Uji lagi. Sebagai gantinya, jika Anda membutuhkan output khusus pengujian, Anda dapat menggunakan saran @ Stretch Trace.Write()untuk menuliskan output ke jendela Output.


The Console.Writemetode tidak menulis ke "konsol" - itu menulis untuk apa pun yang ketagihan hingga pegangan output standar untuk proses berjalan. Demikian pula, Console.Readmembaca input dari apa pun yang terhubung ke input standar.

Ketika Anda menjalankan tes unit melalui Visual Studio 2010, output standar dialihkan oleh harness tes dan disimpan sebagai bagian dari output tes. Anda dapat melihat ini dengan mengklik kanan jendela Hasil Uji dan menambahkan kolom bernama "Output (StdOut)" ke layar. Ini akan menunjukkan apa pun yang ditulis ke output standar.

Anda bisa secara manual membuka jendela konsol, menggunakan P / Invoke seperti kata sinni800 . Dari membaca AllocConsoledokumentasi, tampak bahwa fungsi akan mengatur ulang stdindan stdoutmenangani untuk menunjuk ke jendela konsol baru. (Saya tidak 100% yakin tentang itu; tampaknya agak salah bagi saya jika saya sudah diarahkan stdoutuntuk Windows untuk mencurinya dari saya, tetapi saya belum mencoba.)

Namun secara umum, saya pikir itu ide yang buruk; jika semua yang Anda ingin gunakan untuk konsol adalah untuk membuang informasi lebih lanjut tentang pengujian unit Anda, hasilnya ada untuk Anda. Tetap menggunakan Console.WriteLinecara Anda, dan periksa hasil output di jendela Hasil Uji setelah selesai.


Coba buka Aplikasi Windows baru, gunakan AllocConsole untuk mengalokasikan konsol dan itu akan menulis di sana. Saya tidak tahu apa yang sebenarnya tetapi mungkin tidak bekerja di lingkungan Unit Test. Sungguh menyenangkan mengetahui ...
sinni800

hrm membaca kembali AllocConsoledokumentasi, saya mungkin salah, tetapi saya harus mengujinya.
Michael Edenfield

2
Bagi saya komentar dari Michael ini mengatakan semua yang perlu saya pikirkan: "Ketika Anda menjalankan unit test melalui VS2010, output standar dialihkan oleh harness tes dan disimpan sebagai bagian dari output tes."
Robert Patterson

5
di VS2013, jika tulisan Anda di Konsol, akan ada label tautan [Keluaran] di TestExplorer / Test / Summary. Klik di atasnya dan Anda mendapatkan output yang diinginkan. Tunggu? Anda juga ingin memanggil Console.ReadLine () ??
Visar

3
Di V2017 (Komunitas), buka "test explorer", pilih item hasil tes dalam daftar, lalu klik tautan "output" di jendela lain (jendela hasil tes?). Karena mungkin akan terpotong, gunakan "salin semua" dan lewati tempat lain.
heringer

180

Seseorang berkomentar tentang fungsi yang tampaknya baru ini di Visual Studio 2013. Saya tidak yakin apa yang dia maksud pada awalnya, tetapi sekarang saya lakukan, saya pikir itu layak untuk jawabannya sendiri.

Kita dapat menggunakan Console.WriteLine secara normal dan output ditampilkan, hanya saja tidak di jendela Output, tetapi di jendela baru setelah kita klik "Output" pada detail pengujian.

Masukkan deskripsi gambar di sini


2
Solusi yang sangat baik. Konfirmasikan itu berfungsi di VS2015 Enterprise.
garfbradaz

6
Sayangnya, seseorang tidak dapat memilih teks apa pun di area output untuk disalin dan ditempel :( Apa yang mereka pikirkan ?!
ATAU Mapper

3
@ORMapper, klik kanan pada area "Standard Output", dan pilih salin semua
bychance

2
@ Ovi-WanKenobi mencoba menghasilkan sesuatu dengan Console.Write
Tiago Duarte

5
Di vs 2017 Anda harus memilih tes SETIAP yang dijalankan, lalu klik output - tidak terlalu berguna ketika Anda memiliki banyak tes. Saya ingin melihat semua output secara bersamaan - tidak di jendela yang terpisah.
inliner49er

37

Anda bisa menggunakan baris ini untuk menulis ke Window Output dari Visual Studio:

System.Diagnostics.Debug.WriteLine("Matrix has you...");

Harus dijalankan dalam mode Debug.


7
Itu tidak menulis di VS saya
Luis Filipe

1
periksa utas ini untuk detailnya - stackoverflow.com/questions/1159755/…
Dmitry Pavlov

1
Ini bekerja sangat baik untuk saya menggunakan MSTest dan R # untuk melihat hasilnya. Terima kasih!
Isaac Baker

2
@ William itu muncul jika Anda men-debug tes, tetapi tidak jika Anda hanya menjalankannya tanpa men-debug.
yoyo

29

Seperti yang dinyatakan, unit test dirancang untuk berjalan tanpa interaksi.

Namun, Anda dapat men - debug unit test, sama seperti kode lainnya. Cara termudah adalah dengan menggunakan Debugtombol di tab Hasil Uji.

Mampu melakukan debug berarti bisa menggunakan breakpoints. Mampu menggunakan breakpoints, kemudian, berarti bisa menggunakan Tracepoints , yang menurut saya sangat berguna dalam debugging setiap hari.

Pada dasarnya, Tracepoints memungkinkan Anda menulis ke jendela Output (atau, lebih tepatnya, ke output standar). Secara opsional, Anda dapat terus menjalankan, atau Anda dapat berhenti seperti breakpoint biasa. Ini memberi Anda "fungsionalitas" yang Anda minta, tanpa perlu membangun kembali kode Anda, atau mengisinya dengan informasi debug.

Cukup tambahkan breakpoint, lalu klik kanan breakpoint itu. Pilih opsi "When Hit ...":

Saat menekan opsi

Yang memunculkan dialog:

Ketika breakpoint ditabrak

Beberapa hal yang perlu diperhatikan:

  1. Perhatikan bahwa breakpoint sekarang ditampilkan sebagai berlian, bukan bola, menunjukkan titik jejak
  2. Anda bisa menampilkan nilai variabel dengan menyertakannya seperti {ini}.
  3. Hapus centang pada kotak "Lanjutkan Eksekusi" untuk mendapatkan kode break pada baris ini, seperti breakpoint biasa
  4. Anda memiliki opsi untuk menjalankan makro. Harap berhati-hati - Anda dapat menyebabkan efek samping yang berbahaya.

Lihat dokumentasi untuk lebih jelasnya.


24

Ada beberapa cara untuk menulis output dari tes unit Visual Studio di C #:

  • Console.Write - Harness tes Visual Studio akan menangkap ini dan menunjukkannya ketika Anda memilih tes di Test Explorer dan klik tautan Output. Apakah tidak muncul dalam Output Jendela Visual Studio ketika salah menjalankan atau debug tes unit (bisa dibilang ini adalah bug).
  • Debug.Write - Harness tes Visual Studio akan menangkap ini dan menunjukkannya dalam output tes. Apakah muncul di Visual Studio Output Window ketika men-debug unit test, kecuali opsi Visual Studio Debugging dikonfigurasi untuk mengarahkan Output ke Window Segera. Tidak ada yang akan muncul di Jendela Output (atau Segera) jika Anda hanya menjalankan tes tanpa debugging. Secara default hanya tersedia di Debug build (yaitu, ketika DEBUG konstan didefinisikan).
  • Trace.Write - Harness tes Visual Studio akan menangkap ini dan menunjukkannya dalam output tes. Apakah muncul di Jendela Visual Studio Output (atau Segera) ketika debugging tes unit (tetapi tidak ketika hanya menjalankan tes tanpa debugging). Secara default tersedia di Debug dan rilis build (yaitu, ketika TRACE konstan didefinisikan).

Dikonfirmasi dalam Visual Studio 2013 Professional.


1
Perhatikan bahwa aturannya sedikit berbeda jika Anda menggunakan NUnit dan ekstensi Adaptor Tes NUnit untuk Visual Studio daripada kerangka kerja pengujian Microsoft bawaan.
yoyo

9

Kamu bisa memakai

Trace.WriteLine()

untuk menulis ke jendela Output saat men-debug unit test.


5

Di Visual Studio 2017, "TestContext" tidak menampilkan tautan Output ke Test Explorer.

Namun, Trace.Writeline () menunjukkan tautan Keluaran.


Hanya FYI, Trace.WriteLine
TroySteven

4

Pertama-tama unit test, menurut desain , seharusnya berjalan sepenuhnya tanpa interaksi.

Dengan mengesampingkan itu, saya tidak berpikir ada kemungkinan yang dipikirkan.

Anda bisa mencoba meretas dengan P / Invoke AllocConsole yang akan membuka konsol bahkan ketika aplikasi Anda saat ini adalah aplikasi GUI. The Consolekelas maka akan posting ke konsol sekarang dibuka.


1
Hmm .. Motif utama saya adalah menulis beberapa data tambahan untuk menghibur untuk melihat beberapa detail yang lebih dalam. Itu akan menjadi hal adhoc yang mungkin tidak saya butuhkan nanti.
pencilCake


2

IMHO, pesan keluaran hanya relevan untuk kasus pengujian yang gagal dalam kebanyakan kasus. Saya membuat format di bawah ini, dan Anda juga bisa membuatnya sendiri. Ini ditampilkan di Visual Studio Test Explorer Window itu sendiri.

Bagaimana kita bisa membuang pesan ini di Jendela Visual Studio Test Explorer?

Kode contoh seperti ini seharusnya berfungsi:

if(test_condition_fails)
    Assert.Fail(@"Test Type: Positive/Negative.
                Mock Properties: someclass.propertyOne: True
                someclass.propertyTwo: True
                Test Properties: someclass.testPropertyOne: True
                someclass.testPropertyOne: False
                Reason for Failure: The Mail was not sent on Success Task completion.");

Anda dapat memiliki kelas terpisah yang didedikasikan untuk ini untuk Anda.


Saya pikir saya akan menambahkan ini juga. Dalam Visual Studio 2019 menggunakan XUNIT Anda dapat melakukan hal berikut: Assert.True (sukses, "DELETE RECORD FAILED"); HAPUS RECORD FAILED kemudian akan muncul di VS 2019 Test Explorer. Sekali lagi, seperti jawaban di atas, ini hanya berfungsi ketika unit test Anda gagal dalam kondisi yang diharapkan.
TroySteven

1

Saya punya solusi yang lebih mudah (yang saya gunakan sendiri baru-baru ini, untuk sejumlah alasan malas). Tambahkan metode ini ke kelas tempat Anda bekerja:

public static void DumbDebug(string message)
{
    File.WriteAllText(@"C:\AdHocConsole\" + message + ".txt", "this is really dumb. I wish Microsoft had more obvious solutions to its solutions problems.");
}

Kemudian ... buka direktori AdHocConsole, dan pesan berdasarkan waktu yang dibuat. Pastikan ketika Anda menambahkan 'pernyataan cetak' Anda. Mereka berbeda, kalau tidak akan ada juggling.


0

Visual Studio Untuk Mac

Tidak ada solusi lain yang bekerja pada Visual Studio untuk Mac

Jika Anda menggunakan NUnit , Anda dapat menambahkan .NET Proyek Konsol kecil ke solusi Anda, dan kemudian merujuk proyek yang ingin Anda uji dalam Referensi Proyek Konsol baru itu .

Apa pun yang Anda lakukan dalam [Test()]metode Anda dapat dilakukan di Mainaplikasi konsol dengan cara ini:

class MainClass
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Console");

        // Reproduce the unit test
        var classToTest = new ClassToTest();
        var expected = 42;
        var actual = classToTest.MeaningOfLife();
        Console.WriteLine($"Pass: {expected.Equals(actual)}, expected={expected}, actual={actual}");
    }
}

Anda bebas untuk menggunakan Console.Writedan Console.WriteLinedalam kode Anda dalam keadaan ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.