MSTest testinin yürütülmesi sırasında Console.Out'a nasıl yazılır


114

Bağlam:
Web uygulamamızdaki dosya yükleme özelliğiyle ilgili sorunları bildiren bazı kullanıcılarımız var. Sadece ara sıra ve herhangi bir özel model olmadan olur. Uzun zamandır bunu anlamaya çalışıyoruz, yardımcı olabileceğini düşündüğümüz her yere hata ayıklama bilgisi ekliyoruz, günlükleri tarıyoruz, ancak bunları yeniden üretemedik veya çözemedik.

Sorun:
Şimdi bunu, çok sayıda (birkaç yüz) başarısız olması beklenen işlemi tekrar etmek için MSTest ve WatiN kullanarak yeniden oluşturmaya çalışıyorum. Testin döngüde ne kadar ilerlediğine dair bir ipucuna sahip olmak için, şöyle bir şey yazdırmak istiyorum:

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

Ancak bu, Çıktı penceresinde görünmez. Artık test sonuçlarında konsol çıktısını alacağınızı biliyorum (ve ayrıcaDebug.Writeline vb), ancak bu kadar kullanılamaz sonra testi tamamladı. Yüzlerce tekrarlı testim biraz zaman alabileceğinden, ne kadar ileri gittiğini bilmek isterim.

Soru: Test yürütme sırasında
Çıkış penceresinde konsol çıktısını almanın bir yolu var mı?


Test sonucu çıktısını yazdırmanın bir yolunu
arıyorsanız

Yanıtlar:


111

Konsol çıktısının görünmemesinin nedeni, arka uç kodunun test bağlamında çalışmamasıdır.

Muhtemelen Trace.WriteLine(In System.Diagnostics) kullanarak ve ardından bir dosyaya yazan bir izleme dinleyicisi eklemeniz daha iyidir .

MSDN'deki bu konu , bunu yapmanın bir yolunu gösterir.


Marty Neal ve Dave Anderson'ın yorumlarına göre:

using System;
using System.Diagnostics;

...

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

73
temelde, Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Neal

7
Hmmm, ben @Martin Neal tarafından öneri hem gönderdiği buluyorum Trace.WriteLine()ve Console.WriteLine()çıkış Testi Görünümü Sonuçlar , değil Çıktı Görünümü . (Ve o notu Testi Görünüm Sonuçları , o eklemek gerekebilir Çıktı (Stdout) sağ tıklayarak ve seçerek sütun Ekle / Kaldır Sütun ... .) Fakat, belki hala içinde çıktı göremiyorum Çıktı Görünüm , bir şeyi kaçırdığım anlamına geliyor ...
DavidRR

3
Trace.Listeners.Add(new ConsoleTraceListener());yeterlidir ve sonra Debug'dan çıktıyı çıktı penceresinde göster.
Dave Anderson

3
Çıktıyı VS2017'de gerçekten bulmakta zorlanıyordum ... TestExplorer penceresi -> Bireysel bir teste tıklayın -> Test çıktıysa, detay penceresinde geçen sürenin altındaki "çıkış" kelimesi var yeni bir pencere.
Mike Walsh

2
Xunit kullanıyorsanız, sadece ITestOutputHelper'ı ctor aracılığıyla girin ve WriteLine'ı arayın. Entegrasyon testi sırasında nasıl yazacağımı bulmadan önce biraz zaman aldı, umarım bu birisine yardımcı olur.
Alexander Høst

69

Kullanın Debug.WriteLine. Bu, mesajınızı Outputhemen pencerede gösterecektir . Tek kısıtlama, testinizi Debugmodda çalıştırmanız gerektiğidir .

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

Çıktı

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


8
gerektirirusing System.Diagnostics;
2013

5
DateTime.Now'u kullanmayın. Kronometreyi kullanmak daha iyidir ( msdn.microsoft.com/en-us/library/… )
suizo

1
Bunu çalıştıramadım. Testi çalıştırdığımda Çıktı Penceresi hemen Derlemeye geçiyor ve Hata Ayıklama'ya hiçbir şey gönderilmiyor. Senin düşüncelerin?
InteXX

5
@InteXX "Testi çalıştır" a değil "Testte hata ayıkla" yı tıkladığınızdan emin olun. benim için çalıştı
John Henckel

@JohnHenckel: Yakaladım. Teşekkürler. Bunu yapacak. Aslında Schaliasos cevabında tam olarak bunu söylüyor; nasıl özlediğimden emin değilim.
InteXX

13

Kendime bir çözüm buldum. Andras cevabının muhtemelen MSTEST ile en tutarlı olduğunu biliyorum, ancak kodumu yeniden düzenlemek istemedim.

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

Tek kullanımlık ürün ConsoleRedirectorşu şekilde tanımlanır:

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

Aynı sorunu yaşadım ve testleri "çalıştırıyordum". Bunun yerine "Hata Ayıkla" yaparsam, Testler Hata Ayıklama çıktısı diğer tüm İzleme ve Konsol gibi gayet iyi gösterir. Testleri "Çalıştırırsanız" çıktıyı nasıl göreceğimi bilmiyorum.


System.Diagnostics.Debug.WriteLineTestleri hata ayıklarken kullanarak gösterecek bir şey bulabilirim , ancak Console.WriteLineişe nasıl başlayacaksınız? Bu benim için normal (canlı güncellenen) çıktıda bitmiyor.
VEYA Mapper

Testleri çalıştırırken çıktıları görmenin herhangi bir yolunu buldunuz mu?
hima

0

Tek bir test kurmanız ve bu testten bir performans testi oluşturmanız daha iyi olur. Bu şekilde, varsayılan araç setini kullanarak ilerlemeyi izleyebilirsiniz.


"Bu şekilde, varsayılan araç setini kullanarak ilerlemeyi izleyebilirsiniz." - Nasıl? Gördüğüm sorun, tam olarak bir test çalıştığında, bunun bir kara kutu olması ve çıktıyı (test çalışırken aşamalı olarak yazdığım) yalnızca testin çalışması bittikten sonra Çıktı penceresinde görüyorum. .
VEYA Eşleştirici

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.