Bagaimana cara menulis keluaran dari pengujian unit?

113

Setiap panggilan dalam pengujian unit saya ke salah satu Debug.Write(line)atau Console.Write(Line)hanya dilewati saat debugging dan hasilnya tidak pernah dicetak. Panggilan ke fungsi ini dari dalam kelas yang saya gunakan berfungsi dengan baik.

Saya memahami bahwa pengujian unit dimaksudkan untuk dilakukan secara otomatis, tetapi saya masih ingin dapat mengeluarkan pesan dari pengujian unit.

Chris
sumber

Jawaban:

128

Coba gunakan TestContext.WriteLine()teks keluaran mana dalam hasil tes.

Contoh:

    [TestClass]
    public class UnitTest1
    {
        private TestContext testContextInstance;

        /// <summary>
        ///  Gets or sets the test context which provides
        ///  information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get { return testContextInstance; }
            set { testContextInstance = value; }
        }

        [TestMethod]
        public void TestMethod1()
        {
            TestContext.WriteLine("Message...");
        }
    }

"Ajaib" dideskripsikan di MSDN sebagai "Kerangka pengujian secara otomatis menyetel properti, yang kemudian dapat Anda gunakan dalam pengujian unit."

frennky
sumber
7
Saya telah menemukan (dengan VS2013) bahwa ini hanya mencetak sesuatu jika tes dijalankan dalam mode debug.
fusi
3
Tampaknya menggunakan TestContext membutuhkan VS2015 Enterprise (atau versi premium dari edisi sebelumnya), menurut dokumentasi ini
Patrick Steadman
Saya memperhatikan bahwa jika string Anda memiliki kurung kurawal di dalamnya, metode ini meledak. Jadi "_testContext.WriteLine (" hello ");" berfungsi tetapi "_testContext.WriteLine (" he {ll} o ");" gagal dengan "System.FormatException: String input tidak dalam format yang benar."
Mike K
1
Metode WriteLine di TestContext menggunakan parameter yang sama dengan yang diambil oleh Console.WriteWriteLine. Itu berarti bahwa string tersebut adalah string pemformatan (didokumentasikan di docs.microsoft.com/en-us/dotnet/standard/base-types/… ). Untuk menggunakan literal {dalam string, Anda perlu menggandakannya. Untuk mencetak string Anda, gunakan WriteLine ("he {{ll}} o");
Walter
1
ini menarik ... meskipun saya masih tidak tahu mengapa mereka tidak menambahkan ini dan fitur serupa ke kelas dasar atau antarmuka yang dapat kami gunakan dari kerangka kerja untuk menghindari kebingungan.
Niklas
149

Saya juga mencoba untuk mendapatkan Debug atau Trace atau Console atau TestContext untuk bekerja dalam pengujian unit.

Tak satu pun dari metode ini yang tampak berfungsi atau menampilkan keluaran di jendela keluaran:

    Trace.WriteLine("test trace");
    Debug.WriteLine("test debug");
    TestContext.WriteLine("test context");
    Console.WriteLine("test console");

Visual Studio 2012 dan yang lebih baru

(dari komentar) Dalam Visual Studio 2012, tidak ada ikon. Sebagai gantinya, ada tautan dalam hasil pengujian yang disebut Output . Jika Anda mengklik link tersebut, Anda akan melihat semua file WriteLine.

Sebelum Visual Studio 2012

Saya kemudian melihat di jendela Hasil Tes saya , setelah menjalankan tes, di sebelah lingkaran hijau kecil yang sukses , ada ikon lain. Saya klik dua kali lipat. Itu adalah hasil tes saya, dan itu termasuk semua jenis garis tulis di atas.

Yogurt Yang Bijaksana
sumber
44
Di Visual Studio 2012, tidak ada ikon. Sebagai gantinya, ada link dalam hasil tes yang disebut "Output". Jika Anda mengklik link tersebut, Anda akan melihat semua garis tulis.
epotter
16
Ya ampun, tautan "Output" itu secara intrinsik sulit ditemukan. Jika ada yang kesulitan menemukannya, ada di Text Explorer, bagian bawah. Ketika tes dipilih, itu menunjukkan kepada Anda hasil dengan "Waktu berlalu: xxx". Di bawahnya adalah link "Output".
kevin
@ kevin, di versi VS manakah Anda melihatnya? (Saya berasumsi yang Anda maksud adalah "Test Explorer", bukan "Text Explorer.) Saya tidak melihat link Output di VS2013 express.
Mike C
1
Jika ada yang bertanya-tanya (seperti saya) mana yang muncul di file TRX (keluaran hasil tes) maka itu semua di atas kecuali "Debug.WriteLine".
Badgerspot
4
Dalam Visual Studio 2017 ini masih link 'Output'.
HankCa
66

Di Visual Studio 2017, Anda dapat melihat output dari test explorer.

1) Dalam metode pengujian Anda, Console.WriteLine ("sesuatu");

2) Jalankan tes.

3) Di jendela Test Explorer, klik Passed Test Method.

4) Dan klik tautan "Output".

masukkan deskripsi gambar di sini

Dan klik "Output", Anda dapat melihat hasil Console.Writeline (). masukkan deskripsi gambar di sini

monad.gon
sumber
1
Luar biasa. Visual Studio / C # bukan norma saya untuk berkembang, ini hanya keinginan yang saya butuhkan! Terima kasih telah memposting ini.
matt32
10
Saya menggunakan 2017 Versi 15.5.6 Bit O tidak melihat tautan keluaran.
Mike ITU
1
Apakah itu tergantung pada kerangka pengujian mana yang digunakan? Saya menggunakan xUnit 2.4 dalam proyek uji .NET 4.6 dan tidak ada panel "Output Standar" yang muncul. Keluaran dari Console.WriteLinejuga tidak terlihat di panel Keluaran di bawah "Tes".
Qwertie
Untuk xUnit, jawaban jonzim berhasil untuk saya, bahkan di utas berbeda yang dihasilkan oleh pengujian.
Qwertie
1
Bagi mereka yang tidak melihat tautan "keluaran". 1) Anda harus memilih metode pengujian . 2) biarkan jendela Test Explorer mengisi jendela VS secara vertikal jika tidak tautannya disembunyikan dan bilah gulir terlalu kecil untuk diperhatikan atau digunakan.
Kucing Meong 2012
18

Itu tergantung pada pelari pengujian Anda ... misalnya, saya menggunakan xUnit , jadi jika itu yang Anda gunakan, ikuti petunjuk ini:

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

Metode ini mengelompokkan keluaran Anda dengan setiap pengujian unit tertentu.

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

Ada metode lain yang tercantum di tautan yang saya berikan untuk menulis ke jendela Output Anda, tetapi saya lebih suka yang sebelumnya.

jonzim.dll
sumber
4

Saya pikir itu masih aktual.

Anda dapat menggunakan paket NuGet ini: Bitoxygen.Testing.Pane

Panggil metode WriteLine kustom dari pustaka ini. Ini membuat panel Pengujian di dalam jendela Output dan menempatkan pesan di sana selalu (selama setiap pengujian, ini berjalan secara independen dari tanda DEBUG dan TRACE).

Untuk membuat penelusuran lebih mudah, saya dapat merekomendasikan untuk membuat kelas dasar:

[TestClass]
public abstract class BaseTest
{
    #region Properties
    public TestContext TestContext { get; set; }

    public string Class
    {
        get { return this.TestContext.FullyQualifiedTestClassName; }
    }
    public string Method
    {
        get { return this.TestContext.TestName; }
    }
    #endregion

    #region Methods
    protected virtual void Trace(string message)
    {
        System.Diagnostics.Trace.WriteLine(message);

        Output.Testing.Trace.WriteLine(message);
    }
    #endregion
}

[TestClass]
public class SomeTest : BaseTest
{
    [TestMethod]
    public void SomeTest1()
    {
        this.Trace(string.Format("Yeah: {0} and {1}", this.Class, this.Method));
    }
}
Pepatah
sumber
1
Ajaibnya ada di: Output.Testing.Trace.WriteLine (message); dengan BitOxygen.
Bimal Poudel
Tidak bekerja dengan versi Visual Studio saat ini Anda mendapatkan kesalahanCould not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
Konsol
@Console Ya itu membutuhkan beberapa dukungan, tetapi saya tidak yakin apakah komunitas menarik dengan cara ini untuk menghasilkan. xUnit memiliki OutputHandler dan VS dapat menunjukkan hasilnya.
Maxim
1

Coba gunakan:

Console.WriteLine()

Panggilan ke Debug.WriteLinehanya akan dilakukan selama DEBUG ditentukan.

Saran lain adalah untuk digunakan: Trace.WriteLinejuga, tetapi saya belum mencobanya.

Ada juga opsi (tidak yakin apakah Visual Studio 2008 memilikinya), tetapi Anda masih dapat menggunakan Debug.WriteLinesaat Anda menjalankan tes dengan Test With Debuggeropsi di IDE.

VoodooChild
sumber
1

Dipecahkan dengan contoh berikut:

public void CheckConsoleOutput()
{
    Console.WriteLine("Hello, World!");
    Trace.WriteLine("Trace Trace the World");
    Debug.WriteLine("Debug Debug World");
    Assert.IsTrue(true);
}

Setelah menjalankan tes ini, di bawah 'Test Passed', ada opsi untuk melihat output, yang akan memunculkan jendela output.

Mike
sumber
1

Itu memang tergantung pada pelari tes seperti yang disebutkan @jonzim. Untuk NUnit 3 saya harus menggunakan NUnit.Framework.TestContext.Progress.WriteLine()untuk menjalankan output di jendela Output Visual Studio 2017.

NUnit menjelaskan caranya: di sini

Menurut pemahaman saya, ini berkisar pada paralelisasi tambahan dari eksekusi uji yang telah diterima pelari uji.

Pebermynte Lars
sumber
0

Saya tidak mendapatkan output ketika pengaturan Test / Test Settings / Default Processor Architecture dan rakitan yang direferensikan oleh proyek pengujian saya tidak sama. Jika tidak Trace.Writeline () berfungsi dengan baik.

Arthur Greef
sumber
0

Console.WriteLine tidak akan berfungsi. Hanya Debug.WriteLine () atau Trace.WriteLine () yang akan berfungsi, dalam mode debug.

Saya melakukan hal berikut: termasuk menggunakan System.Diagnostics dalam modul uji. Kemudian, gunakan Debug.WriteLine untuk keluaran saya, klik kanan pada pengujian , pilih Debug Selected Tests . Output hasil sekarang akan muncul di jendela Output di bawah ini. Saya menggunakan Visual Studio 2017 vs 15.8.1, dengan kerangka kerja pengujian unit default VS menyediakan.

Goodies
sumber
0

Apakah Anda yakin Anda menjalankan pengujian unit Anda di Debug? Debug.WriteLine tidak akan dipanggil dalam build Rilis.

Dua opsi untuk dicoba adalah:

  • Trace.WriteLine (), yang dibangun ke dalam build rilis serta debug

  • Batalkan definisi DEBUG di setelan build Anda untuk pengujian unit

Jason Williams
sumber
0

Saya menggunakan xUnit jadi inilah yang saya gunakan:

Debugger.Log(0, "1", input);

PS: Anda juga bisa menggunakan Debugger.Break();, jadi Anda bisa melihat login Anda out.

Ivandro IG Jao
sumber
Apa ini " out"?
Peter Mortensen
0

Varian lain dari penyebab / solusi:

Masalah saya adalah bahwa saya tidak mendapatkan keluaran karena saya menulis hasil yang ditetapkan dari panggilan LINQ asinkron ke konsol dalam satu lingkaran dalam konteks asinkron:

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345");

p.ForEachAsync(payment => Console.WriteLine(payment.Amount));

Sehingga pengujian tidak menulis ke konsol sebelum objek konsol dibersihkan oleh runtime (saat menjalankan hanya satu pengujian).

Solusinya adalah mengonversi kumpulan hasil ke daftar terlebih dahulu, jadi saya bisa menggunakan versi non-asinkron forEach ():

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345").ToList();

p.ForEachAsync(payment =>Console.WriteLine(payment.Amount));
Richard Strickland
sumber
0

Di VS 2019

  1. di bilah menu utama VS klik: View->Test Explorer
  2. Klik kanan metode pengujian Anda di Test Explorer -> Debug
  3. Klik additional outputtautan seperti yang terlihat pada gambar di bawah.

masukkan deskripsi gambar di sini

Kamu bisa memakai:

  • Debug.WriteLine
  • Console.WriteLine
  • TestContext.WriteLine

semua akan masuk ke jendela keluaran tambahan.

Legenda
sumber
-1

Trace.WriteLineseharusnya berfungsi asalkan Anda memilih output yang benar (dropdown berlabel "Show output from" ditemukan di jendela Output ).

Peter Mortensen
sumber