Laden...

Async Unit Test mit await wird nicht im Test Explorer angezeigt

Erstellt von #1pCH vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.567 Views
#
#1pCH Themenstarter:in
2 Beiträge seit 2015
vor 9 Jahren
Async Unit Test mit await wird nicht im Test Explorer angezeigt

Hallo Zusammen

Im Zuge eines privaten Bastelprojektes habe ich mich mit Async und Unit Tests befasst und bin dabei auf ein Problem gestossen. Bzw. eine Situation welche ich einfach nicht verstehe. Ich habe das Problem mal so weit wie möglich heruntergebrochen. Irgendwie stehe ich gerade ein bisschen auf dem Schlauch oder sehe den Wald vor lauter Bäumen nicht?!

Zum Problem:
Ich habe zwei async Unit Tests mit await, wovon allerdings nur einer im Test Explorer von VS2013 gelistet wird. Obwohl, meiner Meinung nach, die Tests "das selbe machen bzw. identisch sind".
Ich komme auch nach intensiver Suche nicht darauf was das Problem ist. Ich denke hier kann mich sicher jemand in die richtige Richtung schicken…?

Folgende Referenzen sind im Projekt:

  • NUnit V.2.6.4.14350
  • NUnit.VisualStudio.TestAdapter V.1.2.0.0

Gruss
#1pCH

Klassen in der ClassLibrary1


 public class CustomClient
    {
        public async Task<int> GetDataAsync()
        {
            int data = 4 + 1;
            return data;
        }

        public async Task<CustomClass> GetCustomDataAsync()
        {
            CustomClass data = new CustomClass();
            return data;
        }
    }


    public class CustomClass
    {
    }

Unit Test in der UnitTests ClassLibrary


[TestFixture]
    public class CustomClientUnitTests
    {

        [Test]
        public async Task TestListedInTestExplorer()
        {
            CustomClient sut = new CustomClient();
            var result = await sut.GetDataAsync();
            Assert.That(result, Is.EqualTo(6));
        }

        [Test]
        public async Task Test_NOT_ListedInTestExplorer()
        {
            CustomClient sut = new CustomClient();
            var result = await sut.GetCustomDataAsync();
            Assert.That(true, Is.False);
        }

    }

2.080 Beiträge seit 2012
vor 9 Jahren

Lass doch das await weg, nimm dir das Task-Objekt und warte mit der Wait-Methode?

await brauchst du hier gar nicht, Visual Studio ruft die sowieso parallel auf.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

16.842 Beiträge seit 2008
vor 9 Jahren

Deine CustomClient-Klasse ist nicht wirklich async. Nur weil das Wort davor steht heisst das noch lange nicht, dass das dann auch asynchron ist.
Visual Studio sollte Dir hier auch einen Hint anzeigen, dass es am Wort "await" mangelt.

Es macht kein Sinn hier GetData als Async zu definieren; aber der Vollständigkeit halber:

    
        public Task<int> GetDataAsync( ) // Denkt dran: wird nicht asynchron ausgeführt
        {
            return Task.Run( ( ) =>
            {
                int data = 4 + 1;
                return data;
            } );

        }

        public async Task Do( )
        {
            var val = await GetDataAsync( ); // hier erfolgt nun die asynchrone Ausführung.
            Console.WriteLine( "Value: " + val );
        }

Und für die UnitTests einfach das await weglassen und mit Wait() arbeiten.

#
#1pCH Themenstarter:in
2 Beiträge seit 2015
vor 9 Jahren

Hallo Palladin007
Besten Dank für deine Antwort.
Was ich bereits versucht habe:


[Test]
        public async Task Test_NOT_ListedInTestExplorer()
        {
            CustomClient sut = new CustomClient();
            var resultTask = sut.GetCustomDataAsync();
            var result = resultTask.Result;
            Assert.That(true, Is.False);
        }

Der Unit Tests wird danach auch im Test Explorer angezeigt. Allerdings sollte es ja so genau nicht sein. Der Vorteil ist ja, dass in async Unit Tests, wie im „normalen“ Code, mit async/await gearbeitet werden kann.
Das entspricht alles mehr einem Workaround, als einer Lösung und beantwortet auch nicht die eigentliche Frage. Er erschliesst sich mir nicht, warum der Unit Test 1 angezeigt wird und der Unit Test 2 nicht?

Hallo Abt
Danke für dein Feedback.
Ich habe meinen Code auch stark reduziert um das Problem aufzuzeigen, ohne unnötigen Code. Die CustomClient Klasse ist nur ein Platzhalter, die eigentliche Klasse hat ein paar Zeilen mehr (async) Code. Die Methoden im CustomClient sind als async markiert, auch wenn in diesem Beispiel die Verarbeitung synchron ist (was, wie du angemerkt hast, VS auch als Warnung anzeigt).

Ich habe bereits ein paar Unit Tests mit dem „Workaround“ gemacht, allerdings hinterlässt es ein schlechtes Gefühl.
Und nicht zu wissen warum der zweite Unit Test nicht angezeigt wird lässt mir einfach keine Ruhe. Idee? Input? Anmerkungen?

Gruss
#1pCH