Exemplarische Vorgehensweise: Erstellen und Ausführen von Komponententests für verwalteten CodeWalkthrough: Create and run unit tests for managed code

Dieser Artikel führt Sie durch das Erstellen, Ausführen und Anpassen verschiedener Komponententests mithilfe des Microsoft-Komponententestframeworks für verwalteten Code und Visual Studio-Test-Explorer.This article steps you through creating, running, and customizing a series of unit tests using the Microsoft unit test framework for managed code and 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.You start with a C# project that is under development, create tests that exercise its code, run the tests, and examine the results. Dann können Sie den Projektcode ändern und die Tests erneut ausführen.Then you change the project code and rerun the tests.

Erstellen eines zu testenden ProjektsCreate a project to test

  1. Öffnen Sie Visual Studio.Open Visual Studio.

  2. Wählen Sie im Menü Datei die Option Neues > Projekt aus.On the File menu, select New > Project.

    Das Dialogfeld Neues Projekt wird angezeigt.The New Project dialog box appears.

  3. Wählen Sie unter der Kategorie Visual C# > .NET Core aus, und wählen Sie dann die Projektvorlage Konsolen-App (.NET Core) .Under the Visual C# > .NET Core category, choose the Console App (.NET Core) project template.

  4. Benennen Sie das Projekt Bank, und klicken Sie auf OK.Name the project Bank, and then click OK.

    Das Projekt „Bank“ wird erstellt und im Projektmappen-Explorer angezeigt, und der Code-Editor mit der Datei Program.cs wird geöffnet.The Bank project is created and displayed in Solution Explorer with the Program.cs file open in the code editor.

    Hinweis

    Wenn die Datei Program.cs nicht im Editor geöffnet wird, doppelklicken Sie im Projektmappen-Explorer auf die Datei Program.cs, um diese zu öffnen.If Program.cs is not open in the editor, double-click the file Program.cs in Solution Explorer to open it.

  1. Öffnen Sie Visual Studio.Open Visual Studio.

  2. Wählen Sie im Startfenster Neues Projekt erstellen aus.On the start window, choose Create a new project.

  3. Wählen Sie die C#-Projektvorlage Konsolen-App (.NET Core) , und klicken Sie dann auf Weiter.Search for and select the C# Console App (.NET Core) project template, and then click Next.

  4. Benennen Sie das Projekt Bank, und klicken Sie dann auf Erstellen.Name the project Bank, and then click Create.

    Das Projekt „Bank“ wird erstellt und im Projektmappen-Explorer angezeigt, und der Code-Editor mit der Datei Program.cs wird geöffnet.The Bank project is created and displayed in Solution Explorer with the Program.cs file open in the code editor.

    Hinweis

    Wenn die Datei Program.cs nicht im Editor geöffnet wird, doppelklicken Sie im Projektmappen-Explorer auf die Datei Program.cs, um diese zu öffnen.If Program.cs is not open in the editor, double-click the file Program.cs in Solution Explorer to open it.

  1. Ersetzen Sie den Inhalt der Datei Program.cs durch den folgenden C#-Code, der die Klasse BankAccount definiert:Replace the contents of Program.cs with the following C# code that defines a class, BankAccount:

    using System;
    
    namespace BankAccountNS
    {
        /// <summary>
        /// Bank account demo class.
        /// </summary>
        public class BankAccount
        {
            private readonly string m_customerName;
            private double m_balance;
    
            private BankAccount() { }
    
            public BankAccount(string customerName, double balance)
            {
                m_customerName = customerName;
                m_balance = balance;
            }
    
            public string CustomerName
            {
                get { return m_customerName; }
            }
    
            public double Balance
            {
                get { return m_balance; }
            }
    
            public void Debit(double amount)
            {
                if (amount > m_balance)
                {
                    throw new ArgumentOutOfRangeException("amount");
                }
    
                if (amount < 0)
                {
                    throw new ArgumentOutOfRangeException("amount");
                }
    
                m_balance += amount; // intentionally incorrect code
            }
    
            public void Credit(double amount)
            {
                if (amount < 0)
                {
                    throw new ArgumentOutOfRangeException("amount");
                }
    
                m_balance += amount;
            }
    
            public static void Main()
            {
                BankAccount ba = new BankAccount("Mr. Bryan Walton", 11.99);
    
                ba.Credit(5.77);
                ba.Debit(11.22);
                Console.WriteLine("Current balance is ${0}", ba.Balance);
            }
        }
    }
    
  2. Ändern Sie den Dateinamen per Rechtsklick zu BankAccount.cs und wählen Sie Umbenennen in Projektmappen-Explorer.Rename the file to BankAccount.cs by right-clicking and choosing Rename in Solution Explorer.

  3. Klicken Sie im Menü Erstellen auf Projektmappe erstellen.On the Build menu, click Build Solution.

Sie haben nun ein Projekt mit Methoden, die Sie testen können.You now have a project with methods you can test. Die Tests in diesem Artikel beziehen sich auf die Debit-Methode.In this article, the tests focus on the Debit method. Die Debit-Methode wird aufgerufen, wenn von einem Konto Geld abgehoben wird.The Debit method is called when money is withdrawn from an account.

Ein Komponententestprojekt erstellenCreate a unit test project

  1. Klicken Sie im Menü Datei auf Hinzufügen > Neues Projekt.On the File menu, select Add > New Project.

    Tipp

    Alternativ können Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe klicken und anschließend Hinzufügen > Neues Projekt auswählen.You can also right-click on the solution in Solution Explorer and choose Add > New Project.

  1. Erweitern Sie im Dialogfeld Neues Projekt erst die Option Installiert und dann die Option Visual C# , und klicken Sie anschließend auf Test.In the New Project dialog box, expand Installed, expand Visual C#, and then choose Test.

  2. Wählen Sie in der Liste der Vorlagen MSTest Test Project (.NET Core) aus.From the list of templates, select MSTest Test Project (.NET Core).

  3. Geben Sie im Feld NameBankTests ein, und klicken Sie dann auf die Schaltfläche OK.In the Name box, enter BankTests, and then select OK.

    Das Projekt BankTests wird der Projektmappe Bank hinzugefügt.The BankTests project is added to the Bank solution.

  1. Wählen Sie die C#-Projektvorlage MSTest Test Project (.NET Core) aus, und klicken Sie dann auf Weiter.Search for and select the C# MSTest Test Project (.NET Core) project template, and then click Next.

  2. Geben Sie dem Projekt den Namen ToDoApi.Name the project BankTests.

  3. Klicken Sie auf Erstellen.Click Create.

    Das Projekt BankTests wird der Projektmappe Bank hinzugefügt.The BankTests project is added to the Bank solution.

  1. Fügen Sie im Projekt BankTests einen Verweis auf die Projektmappe Bank ein.In the BankTests project, add a reference to the Bank project.

    Wählen Sie im Projektmappen-Explorer im Projekt BankTests erst Abhängigkeiten und dann im Kontextmenü Verweis hinzufügen aus.In Solution Explorer, select Dependencies under the BankTests project and then choose Add Reference from the right-click menu.

  2. Erweitern Sie im Dialogfeld Verweis-Manager die Option Projekte, wählen Sie Lösung aus, und überprüfen Sie das Element Bank.In the Reference Manager dialog box, expand Projects, select Solution, and then check the Bank item.

  3. Klicken Sie auf OK.Choose OK.

Die Testklasse erstellenCreate the test class

Erstellen Sie eine Testklasse, um die BankAccount-Klasse zu überprüfen.Create a test class to verify the BankAccount class. Sie können die Datei UnitTest1.cs verwenden, die von der Projektvorlage generiert wurde; Datei und Klasse sollten jedoch einen aussagekräftigeren Namen erhalten.You can use the UnitTest1.cs file that was generated by the project template, but give the file and class more descriptive names.

Umbenennen einer Datei und KlasseRename a file and class

  1. Wählen Sie zum Umbenennen der Datei im Projektmappen-Explorer im BankTests-Projekt die Datei UnitTest1.cs aus.To rename the file, in Solution Explorer, select the UnitTest1.cs file in the BankTests project. Klicken Sie im Kontextmenü auf die Option Umbenennen, und benennen Sie dann die Datei in BankAccountTests.cs um.From the right-click menu, choose Rename, and then rename the file to BankAccountTests.cs.
  1. Zum Umbenennen der Klasse wählen Sie Ja in dem Dialogfeld, in dem Sie gefragt werden, ob Sie auch Verweise auf das Codeelement umbenennen möchten.To rename the class, choose Yes in the dialog box that pops up and asks whether you want to also rename references to the code element.
  1. Um die Klasse umzubenennen, setzen Sie im Code-Editor den Cursor auf UnitTest1, klicken Sie mit der rechten Maustaste, und wählen Sie Umbenennen aus.To rename the class, position the cursor on UnitTest1 in the code editor, right-click, and then choose Rename. Geben Sie BankAccountTests ein, und drücken Sie dann die EINGABETASTE.Type in BankAccountTests and then press Enter.

Die Datei BankAccountTests.cs enthält nun den folgenden Code:The BankAccountTests.cs file now contains the following code:

using Microsoft.VisualStudio.TestTools.UnitTesting;

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

Hinzufügen einer Using-AnweisungAdd a using statement

Fügen Sie der Testklasse eine using-Anweisung hinzu, damit Sie das Testprojekt ohne vollqualifizierte Namen aufrufen können.Add a using statement to the test class to be able to call into the project under test without using fully qualified names. Fügen Sie am Anfang der Klassendatei Folgendes hinzu:At the top of the class file, add:

using BankAccountNS;

TestklassenanforderungenTest class requirements

Die Mindestanforderungen für eine Testklasse lauten wie folgt:The minimum requirements for a test class are:

  • Das [TestClass]-Attribut ist für jede Klasse erforderlich, die in Test-Explorer auszuführende Komponententestmethoden enthält.The [TestClass] attribute is required on any class that contains unit test methods that you want to run in Test Explorer.

  • Jede Testmethode, die vom Test-Explorer erkannt werden soll, muss über das [TestMethod]-Attribut verfügen.Each test method that you want Test Explorer to recognize must have the [TestMethod] attribute.

Ein Komponententestprojekt kann auch über andere Klassen ohne das [TestClass] -Attribut verfügen, und Testklassen können andere Methoden ohne das [TestMethod] -Attribut aufweisen.You can have other classes in a unit test project that do not have the [TestClass] attribute, and you can have other methods in test classes that do not have the [TestMethod] attribute. Sie können diese anderen Klassen und Methoden in den Testmethoden aufrufen.You can call these other classes and methods from your test methods.

Die erste Testmethode erstellenCreate the first test method

In dieser Vorgehensweise schreiben Sie Komponententestmethoden, um das Verhalten der Debit-Methode der BankAccount-Klasse zu überprüfen.In this procedure, you'll write unit test methods to verify the behavior of the Debit method of the BankAccount class.

Es müssen mindestens drei Verhalten überprüft werden:There are at least three behaviors that need to be checked:

  • Die Methode löst eine ArgumentOutOfRangeException aus, wenn der Abbuchungsbetrag größer ist als das Guthaben.The method throws an ArgumentOutOfRangeException if the debit amount is greater than the balance.

  • Außerdem löst sie eine ArgumentOutOfRangeException aus, wenn der Abbuchungsbetrag kleiner als 0 (null) ist.The method throws an ArgumentOutOfRangeException if the debit amount is less than zero.

  • Wenn der Abbuchungsbetrag gültig ist, zieht die Methode diesen vom Kontoguthaben ab.If the debit amount is valid, the method subtracts the debit amount from the account balance.

Tipp

Sie können die Standardmethode TestMethod1 löschen, da Sie sie für diese exemplarische Vorgehensweise nicht benötigen.You can delete the default TestMethod1 method, because you won't use it in this walkthrough.

So erstellen Sie eine TestmethodeTo create a test method

Im ersten Test überprüfen Sie, ob durch einen gültigen Betrag (kleiner als das Kontoguthaben und größer als null) der richtige Betrag vom Konto abgebucht wird.The first test verifies that a valid amount (that is, one that is less than the account balance and greater than zero) withdraws the correct amount from the account. Fügen Sie dieser BankAccountTests -Klasse die folgende Methode hinzu.Add the following method to that BankAccountTests class:

[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 ganz einfach: Sie richtet ein neues BankAccount-Objekt mit einem Startguthaben ein und bucht dann einen gültigen Betrag ab.The method is straightforward: it sets up a new BankAccount object with a beginning balance and then withdraws a valid amount. Sie verwendet die Assert.AreEqual-Methode, um zu überprüfen, ob das Guthaben zum Schluss den Erwartungen entspricht.It uses the Assert.AreEqual method to verify that the ending balance is as expected.

TestmethodenanforderungenTest method requirements

Eine Testmethode muss die folgenden Anforderungen erfüllen:A test method must meet the following requirements:

  • Sie ist mit dem [TestMethod]-Attribut ausgestattet.It's decorated with the [TestMethod] attribute.

  • Er gibt void zurück.It returns void.

  • Die darf keine Parameter aufweisen.It cannot have parameters.

Den Test erstellen und ausführenBuild and run the test

  1. Wählen Sie im Menü Erstellen die Option Projektmappe erstellen.On the Build menu, choose Build Solution.

  2. Wenn der Test-Explorer nicht geöffnet ist, öffnen Sie ihn, indem Sie in der oberen Menüleiste Testen > Windows > Test-Explorer auswählen.If Test Explorer is not open, open it by choosing Test > Windows > Test Explorer from the top menu bar.

  3. Wählen Sie Alle ausführen aus, um den Test auszuführen.Choose Run All to run the test.

    Während der Test ausgeführt wird, gibt die Statusleiste am oberen Rand des Fensters Test-Explorer den aktuellen Status an.While the test is running, the status bar at the top of the Test Explorer window is animated. Am Ende des Testlaufs wird die Leiste grün, wenn alle Tests erfolgreich sind, oder rot, sofern bei einem der Tests ein Fehler auftritt.At the end of the test run, the bar turns green if all the test methods pass, or red if any of the tests fail.

    In diesem Fall schlägt der Test fehl.In this case, the test fails.

  4. Wählen Sie die Methode im Test-Explorer aus, um die Details unten im Fenster anzuzeigen.Select the method in Test Explorer to view the details at the bottom of the window.

Den Code korrigieren und die Tests erneut ausführenFix your code and rerun your tests

Das Testergebnis enthält eine Meldung mit der Fehlerbeschreibung.The test result contains a message that describes the failure. Bei der AreEqual-Methode zeigt die Meldung an, was erwartet und was tatsächlich empfangen wurde.For the AreEqual method, the message displays what was expected and what was actually received. Es wurde davon ausgegangen, dass sich das Guthaben verringern würde. Stattdessen hat es sich aber um den Betrag der Abhebung erhöht.You expected the balance to decrease, but instead it increased by the amount of the withdrawal.

Beim Komponententest wurde ein Fehler festgestellt: Der Abbuchungsbetrag wird dem Kontoguthaben hinzugerechnet, anstatt davon abgezogen zu werden.The unit test has uncovered a bug: the amount of the withdrawal is added to the account balance when it should be subtracted.

Korrigieren des FehlersCorrect the bug

Um den Fehler zu beheben, ersetzten Sie in der Datei BankAccount.cs die Zeile:To correct the error, in the BankAccount.cs file, replace the line:

m_balance += amount;

Durch:with:

m_balance -= amount;

Erneutes Ausführen des TestsRerun the test

Wählen Sie im Test-Explorer Alle ausführen aus, um den Test erneut auszuführen.In Test Explorer, choose Run All to rerun the test. Wenn die rote oder grüne Statusleiste grün wird, war der Test erfolgreich.The red/green bar turns green to indicate that the test passed.

Test-Explorer in Visual Studio 2019, der erfolgreiche Tests anzeigt

Den Code mit Komponententests verbessernUse unit tests to improve your code

In diesem Abschnitt wird beschrieben, wie ein iterativer Prozess bestehend aus Analyse, Komponententestentwicklung und Umgestaltung helfen kann, die Robustheit und Effektivität des Produktionscodes zu verbessern.This section describes how an iterative process of analysis, unit test development, and refactoring can help you make your production code more robust and effective.

Analysieren der ProblemeAnalyze the issues

Sie haben eine Testmethode erstellt, um zu bestätigen, dass zum jeweiligen Zeitpunkt in der Debit-Methode ein gültiger Betrag abgezogen wird.You've created a test method to confirm that a valid amount is correctly deducted in the Debit method. Überprüfen Sie jetzt, ob die Methode eine ArgumentOutOfRangeException auslöst, wenn der AbbuchungsbetragNow, verify that the method throws an ArgumentOutOfRangeException if the debit amount is either:

  • entweder höher als das Guthaben istgreater than the balance, or
  • oder unter 0 liegt.less than zero.

Erstellen und Ausführen neuer TestmethodenCreate and run new test methods

Erstellen Sie eine Testmethode, um die Richtigkeit zu bestätigen, wenn der Abbuchungsbetrag unter 0 liegt:Create a test method to verify correct behavior when the debit amount is less than zero:

[TestMethod]
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
    // Arrange
    double beginningBalance = 11.99;
    double debitAmount = -100.00;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // Act and assert
    Assert.ThrowsException<System.ArgumentOutOfRangeException>(() => account.Debit(debitAmount));
}

Verwenden Sie die ThrowsException-Methode, um zu bestätigen, dass die richtige Ausnahme ausgelöst wurde.Use the ThrowsException method to assert that the correct exception has been thrown. Diese Methode führt zu einem Fehler des Tests, es sei denn, eine ArgumentOutOfRangeException wird ausgelöst.This method causes the test to fail unless an ArgumentOutOfRangeException is thrown. Wenn Sie die zu testende Methode kurzzeitig ändern, um eine generischere ApplicationException auszulösen, wenn der Abbuchungsbetrag unter 0 liegt, wird der Test richtig ausgeführt und schlägt fehl.If you temporarily modify the method under test to throw a more generic ApplicationException when the debit amount is less than zero, the test behaves correctly—that is, it fails.

Gehen Sie folgendermaßen vor, um das Verhalten zu testen, wenn der abzubuchende Betrag höher ist als das Guthaben:To test the case when the amount withdrawn is greater than the balance, do the following steps:

  1. Erstellen Sie eine neue Testmethode mit dem Namen Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange.Create a new test method named Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange.

  2. Kopieren Sie den Methodentext aus Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange in die neue Methode.Copy the method body from Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange to the new method.

  3. Legen Sie debitAmount auf eine Zahl größer als das Guthaben fest.Set the debitAmount to a number greater than the balance.

Führen Sie die zwei Tests aus, und stellen Sie sicher, dass sie erfolgreich abgeschlossen werden.Running the two tests and verify that they pass.

Fortführen der AnalyseContinue the analysis

Die zu testende Methode kann weiter verbessert werden.The method being tested can be improved further. In der aktuellen Implementierung gibt es keine Möglichkeit, zu erfahren, welche Bedingung (amount > m_balance oder amount < 0) zu der Ausnahme geführt hat, die während des Tests ausgelöst wurde.With the current implementation, we have no way to know which condition (amount > m_balance or amount < 0) led to the exception being thrown during the test. Wir wissen nur, dass irgendwo in der Methode eine ArgumentOutOfRangeException ausgelöst wurde.We just know that an ArgumentOutOfRangeException was thrown somewhere in the method. Es wäre wünschenswert zu wissen, welche Bedingung in BankAccount.Debit das Auslösen der Ausnahme verursacht hat (amount > m_balance oder amount < 0), sodass wir sicher sein können, dass die Methode die Integrität ihrer Argumente ordnungsgemäß überprüft.It would be better if we could tell which condition in BankAccount.Debit caused the exception to be thrown (amount > m_balance or amount < 0) so we can be confident that our method is sanity-checking its arguments correctly.

Wenn Sie sich die zu testende Methode (BankAccount.Debit) noch einmal ansehen, werden Sie feststellen, dass beide Bedingungsanweisungen einen ArgumentOutOfRangeException-Konstruktor verwenden, der einfach den Namen des Arguments als Parameter übernimmt:Look at the method being tested (BankAccount.Debit) again, and notice that both conditional statements use an ArgumentOutOfRangeException constructor that just takes name of the argument as a parameter:

throw new ArgumentOutOfRangeException("amount");

Sie können einen Konstruktor verwenden, der weitaus ausführlichere Informationen übermittelt: ArgumentOutOfRangeException(String, Object, String) umfasst den Namen des Arguments, den Argumentwert und eine benutzerdefinierte Meldung.There is a constructor you can use that reports far richer information: ArgumentOutOfRangeException(String, Object, String) includes the name of the argument, the argument value, and a user-defined message. Sie können die zu testende Methode so umgestalten, dass sie diesen Konstruktor verwendet.You can refactor the method under test to use this constructor. Besser noch, Sie können öffentlich verfügbare Typmitglieder verwenden, um die Fehler anzugeben.Even better, you can use publicly available type members to specify the errors.

Umgestalten des zu testenden CodesRefactor the code under test

Definieren Sie zunächst zwei Konstanten für die Fehlermeldungen im Klassengültigkeitsbereich.First, define two constants for the error messages at class scope. Übertragen Sie diese in die getestete Klasse BankAccount:Put these in the class under test, BankAccount:

public const string DebitAmountExceedsBalanceMessage = "Debit amount exceeds balance";
public const string DebitAmountLessThanZeroMessage = "Debit amount is less than zero";

Ändern Sie dann die beiden Bedingungsanweisungen in der Debit-Methode:Then, modify the two conditional statements in the Debit method:

if (amount > m_balance)
{
    throw new System.ArgumentOutOfRangeException("amount", amount, DebitAmountExceedsBalanceMessage);
}

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

Umgestalten der TestmethodenRefactor the test methods

Gestalten Sie die Testmethoden um, indem Sie den Aufruf von Assert.ThrowsException entfernen.Refactor the test methods by removing the call to Assert.ThrowsException. Umschließen Sie den Aufruf von Debit() in einem try/catch-Block, fangen Sie die spezifische erwartete Ausnahme ab, und verifizieren Sie die zugehörige Meldung.Wrap the call to Debit() in a try/catch block, catch the specific exception that's expected, and verify its associated message. Mithilfe der Microsoft.VisualStudio.TestTools.UnitTesting.StringAssert.Contains-Methode können Sie zwei Zeichenfolgen miteinander vergleichen.The Microsoft.VisualStudio.TestTools.UnitTesting.StringAssert.Contains method provides the ability to compare two strings.

Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange wird wie folgt formuliert:Now, the Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange might look like this:

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

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

Erneut testen, umschreiben und neu analysierenRetest, rewrite, and reanalyze

Derzeit verarbeitet die Testmethode nicht alle Fälle, die sie verarbeiten sollte.Currently, the test method doesn't handle all the cases that it should. Wenn die zu testende Methode, die Debit-Methode, keine ArgumentOutOfRangeException-Ausnahme auslöst, wenn der debitAmount-Wert größer als der Saldo (oder unter null (0)) liegt, wird die Testmethode erfolgreich ausgeführt.If the method under test, the Debit method, failed to throw an ArgumentOutOfRangeException when the debitAmount was larger than the balance (or less than zero), the test method would pass. Dies ist nicht gut, da bei der Testmethode ein Fehler auftreten soll, wenn keine Ausnahme ausgelöst wird.This is not good, because you want the test method to fail if no exception is thrown.

Dabei handelt es sich um einen Fehler der Testmethode.This is a bug in the test method. Um das Problem zu beheben, fügen Sie eine Fail-Assertion am Ende der Testmethode hinzu, um den Fall abzudecken, in dem keine Ausnahme ausgelöst wird.To resolve the issue, add an Fail assert at the end of the test method to handle the case where no exception is thrown.

Ein erneuter Test zeigt, dass der Test jetzt fehlschlägt, wenn die richtige Ausnahme erfasst wird.Rerunning the test shows that the test now fails if the correct exception is caught. Der catch-Block fängt die Ausnahme zwar ab, aber die Methode wird weiterhin ausgeführt und schlägt bei der neuen Fail-Assertion fehl.The catch block catches the exception, but the method continues to execute and it fails at the new Fail assert. Um dieses Problem zu beheben, fügen Sie nach return eine StringAssert-Anweisung zum Block catch hinzu.To resolve this problem, add a return statement after the StringAssert in the catch block. Wenn Sie den Test erneut ausführen, bestätigen Sie, dass Sie dieses Problem behoben haben.Rerunning the test confirms that you've fixed this problem. Die fertige Version von Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange sieht wie folgt aus:The final version of the Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange looks like this:

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

    // Act
    try
    {
        account.Debit(debitAmount);
    }
    catch (System.ArgumentOutOfRangeException e)
    {
        // Assert
        StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
        return;
    }

    Assert.Fail("The expected exception was not thrown.");
}

SchlussbemerkungConclusion

Aufgrund der Verbesserungen des Testcodes wurden stabilere und informationsreichere Testmethoden erstellt.The improvements to the test code led to more robust and informative test methods. Aber noch wichtiger: es wurde auch der Code verbessert, der getestet werden soll.But more importantly, they also improved the code under test.

Tipp

In dieser exemplarischen Vorgehensweise wird das Microsoft-Komponententest-Framework für verwalteten Code verwendet.This walkthrough uses the Microsoft unit test framework for managed code. Der Test-Explorer kann außerdem Tests von Komponententestframeworks von Drittanbietern ausführen, die über Adapter für den Test-Explorer verfügen.Test Explorer can also run tests from third-party unit test frameworks that have adapters for Test Explorer. Weitere Informationen finden Sie unter Installieren von Frameworks für Komponententests von Drittanbietern.For more information, see Install third-party unit test frameworks.

Siehe auchSee also

Informationen zum Ausführen von Tests über die Befehlszeile finden Sie unter Exemplarische Vorgehensweise: Befehlszeilenoptionen für VSTest.Console.exe.For information about how to run tests from a command line, see VSTest.Console.exe command-line options.