Ünite testinde konsola yazabilir miyim? Evet ise, konsol penceresi neden açılmıyor?


148

Visual Studio'da bir test projem var. Kullandığım Microsoft.VisualStudio.TestTools.UnitTesting .

Bu satırı birim testlerimden birine ekliyorum:

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

Testi çalıştırdığımda test geçer, ancak konsol penceresi hiç açılmaz.

Konsol penceresinin bir birim testi ile etkileşime girmesini sağlamanın bir yolu var mı?


1
Gerçekten koşucu bağlıdır. TestDriven.Net (harika, kişisel kullanım için ücretsiz, test çalıştırıcısı) kullanabilirsiniz - Console.WriteLine VS çıkış bölmesine yazacaktır.
seçkin

1
TestDriven.Net
GrayFox374

NCrunch ayrıca tek başına fiyat IMO'su yapan bu özelliğe sahiptir. DumpNesnenin içeriğini konsola çıktılar, bir şeyleri hata ayıklamak çok daha kolay hale getiren bir uzantı yöntemi var. i.imgur.com/MEZwy7X.png
DharmaTurtle

Yanıtlar:


125

Not: aşağıdaki özgün yanıt, Visual Studio 2012 ile Visual Studio'nun herhangi bir sürümü için çalışması gerekir. Visual Studio 2013, bir Test Sonuçları penceresi artık görünmüyor. Bunun yerine, teste özel çıktıya ihtiyacınız varsa Trace.Write(), Çıktı penceresine çıktı yazmak için @ Stretch'in önerisini kullanabilirsiniz .


Console.WriteYöntemi "konsola" yazmaz - Çalışıyorsa süreci için standart çıktı koluna kanca kadar ne olursa olsun yazar. Benzer şekilde, Console.Readstandart girişe bağlanan her şeyden girişi okur.

Bir birim sınamasını Visual Studio 2010 aracılığıyla çalıştırdığınızda, standart çıktı sınama kablo demeti tarafından yeniden yönlendirilir ve sınama çıktısının bir parçası olarak saklanır. Bunu Test Sonuçları penceresine sağ tıklayıp "Çıktı (StdOut)" adlı sütunu ekrana ekleyerek görebilirsiniz. Bu, standart çıktıya yazılan her şeyi gösterir.

Sen olabilir elle kullanarak, bir konsol penceresi açmak P / Invoke olarak sinni800 diyor . AllocConsoleBelgeleri okuduktan sonra , işlevin sıfırlanacağı stdinve stdoutyeni konsol penceresini işaret edecek şekilde işlendiği anlaşılmaktadır . (Bundan% 100 emin değilim; stdoutWindows'un bunu benden çalması için yönlendirdiysem benim için yanlış görünüyor , ama denemedim.)

Genel olarak, bunun kötü bir fikir olduğunu düşünüyorum; Konsolu kullanmak istediğiniz tek şey birim testiniz hakkında daha fazla bilgi dökmekse, çıktı sizin için oradadır. Olduğunuz şekilde kullanmaya devam Console.WriteLineedin ve bittiğinde Test Sonuçları penceresindeki çıktı sonuçlarını kontrol edin.


Bir konsol ayırmak için AllocConsole kullanarak yeni bir WindowsApplication açmayı deneyin ve orada yazacaktır. Gerçekten ne yaptığını bilmiyorum ama Birim Test ortamında çalışmayabilir. Gerçekten bilmek güzel olurdu ...
sinni800

hrm. AllocConsolebelgeleri tekrar okuduğumda , yanlış olabilirim, ama test etmek zorundayım.
Michael Edenfield

2
Benim için Michael'ın bu yorumu, düşünmem gereken her şeyi söyledi: "VS2010 aracılığıyla bir birim testi çalıştırdığınızda, standart çıktı test koşumuyla yönlendirilir ve test çıktısının bir parçası olarak saklanır."
Robert Patterson

5
VS2013'te, Konsolda yazmanız durumunda, TestExplorer / Test / Summary üzerinde bir [Output] bağlantı etiketi olacaktır. Üzerine tıklayın ve istediğiniz çıktıyı alın. Bekle? Ayrıca Console.ReadLine () çağırmak istiyorsunuz ??
Visar

3
V2017'de (Topluluk) "test gezgini" ne gidin, listeden test sonucu öğesini seçin, ardından diğer pencerede "çıktı" bağlantısını tıklayın (test sonucu penceresi?). Muhtemelen kısaltılacağından, "tümünü kopyala" yı kullanın ve başka bir yeri geçin.
heringer

181

Birisi Visual Studio 2013'teki bu yeni işlevsellik hakkında yorum yaptı. İlk başta ne demek istediğinden emin değildim, ama şimdi yapıyorum, sanırım kendi cevabını hak ediyor.

Console.WriteLine öğesini normal olarak kullanabiliriz ve çıktı Çıktı penceresinde değil, test ayrıntılarında "Çıktı" yı tıkladıktan sonra yeni bir pencerede görüntülenir.

Resim açıklamasını buraya girin


2
Mükemmel çözüm. VS2015 Enterprise'da çalıştığını onaylayın.
garfbradaz

6
Ne yazık ki, o çıktı alanında kopyala ve yapıştır için herhangi bir metin seçilemiyor :( Ne düşünüyordular ?!
VEYA Haritacı

3
@ ORMapper, "Standart Çıktı" alanına sağ tıklayın ve tümünü
kopyala'yı

2
@ Ovi-WanKenobi Console ile bir şeyler çıkarmayı deneyin.Yorum
Tiago Duarte

5
Vs 2017'de çalıştırılan HER testi seçmelisiniz, sonra çıktıya tıklayın - çok fazla testiniz olduğunda çok kullanışlı değil. Tüm çıktıları birlikte görmek istiyorum - ayrı pencerelerde değil.
inliner49er

37

Visual Studio'nun Çıktı Penceresine yazmak için bu satırı kullanabilirsiniz :

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

Hata Ayıklama modunda çalıştırılmalıdır.


7
VS'mde yazmıyor
Luis Filipe

1
ayrıntılar için bu konuyu kontrol edin - stackoverflow.com/questions/1159755/…
Dmitry Pavlov

1
Bu çıktı görmek için MSTest ve R # kullanarak benim için harika çalıştı. Teşekkürler!
Isaac Baker

2
@Bir testte hata ayıklama yaparsanız görünür, ancak hata ayıklamadan çalıştırırsanız görünmez.
yoyo

29

Belirtildiği gibi, birim testleri etkileşim olmadan çalışacak şekilde tasarlanmıştır.

Ancak, diğer tüm kodlarda olduğu gibi, birim testlerinde hata ayıklayabilirsiniz . En kolay yol, DebugTest Sonuçları sekmesindeki düğmeyi kullanmaktır .

Hata ayıklamak, kesme noktalarını kullanabilmek demektir. Bu durumda kesme noktalarını kullanabilmek , her gün hata ayıklamada son derece yararlı bulduğum Tracepoints'i kullanabilmek anlamına gelir .

Temel olarak, İzleme Noktaları Çıktı penceresine (veya daha doğru bir şekilde standart çıktıya) yazmanıza izin verir . İsteğe bağlı olarak, çalışmaya devam edebilir veya normal bir kesme noktası gibi durabilirsiniz. Bu, kodunuzu yeniden oluşturmanıza veya hata ayıklama bilgileriyle doldurmanıza gerek kalmadan istediğiniz "işlevselliği" sağlar.

Sadece bir kesme noktası ekleyin ve ardından o kesme noktasına sağ tıklayın. "Vurulduğunda ..." seçeneğini belirtin:

Seçeneğe basarken

Hangi iletişim kutusunu getirir:

Bir kesme noktasına çarpıldığında

Unutulmaması gereken birkaç nokta:

  1. Kırılma noktasının, bir iz noktası gösteren küre yerine elmas olarak gösterildiğine dikkat edin.
  2. Bir değişkenin değerini {this} gibi içine alarak çıktı alabilirsiniz.
  3. Kodun bu satırda olduğu gibi, normal bir kesme noktası gibi "Yürütmeye Devam Et" onay kutusunun işaretini kaldırın
  4. Makro çalıştırma seçeneğiniz vardır. Lütfen dikkatli olun - zararlı yan etkilere neden olabilirsiniz.

Daha fazla ayrıntı için belgelere bakın.


24

C # 'da bir Visual Studio birim sınamasından çıktı yazmanın birkaç yolu vardır:

  • Console.Write - Visual Studio test kablo takımı bunu yakalayacak ve Test Gezgini'nde testi seçtiğinizde ve Çıktı bağlantısını tıklattığınızda gösterecektir. Does not ya çalışan veya birim testi ayıklarken Visual Studio Çıktı Penceresi gösterilmesini (belki bu bir hata olduğunu).
  • Debug.Write - Visual Studio test kablo takımı bunu yakalar ve test çıktısında gösterir. Does Visual Studio hata ayıklama seçenekleri komut penceresi yönlendirme Çıktı için yapılandırılmış sürece, bir birim test ayıklarken Visual Studio Çıktı Penceresi görünür. Testi hata ayıklamadan çalıştırırsanız Çıkış (veya Anında) Penceresinde hiçbir şey görünmez. Varsayılan olarak yalnızca bir Debug derlemesinde kullanılabilir (yani, DEBUG sabiti tanımlandığında).
  • Trace.Write - Visual Studio test kablo takımı bunu yakalar ve test çıktısında gösterir. Does Bir birim test ayıklarken (ama sadece ayıklama olmadan testi çalışmadığı zaman) Visual Studio Çıktı (veya komut) Pencere görünür. Varsayılan olarak hem Debug hem de Release derlemelerinde (yani TRACE sabiti tanımlandığında) kullanılabilir.

Visual Studio 2013 Professional'da onaylandı.


1
Visual Studio için yerleşik Microsoft test çerçevesi yerine NUnit ve NUnit Test Bağdaştırıcısı uzantısını kullanırsanız kuralların biraz farklı olduğunu unutmayın.
yoyo

9

Kullanabilirsiniz

Trace.WriteLine()

birim testinde hata ayıklarken Çıktı penceresine yazmak için .


5

Visual Studio 2017'de "TestContext", Test Gezgini'ne Çıkış bağlantısını göstermez.

Ancak Trace.Writeline (), Çıktı bağlantısını gösterir.


Sadece bir FYI, Trace.WriteLine
TroySteven

4

Her şeyden önce, birim testlerin tasarım gereği tamamen etkileşim olmadan çalışması gerekiyordu.

Bu bir yana, düşünülen bir olasılık olduğunu düşünmüyorum.

Mevcut uygulamanız bir GUI uygulaması olsa bile bir konsol açacak olan AllocConsole P / Invoke ile hacklemeyi deneyebilirsiniz . Daha Consolesonra sınıf şimdi açılan konsola mesaj gönderir.


1
Hmm .. Ana amacım, daha derin detayları görmek için konsola fazladan veri yazmak. Daha sonra ihtiyacım olmayan geçici bir şey olacak.
pencilCake


2

IMHO, çıktı mesajları çoğu durumda başarısız test durumları için geçerlidir . Aşağıdaki formatı oluşturdum ve siz de kendi formatınızı oluşturabilirsiniz. Bu, Visual Studio Test Gezgini Penceresinde görüntülenir.

Bu iletiyi Visual Studio Test Gezgini Penceresine nasıl atabiliriz?

Bunun gibi örnek kodların çalışması gerekir:

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

Bunun için size ayrılmış ayrı bir sınıfınız olabilir.


Bunu da ekleyeceğimi düşündüm. XUNIT kullanan Visual Studio 2019'da aşağıdakileri yapabilirsiniz: Assert.True (başarı, "KAYIT BAŞARISIZI SİL"); KAYIT BAŞARISIZLIĞI SİL daha sonra VS 2019 Test Gezgini'nde görünecektir. Yine, yukarıdaki cevap gibi, bu sadece birim testiniz beklenen koşulu geçemediğinde çalışır.
TroySteven

1

Daha kolay bir çözümüm var (son zamanlarda, birçok tembel nedenden dolayı kendimi kullandım). Bu yöntemi çalıştığınız sınıfa ekleyin:

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

Sonra ... AdHocConsole dizinini açın ve oluşturulan zamana göre sıralayın. 'Yazdırma bildirimlerinizi' eklediğinizden emin olun. Gerçi farklılar, başka hokkabazlık olacak.


0

Mac için Visual Studio

Mac için Visual Studio'da çalışan diğer çözümlerin hiçbiri

NUnit kullanıyorsanız , çözümünüze küçük bir .NET Konsol Projesi ekleyebilir ve daha sonra test etmek istediğiniz projeye yeni Konsol Projesinin Referanslarında başvurabilirsiniz .

[Test()]Yöntemlerinizde ne yaparsanız yapın Main, konsol uygulamasında bu şekilde yapılabilir:

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

Sen kullanmakta serbesttirler Console.Writeve Console.WriteLinebu şartlar altında kodunuzda.

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.