Bir birim testinden nasıl çıktı yazabilirim?


113

Birimimdeki herhangi bir çağrı, hata ayıklama sırasında ya Debug.Write(line)da Console.Write(Line)basitçe atlanır ve çıktı asla yazdırılmaz. Kullandığım sınıfların içinden bu işlevlere yapılan çağrılar iyi çalışıyor.

Birim testinin otomatik olması gerektiğini anlıyorum, ancak yine de bir birim testinden mesaj çıktısı alabilmek istiyorum.

Yanıtlar:


128

Kullanmayı dene TestContext.WriteLine()Test sonuçlarında hangi çıktı metnini .

Misal:

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

"Sihir", MSDN'de "Test çerçevesi, daha sonra birim testlerinde kullanabileceğiniz özelliği otomatik olarak ayarlar " olarak tanımlanır .


7
(VS2013 ile) bunun yalnızca test hata ayıklama modunda çalıştırıldığında bir şey yazdırdığını buldum.
fusi

3
Görünüşe göre TestContext'i kullanmak VS2015 Enterprise'ı (veya önceki sürümlerin premium sürümlerini) gerektiriyor, bu dokümantasyona
Patrick Steadman

Eğer dizinizde küme parantezleri varsa, yöntemin patladığını fark ediyorum. Yani "_testContext.WriteLine (" merhaba ");" çalışır ancak "_testContext.WriteLine (" he {ll} o ");" "System.FormatException: Girdi dizesi doğru biçimde değil." ile başarısız olur.
Mike K

1
TestContext'teki WriteLine yöntemi, Console.WriteWriteLine'ın aldığı aynı parametreleri alır. Bu, dizenin bir biçimlendirme dizesi olduğu anlamına gelir ( docs.microsoft.com/en-us/dotnet/standard/base-types/… adresinde belgelenmiştir ). Bir dizede değişmez {kullanmak için, onu ikiye katlamanız gerekir. Dizinizi yazdırmak için WriteLine ("he {{ll}} o") kullanın;
Walter

1
bu ilginçti ... yine de neden bu ve benzer özellikleri, kafa karışıklığını önlemek için çerçeveden kullanabileceğimiz bir temel sınıfa veya arayüze eklemediklerini bilmiyorum.
Niklas

149

Birim testinde çalışmak için Debug veya Trace veya Console veya TestContext almaya da çalışıyordum.

Bu yöntemlerden hiçbiri çıktı penceresinde çalışmıyor veya çıktıyı gösteriyor görünmüyordu:

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

Visual Studio 2012 ve üzeri

(yorumlardan) Visual Studio 2012'de simge yoktur. Bunun yerine, test sonuçlarında Çıktı adlı bir bağlantı vardır . Bağlantıya tıklarsanız, tüm WriteLine.

Visual Studio 2012'den önce

Daha sonra Test Sonuçları penceremde, testi çalıştırdıktan sonra küçük yeşil yeşil dairenin yanında başka bir simge olduğunu fark ettim . Tıkladım iki katına çıktım. Test sonuçlarımdı ve yukarıdaki tüm yazı türlerini içeriyordu.


44
Visual Studio 2012'de simge yoktur. Bunun yerine, test sonuçlarında "Çıktı" adlı bir bağlantı vardır. Bağlantıya tıklarsanız, tüm yazıları görürsünüz.
epotter

16
Tanrım, bu "Çıktı" bağlantısını bulmak aslında çok zor. Herhangi biri onu bulmakta zorlanıyorsa, Metin Gezgini, alt bölümdedir. Bir test seçildiğinde, size sonucu "Geçen süre: xxx" ile gösterir. Bunun altında "Çıktı" bağlantısı var.
kevin

@kevin, bunu VS'nin hangi versiyonunda gördün? ("Metin Gezgini" yerine "Test Gezgini" ni kastettiğinizi varsayıyorum.) VS2013 express'te bir Çıktı bağlantısı göremiyorum.
Mike C

1
Eğer birisi (benim gibi) bunlardan hangisinin bir TRX (test sonuçları çıktısı) dosyasında göründüğünü merak ederse, "Debug.WriteLine" dışında hepsi yukarıdakilerdir.
Badgerspot

4
Visual Studio 2017'de hala 'Çıktı' bağlantısıdır.
HankCa

66

Visual Studio 2017'de, test gezgininin çıktısını görebilirsiniz.

1) Test yönteminizde, Console.WriteLine ("bir şey");

2) Testi çalıştırın.

3) Test Gezgini penceresinde, Başarılı Test Yöntemine tıklayın.

4) Ve "Çıktı" bağlantısını tıklayın.

görüntü açıklamasını buraya girin

Ve "Çıktı" üzerine tıklayın, Console.Writeline () sonucunu görebilirsiniz. görüntü açıklamasını buraya girin


1
Mükemmel. Visual Studio / C # geliştirme için normum değil, bu sadece ihtiyacım olan şey! Bunu gönderdiğiniz için teşekkürler.
matt32

10
2017 Sürüm 15.5.6 kullanıyorum Bit O çıktı bağlantısını görmüyor.
Mike IT

1
Hangi test çerçevesinin kullanımda olduğuna bağlı mı? Bir .NET 4.6 test projesinde xUnit 2.4 kullanıyorum ve "Standart Çıktı" bölmesi görünmüyor. Gelen çıkış Console.WriteLineya da "Testler" altında çıkış bölmesinde görünür değil.
Qwertie

XUnit için jonzim'in cevabı, testte ortaya çıkan farklı bir iş parçacığında bile benim için çalıştı.
Qwertie

1
"Çıktı" bağlantısını görmeyenler için. 1) Bir test yöntemi seçmelisiniz . 2) Test Gezgini penceresinin VS penceresini dikey olarak doldurmasına izin verin, aksi takdirde bağlantı gizlidir ve kaydırma çubuğu fark edilemeyecek veya kullanılamayacak kadar küçüktür.
Meow Cat 2012

18

Bu, test çalıştırıcınıza bağlıdır ... örneğin, xUnit kullanıyorum , bu yüzden kullanıyorsanız, şu talimatları izleyin:

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

Bu yöntem, çıktınızı her belirli birim testiyle gruplandırır.

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

Çıktı pencerenize yazmak için sağladığım bağlantıda listelenen başka bir yöntem var, ancak öncekini tercih ediyorum.


4

Hala gerçek olduğunu düşünüyorum.

Bu NuGet paketini kullanabilirsiniz: Bitoxygen.Testing.Pane

Bu kitaplıktan özel WriteLine yöntemini çağırın . Çıktı penceresi içinde bir Test bölmesi oluşturur ve mesajları her zaman oraya koyar (her test sırasında, DEBUG ve TRACE bayraklarından bağımsız olarak çalışır).

İzlemeyi daha kolay hale getirmek için bir temel sınıf oluşturmanızı önerebilirim:

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

1
Sihir şudur: Output.Testing.Trace.WriteLine (mesaj); BitOxygen ile.
Bimal Poudel

Geçerli Visual Studio sürümüyle çalışmıyor, bir hata alıyorsunuzCould not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
Konsol

@Console Evet, biraz desteğe ihtiyacı var, ancak topluluğun bu şekilde çıktı almak için ilginç olup olmadığından emin değilim. xUnit, OutputHandler'a sahiptir ve VS sonucunu gösterebilir.
Maxim

1

Şunları kullanmayı deneyin:

Console.WriteLine()

İçin çağrı Debug.WriteLineyalnızca DEBUG tanımlandığında yapılacaktır.

Diğer öneriler de şunları kullanmaktır Trace.WriteLine, ancak bunu denemedim.

Ayrıca bir seçenek de vardır (Visual Studio 2008'de olup olmadığından emin değilsiniz), ancak Debug.WriteLinetesti Test With DebuggerIDE'de seçenekle çalıştırdığınızda yine de Kullanabilirsiniz .


1

Aşağıdaki örnekle çözüldü:

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

Bu testi çalıştırdıktan sonra, 'Test Geçti' altında, çıktı penceresini açacak olan çıktıyı görüntüleme seçeneği vardır.


1

@Jonzim'in de bahsettiği gibi test koşucusuna bağlıdır. NUnit 3 için NUnit.Framework.TestContext.Progress.WriteLine(), Visual Studio 2017'nin Output penceresinde çalışan çıktı almak için kullanmak zorunda kaldım.

NUnit nasıl yapılacağını açıklar: burada

Anladığım kadarıyla bu, test koşucularının aldığı ilave test yürütme paralelliği etrafında dönüyor.


0

Test / Test Ayarları / Varsayılan İşlemci Mimarisi ayarım ve test projemin referans verdiği derlemeler aynı olmadığında çıktı alamıyorum. Aksi takdirde Trace.Writeline () iyi çalışıyor.


0

Console.WriteLine çalışmaz. Hata ayıklama modunda yalnızca Debug.WriteLine () veya Trace.WriteLine () çalışacaktır.

Aşağıdakileri yapıyorum: Test modülünde System.Diagnostics kullanmayı dahil ediyorum . Ardından, çıktım için Debug.WriteLine kullanın, teste sağ tıklayın, Debug Selected Tests'i seçin . Sonuç çıktısı şimdi aşağıdaki Çıktı penceresinde görünecektir. VS'nin sağladığı varsayılan birim testi çerçevesiyle Visual Studio 2017 vs 15.8.1 kullanıyorum.


0

Birim testlerinizi Debug'da çalıştırdığınızdan emin misiniz? Debug.WriteLine , Sürüm yapılarında çağrılmayacak.

Deneyebileceğiniz iki seçenek şunlardır:

  • Trace.WriteLine (), sürüm yapılarında yerleşiktir ve hata ayıklama

  • Birim testi için derleme ayarlarınızda hata ayıklamayı tanımlayın


0

XUnit kullanıyorum , bu yüzden kullandığım şey bu:

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

Not: Siz de kullanabilirsiniz Debugger.Break();, böylece girişinizi görebilirsiniz out.


Bu " out" nedir?
Peter Mortensen

0

Nedenin / çözümün farklı bir çeşidi:

Sorunum, sonuç kümesini eşzamansız bir LINQ çağrısından konsola bir döngüde eşzamansız bağlamda yazdığım için çıktı alamamaktı:

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

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

Ve bu nedenle, konsol nesnesi çalışma zamanı tarafından temizlenmeden önce test konsola yazmıyordu (yalnızca bir test çalıştırılırken).

Çözüm, önce sonuç kümesini bir listeye dönüştürmekti, böylece forEach () öğesinin eşzamansız olmayan sürümünü kullanabilirim:

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

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

0

In VS 2019

  1. ana VS menü çubuğunda şunu tıklayın: View->Test Explorer
  2. Test Gezgini'nde test yönteminize sağ tıklayın -> Hata Ayıkla
  3. additional outputAşağıdaki ekran görüntüsünde görüldüğü gibi bağlantıya tıklayın .

görüntü açıklamasını buraya girin

Kullanabilirsiniz:

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

tümü ek çıktı penceresine kaydedilecektir.


-1

Trace.WriteLineDoğru çıktıyı seçmeniz koşuluyla çalışmalıdır ( Çıktı penceresinde bulunan "Çıktıyı göster" etiketli açılır menü ).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.