Freigeben über


Exemplarische Vorgehensweise: Erstellen und Ausführen von Komponententests für verwalteten Code

Diese exemplarische Vorgehensweise führt Sie durch das Erstellen, Ausführen und Anpassen verschiedener Komponententests mithilfe des Microsoft-Komponententest-Frameworks für verwalteten Code und den Visual Studio-Test-Explorer.Sie beginnen mit einem C#-Projekt in der Entwicklungsphase und erstellen Tests zur Codeüberprüfung. Anschließend führen Sie die Tests aus und überprüfen die Ergebnisse.Dann können Sie Änderungen am Projektcode vornehmen und die Tests erneut ausführen.

Dieses Thema enthält folgende Abschnitte:

Vorbereiten der exemplarischen Vorgehensweise vor

Erstellen Sie ein Komponententestprojekt

Erstellen Sie die Testklasse

Erstellen Sie die erste Testmethode

Erstellen und führen Sie den Test

Korrigieren Sie den Code und überprüfen Sie die Tests

Verwendungskomponententests, um den Code zu verbessern

HinweisHinweis

In dieser exemplarischen Vorgehensweise wird das Microsoft-Komponententest-Framework für verwalteten Code.Test-Explorer kann Tests aus den Drittanbieterkomponententest-frameworks ausführen, die Adapter für Test-Explorer haben.Weitere Informationen finden Sie unter Gewusst wie: Installieren von Frameworks für Komponententests von Drittanbietern

HinweisHinweis

Informationen zum Ausführen von Tests in einer Befehlszeile finden Sie unter Exemplarische Vorgehensweise: Verwenden des Befehlszeilen-Testprogramms.

Vorbereitungsmaßnahmen

Vorbereiten der exemplarischen Vorgehensweise vor

So bereiten Sie die exemplarische Vorgehensweise vor

  1. Öffnen Sie Visual Studio 2012.

  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

    Das Dialogfeld Neues Projekt wird angezeigt.

  3. Klicken Sie unter Installierte Vorlagen auf Visual C#.

  4. Klicken Sie in der Liste der Anwendungstypen auf Klassenbibliothek.

  5. Geben Sie im Feld Name die Bezeichnung Bank ein, und klicken Sie dann auf OK.

    HinweisHinweis

    Wenn der Name "Bank" bereits verwendet wird, wählen Sie einen anderen Namen für das Projekt aus.

    Das neue Bank-Projekt wird erstellt und im Projektmappen-Explorer angezeigt, wobei der Code-Editor mit der Datei Class1.cs geöffnet wird.

    HinweisHinweis

    Wenn die Datei Class1.cs nicht im Code-Editor geöffnet wird, doppelklicken Sie im Projektmappen-Explorer auf die Datei Class1.cs, um diese zu öffnen.

  6. Kopieren Sie den Quellcode aus Beispielprojekt zum Erstellen von Komponententests.

  7. Ersetzen Sie den ursprünglichen Inhalt von Class1.cs mit dem Code aus Beispielprojekt zum Erstellen von Komponententests.

  8. Speichern Sie die Datei als BankAccount.cs

  9. Klicken Sie im Menü Erstellen auf Projektmappe erstellen.

Sie haben nun ein Projekt mit dem Namen Bank erstellt.Dieses Projekt enthält zu testenden Quellcode und Tools, mit denen der Quellcode getestet werden kann.Der Namespace für Bank (BankAccountNS) enthält die öffentliche BankAccount-Klasse, deren Methoden Sie im Folgenden testen werden.

In diesem Schnellstart konzentrieren wir uns auf die Debit-Methode. Die Debit-Methode wird aufgerufen, wenn ein Konto Geld entnommen und den folgenden Code enthält:

// method under test
public void Debit(double amount)
{
    if(amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    m_balance += amount;
}

Erstellen Sie ein Komponententestprojekt

Voraussetzung: Führen Sie die im Vorbereiten der exemplarischen Vorgehensweise-Verfahren angegebenen Schritte aus.

So fügen Sie ein Komponententestprojekt erstellen

  1. Klicken Sie im Menü Datei wählen Sie Hinzufügen aus und wählen dann Neues Projekt... aus.

  2. Im Dialogfeld Neues Projekt Installiert erweitern Sie, erweitern Sie Visual C# und wählen Sie dann Test aus.

  3. Ziehen Sie aus der Liste der Vorlagen, wählen Sie Komponententestprojekt.

  4. Im Feld geben Sie Name BankTest ein und klicken Sie dann OK aus.

    Das BankTests Projekt wird der Bank Projektmappe hinzugefügt.

  5. Im BankTests Projekt fügen Sie einen Verweis auf Bank Projektmappe hinzu.

    Wählen Sie im Projektmappen-Explorer, wählen Sie Verweise im BankTests Projekt und dann Verweis hinzufügen... im Kontextmenü aus.

  6. Im Bezugsmanagerdialogfeld erweitern Sie Projektmappe und überprüfen Sie dann das Bank-Element.

Erstellen Sie die Testklasse

Es erfordern eine Testklasse zum Überprüfen der BankAccount-Klasse.Es können das UnitTest1.cs verwenden, das von der Projektvorlage generiert wurde, doch es sollten die Datei geben und mehr aussagekräftige Namen darstellen.Es können das in einem Schritt tun, indem Sie im Projektmappen-Explorer die Datei Explorer umbenennen.

Umbenennen einer Klassendatei

Wählen Sie im Projektmappen-Explorer, die Datei "UnitTest1.cs" im BankTests-Projekt aus.Wählen Sie im Kontextmenü aus Umbenennen und benennen Sie dann die Datei zu BankAccountTests.cs.Wählen Sie Ja im Dialogfeld aus, das bewirkt, dass Sie alle im Projekt enthaltenen Verweise auf das Codeelement "UnitTest1" umbenennen möchten.Änderungen dieses Schritts der Name der Klasse an BankAccountTest.

Die BankAccountTests.cs-Datei enthält nun den folgenden Code:

// unit test code
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BankTests
{
    [TestClass]
    public class BankAccountTests
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
}

Fügen Sie dem Projekt eine using-Anweisung getesteten hinzu

Es können eine using-Anweisung der Klasse auch hinzufügen, um uns in das Projekt aufrufen lassen getesteten, ohne vollqualifizierte Namen verwenden.Fügen Sie am Anfang der Klassendatei fügen Sie hinzu:

using BankAccountNS

ms182532.collapse_all(de-de,VS.110).gifTesten Sie Klassenanforderungen

Die Mindestanforderungen für eine Testklasse sind die folgenden:

  • Das - Attribut ist im [TestClass] Microsoft-Komponententestframework für verwalteten Code für eine Klasse benötigt, die Komponententestmethoden enthält, die Sie in Test-Explorer ausführen möchten.

  • Jede Testmethode, dass Sie Test-Explorer ausgeführt werden soll, muss das [TestMethod]- Attribut verfügen.

Sie können andere Klassen in einem Komponententestprojekt haben, die nicht das [TestClass]-Attribut verfügen, und Sie können andere Methoden in den Testklassen haben, die nicht [TestMethod] das - Attribut verfügen.Sie können diese anderen Klassen und Methoden in den Testmethoden verwenden.

Erstellen Sie die erste Testmethode

In dieser Vorgehensweise schreiben Sie Komponententestmethoden, um das Verhalten der - Methode der - Klasse DebitBankAccount zu überprüfen.Die - Methode wird oben aufgeführten.

Mit der - Methode getesteten analysieren, bestimmen Sie, dass es mindestens drei Verhalten gibt, das überprüft werden muss:

  1. Die - Methode löst [ArgumentOutOfRangeException], wenn der Kreditbetrag größer ist, als die Bilanz aus.

  2. Sie dient auch ArgumentOutOfRangeException aus, wenn der Kreditbetrag kleiner als null ist.

  3. Wenn die Überprüfungen in 1.) und 2.) erfüllt sind, zieht die Methode die Menge aus dem Kontostand.

In diesem ersten Test überprüfen Sie, dass der eine gültige Menge (eine, die kleiner als der ist und die größer als ist), die richtige Menge von Konto entnimmt.

So fügen Sie eine Testmethode erstellen

  1. Fügen Sie mithilfe der - Anweisung BankAccountNS; BankAccountTests.cs-Datei hinzu.

  2. Fügen Sie die folgende Methode BankAccountTests dieser Klasse hinzu:

    // unit test code
    [TestMethod]
    public void Debit_WithValidAmount_UpdatesBalance()
    {
        // arrange
        double beginningBalance = 11.99;
        double debitAmount = 4.55;
        double expected = 7.44;
        BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
    
        // act
        account.Debit(debitAmount);
    
        // assert
        double actual = account.Balance;
        Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly");
    }
    

Die - Methode ist recht einfach.Es installieren BankAccount ein neues - Objekt mit einem Startkapital entnehmen und dann eine gültige Menge.Sie verwenden das Microsoft-Komponententest-Framework für die AreEqual-Methode mit verwaltetem Code, um sicherzustellen, dass die Endsaldo ist, was Sie erwarten.

ms182532.collapse_all(de-de,VS.110).gifTestmethodenanforderungen

Eine Testmethode muss die folgenden Anforderungen erfüllen:

  • Die Methode muss mit dem [TestMethod]-Attribut ergänzt werden.

  • Die Methode muss void zurückgeben.

  • Die - Methode kann keine Parameter haben.

Erstellen und führen Sie den Test

Um den Test erstellen und ausführen

  1. Wählen Sie im Menü Erstellen die Option Projektmappe erstellen.

    Wenn keine Fehler auftreten, wird das UnitTestExplorer-Fenster mit Debit_WithValidAmount_UpdatesBalance aufgelistet ist in der Gruppe Nicht ausgeführte Tests.Wenn Test-Explorer nicht angezeigt wird, nach einem erfolgreichen Build, Test im Menü auswählen, wählen Sie Fenster aus und wählen dann Test-Explorer aus.

  2. Wählen Sie Alle ausführen, um den Test auszuführen.Während der Test ausgeführt wird, wird die Statusleiste am oberen Fensterrand animiert.Am Ende des Testlaufs, die Leiste grün, wenn alle Testmethodenübergabe oder das rote ggf. der Tests fehlschlagen.

  3. In diesem Fall schlägt der Test fehl.Die Testmethode wird auf Fehlgeschlagene Tests verschoben.Gruppe verfügen.Wählen Sie die - Methode im Test-Explorer aus, um die Details unten im Fenster anzuzeigen.

Korrigieren Sie den Code und überprüfen Sie die Tests

Analysieren der Testergebnisse

Das Testergebnis enthält eine Meldung, die den Fehler beschreibt.Für die AreEquals-Methode In Sie, was erwartet wurden (Expected<XXX>(Parameter) und was tatsächlich empfangen wurde (der Actual<zu>-Parameter).Es erwartet die Bilanz, um die Auslastung von Anfang an zu empfangen, sondern hat es um die Menge der Wiederaufnahme zugenommen.

Eine Nachprüfung des Debetcodes zeigt, dass der Komponententest erfolgreich ausgeführt wurde, mit, einen Fehler zu suchen.Die Menge der Wiederaufnahme wird dem Kontostand hinzugefügt, wenn sie subtrahiert werden soll.

Korrigieren Sie den Fehler

Um den Fehler zu beheben, ersetzen Sie die Zeile

m_balance += amount;

ersetzen durch

m_balance -= amount;

Wiederholen Sie den Test

im Test-Explorer wählen Sie Alle ausführen, um den Test erneut auszuführen.Die Rote/Grünleiste dreht grün, und der Test wird auf die Gruppe Bestandene Tests verschoben.

Verwendungskomponententests, um den Code zu verbessern

In diesem Abschnitt wird beschrieben, wie ein iterativer Prozess der Analyse, der Komponententestentwicklung und der Umgestaltung Ihnen helfen kann, den Produktionscode robuster und effektiv zu machen.

Analysieren Sie die Probleme

Nachdem Sie eine Testmethode erstellt haben, um zu bestätigen, dass eine gültige Menge ordnungsgemäß in der Debit-Methode abgezogen wird, können wir uns an verbleibenden Fälle in der ursprünglichen Analyse gelten:

  1. Die - Methode löst ArgumentOutOfRangeException, wenn der Kreditbetrag größer ist, als die Bilanz aus.

  2. Sie dient auch ArgumentOutOfRangeException aus, wenn der Kreditbetrag kleiner als null ist.

Erstellen Sie die Testmethoden

Ein ersten Versuch am Erstellen einer Testmethode, um diese Probleme zu beheben scheint viel versprechend:

//unit test method
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = -100.00;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // act
    account.Debit(debitAmount);

    // assert is handled by ExpectedException
}

Sie verwenden das ExpectedExceptionAttribute-Attribut, um anzugeben, dass die richtige Ausnahme ausgelöst wurde.Das - Attribut wird fehlschlägt, es sei denn, ArgumentOutOfRangeException ausgelöst wird.Der Test mit positiven und negativen Werten debitAmount und anschließend die - Methode vorübergehend Ändern getesteten ausgeführt wird, um generisches ApplicationException, wenn die Menge kleiner als, ist null auszulösen, veranschaulicht, dass Test bei ordnungsgemäßem Verhalten.Um den Fall testen, wenn die Menge entnommen, die größer ist, als die Bilanz ist, wird alles, das wir ausführen müssen:

  1. Erstellen Sie eine neue Testmethode, die Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange genannt wird.

  2. Kopieren Sie den Methodentext aus Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange der neuen Methode.

  3. Legen Sie debitAmount auf eine Zahl größer als die Bilanz fest.

Führen Sie die Tests

Die beiden Methoden mit Werten für debitAmount ausführen, wird veranschaulicht, dass Tests ausreichend die verbleibenden Fälle behandeln.Alle drei Tests ausführen, bestätigen Sie, dass alle Fälle in der ursprünglichen Analyse ordnungsgemäß abgedeckt werden.

Legen Sie die Analyse fort

beunruhigen jedoch die letzten zwei Testmethoden auch etwas.Es können nicht sicher, die im Code unter Testwürfen wenn jeder Testläufe an.Jede Methode des deshalb der beiden Bedingungen würde hilfreich sein.Wie wird an das Problem mehr vorstellen, wird es offensichtlich, dass, wissend, welche Bedingung verstoßen wurde, das Vertrauen in Tests erhöhen würde.Diese Informationen können auch sehr wahrscheinlich zum Produktionsmechanismus hilfreich sein, der die Ausnahme behandelt, wenn er durch die zu testende Methode ausgelöst wird.Das Generieren von mehr Informationen, als die Methodenwürfe alle beteiligte unterstützen würden, das ExpectedException-Attribut können diese Informationen nicht bereitstellen.

Die - Methode erneut in diesem Versuch, sehen Sie, dass beide Bedingungsanweisungen einen ArgumentOutOfRangeException-Konstruktor verwenden, dass Nehmenname des Arguments als Parameter:

throw new ArgumentOutOfRangeException("amount");

Von einer Suche der MSDN Library, erkennen Sie, dass ein Konstruktor dass mehr Informationen der Berichte weit vorhanden ist.ArgumentOutOfRangeException(String, Object, String) enthält den Namen des Arguments, des Argumentwerts und der benutzerdefinierten Meldung ein.Es können die zu testende Methode umzugestalten, um diesen Konstruktor verwenden.Auch besser, können wir - Verfügbare Typmember öffentlich verwenden, um die Fehler anzugeben.

Gestalten Sie den getesteten Code

Es definieren zuerst zwei Konstanten für die Fehlermeldungen Klassengültigkeitsbereich:

// class under test
public const string DebitAmountExceedsBalanceMessage = "Debit amount exceeds balance";
public const string DebitAmountLessThanZeroMessage = "Debit amount less than zero";

Es ändern dann die beiden Bedingungsanweisungen in der Debit-Methode:

// method under test
// ...
    if (amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount", amount, DebitAmountExceedsBalanceMessage);
    }

    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount", amount, DebitAmountLessThanZeroMessage);
    }
// ...

Gestalten Sie die Testmethoden

In der Testmethode entfernen Sie zunächst das ExpectedException-Attribut.In seiner Stelle fangen wir die ausgelöste Ausnahme und überprüfen, ob sie in die richtige Bedingungsanweisung ausgelöst wurde.Allerdings müssen wir uns zwischen zwei Optionen jetzt entscheiden, die restlichen Anforderungen zu überprüfen.In der Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange-Methode, können Sie eine der folgenden Aktionen ausführen:

  • Bestätigen Sie, dass die ActualValue-Eigenschaft der Ausnahme (der zweite Parameter des Konstruktors ArgumentOutOfRangeException ) größer als das Startkapital ist.Diese Option erfordert, ActualValue, die - Eigenschaft der Ausnahme für die beginningBalance-Variable der Testmethode testen, und überprüfen Sie dann erfordert auch, dass ActualValue größer als ist.

  • Bestätigen Sie, dass die Nachricht (der dritte Parameter des - Konstruktors) DebitAmountExceedsBalanceMessage umfasst, das in der BankAccount-Klasse definiert ist.

Die StringAssert.Contains-Methode im Microsoft-Komponententest-Framework aktiviert uns, um die zweite Option ohne die Berechnungen zu überprüfen, die von der ersten Option erforderlich sind.

Ein zweiter Versuch am Überarbeiten von Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange sieht möglicherweise folgendermaßen aus:

[TestMethod]
public void Debit_WhenAmountIsGreaterThanBalance_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);\

    // act
    try
    {
        account.Debit(debitAmount);
    }
    catch (ArgumentOutOfRangeException e)
    {
        // assert
        StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
    }
}

Erneuter Test, neu analysieren und neu

Wenn wir die Testmethoden mit Werten erneut testen wir, gelten die folgenden Fakten an:

  1. Wenn wir den richtigen Fehler abgefangen werden, indem der debitAmount verwenden, die größer als die Bilanz ist, wird die Contains Assertionsübergaben, Ausnahme und daher die Testmethodenübergaben ignoriert.Dies ist das Verhalten, das es sind.

  2. Wenn wir debitAmount verwenden, schlägt die Assertion fehl, da die falsche Fehlermeldung zurückgegeben wird.Die Assertion schlägt auch fehl, wenn wir eine temporäre ArgumentOutOfRange Ausnahme an einem anderen Punkt in der - Methode unter Testcodepfad führen.Dies ist auch gut.

  3. Wenn der debitAmount-Wert gültig ist (d. h, kleiner als die Bilanz jedoch größer als null, wird keine Ausnahme abgefangen, sodass die Assertion nie abgefangen.Die Testmethodenübergaben.Dies ist nicht zulässig, weil wir die Testmethode fehlschlagen soll, wenn keine Ausnahme ausgelöst wird.

Der dritte Tatsache ist ein Fehler in der Testmethode.Um zu versuchen das Problem zu beheben, fügen Sie eine Fail Assertion am Ende der Testmethode hinzu um den Fall zu behandeln in dem keine Ausnahme ausgelöst wird.

jedoch erneut Testen zeigt, dass der Test jetzt fehlschlägt, wenn die richtige Ausnahme abgefangen wird.Die catch-Anweisung wird die Ausnahme zurück und die Methode wird fortgesetzt, um auszuführen und schlägt an der neuen Assertion aus.Um das neue Problem zu beheben, fügen Sie eine return-Anweisung nach StringAssert hinzu.Das sie bestätigt, dass nun die Probleme behoben haben.Unsere endgültige Freigabe Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange sieht folgendermaßen aus:

[TestMethod]
public void Debit_WhenAmountIsGreaterThanBalance_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);\

    // act
    try
    {
        account.Debit(debitAmount);
    }
    catch (ArgumentOutOfRangeException e)
    {
        // assert
        StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
        return;
    }
    Assert.Fail("No exception was thrown.")
}

In diesem abschließenden Abschnitt könnte die Arbeit, wir Erhöhung zurückzuversetzen, das Testcode zu die robusteren und informativeren Testmethoden.Aber wichtiger, könnte die zusätzliche Analyse auch, um Code im Projekt zu testende zu verbessern.