연습: 관리 코드에 대한 단위 테스트 만들기 및 실행Walkthrough: Create and Run Unit Tests for Managed Code

이 문서에서는 관리 코드에 대한 Microsoft 단위 테스트 프레임워크 및 Visual Studio 테스트 탐색기를 사용하여 일련의 단위 테스트를 생성, 실행 및 사용자 지정하는 방법을 안내합니다.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. 개발 중인 C# 프로젝트로 시작하여 해당 코드를 실행해 보는 테스트를 만들어 테스트를 실행하고 결과를 검사합니다.You start with a C# project that is under development, create tests that exercise its code, run the tests, and examine the results. 그런 다음, 프로젝트 코드를 변경하고 테스트를 다시 실행할 수 있습니다.Then you can change your project code and rerun the tests.

참고

이 연습에서는 관리 코드에 Microsoft 단위 테스트 프레임워크를 사용합니다.This walkthrough uses the Microsoft unit test framework for managed code. 테스트 탐색기에서는 테스트 탐색기용 어댑터가 포함된 타사 단위 테스트 프레임워크의 테스트도 실행할 수 있습니다.Test Explorer also can run tests from third party unit test frameworks that have adapters for Test Explorer. 자세한 내용은 타사 단위 테스트 프레임워크 설치를 참조하세요.For more information, see Install third-party unit test frameworks

참고

명령줄에서 테스트를 실행하는 방법에 대한 자세한 내용은 연습: 명령줄 테스트 유틸리티 사용을 참조하세요.For information about how to run tests from a command line, see Walkthrough: Use the command-line test utility.

전제 조건Prerequisites

테스트할 프로젝트 만들기Create a project to test

  1. Visual Studio를 엽니다.Open Visual Studio.

  2. 파일 메뉴에서 새로 만들기 > 프로젝트를 선택합니다.On the File menu, select New > Project.

    새 프로젝트 대화 상자가 나타납니다.The New Project dialog box appears.

  3. 설치된 템플릿에서 Visual C# 을 클릭합니다.Under Installed Templates, click Visual C#.

  4. 응용 프로그램 형식 목록에서 클래스 라이브러리를 클릭합니다.In the list of application types, click Class Library.

  5. 이름 상자에 Bank를 입력한 다음, 확인을 클릭합니다.In the Name box, type Bank and then click OK.

    새 Bank 프로젝트가 만들어져 솔루션 탐색기에 표시되고 코드 편집기에 Class1.cs 파일이 열립니다.The new Bank project is created and displayed in Solution Explorer with the Class1.cs file open in the code editor.

    참고

    Class1.cs가 코드 편집기에서 열리지 않으면 솔루션 탐색기에서 Class1.cs 파일을 두 번 클릭하여 엽니다.If Class1.cs is not open in the Code Editor, double-click the file Class1.cs in Solution Explorer to open it.

  6. 단위 테스트를 만들기 위한 샘플 프로젝트에서 소스 코드를 복사하고 Class1.cs의 원래 내용을 복사된 코드로 바꿉니다.Copy the source code from the Sample project for creating unit tests, and replace the original contents of Class1.cs with the copied code.

  7. 파일을 BankAccount.cs로 저장합니다.Save the file as BankAccount.cs.

  8. 빌드 메뉴에서 솔루션 빌드를 클릭합니다.On the Build menu, click Build Solution.

이제 Bank라는 프로젝트가 준비되었습니다.You now have a project named Bank. 이 프로젝트에는 테스트할 소스 코드와 테스트에 사용할 도구가 들어 있습니다.It contains source code to test and tools to test it with. Bank에 대한 네임스페이스 BankAccountNS에는 다음 절차에서 테스트할 메서드가 포함된 공용 클래스인 BankAccount가 있습니다.The namespace for Bank, BankAccountNS, contains the public class BankAccount, whose methods you'll test in the following procedures.

이 문서에서는 테스트가 Debit 메서드에 집중합니다.In this article, the tests focus on the Debit method. Debit 메서드는 계좌에서 돈을 인출할 때 호출됩니다.The Debit method is called when money is withdrawn from an account. 다음은 메서드 정의입니다.Here is the method definition:

// Method to be tested.
public void Debit(double amount)
{
    if(amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    m_balance += amount;
}

단위 테스트 프로젝트 만들기Create a unit test project

  1. 파일 메뉴에서 추가 > 새 프로젝트를 선택합니다.On the File menu, select Add > New Project.

  2. 새 프로젝트 대화 상자에서 설치됨, Visual C# 을 확장한 다음 테스트를 선택합니다.In the New Project dialog box, expand Installed, expand Visual C#, and then choose Test.

  3. 템플릿 목록에서 단위 테스트 프로젝트를 선택합니다.From the list of templates, select Unit Test Project.

  4. 이름 상자에 BankTests를 입력한 다음, 확인을 선택합니다.In the Name box, enter BankTests, and then select OK.

    BankTests 프로젝트가 Bank 솔루션에 추가됩니다.The BankTests project is added to the Bank solution.

  5. BankTests 프로젝트에서 Bank 프로젝트에 대한 참조를 추가합니다.In the BankTests project, add a reference to the Bank project.

    솔루션 탐색기에서 BankTests 프로젝트의 참조를 선택하고 상황에 맞는 메뉴에서 참조 추가를 선택합니다.In Solution Explorer, select References in the BankTests project and then choose Add Reference from the context menu.

  6. 참조 관리자 대화 상자에서 솔루션 을 확장한 다음 Bank 항목을 선택합니다.In the Reference Manager dialog box, expand Solution and then check the Bank item.

테스트 클래스 만들기Create the test class

BankAccount 클래스를 확인하기 위한 테스트 클래스를 만듭니다.Create a test class to verify the BankAccount class. 프로젝트 템플릿에서 생성된 UnitTest1.cs 파일을 사용할 수 있지만 파일 및 클래스에 설명이 포함된 이름을 제공할 수 있습니다.You can use the UnitTest1.cs file that was generated by the project template, but give the file and class more descriptive names. 솔루션 탐색기에서 파일 이름을 바꾸면 한 번에 수행할 수 있습니다.You can do that in one step by renaming the file in Solution Explorer.

클래스 파일 이름 바꾸기Rename a class file

솔루션 탐색기에서 BankTests 프로젝트의 UnitTest1.cs 파일을 선택합니다.In Solution Explorer, select the UnitTest1.cs file in the BankTests project. 상황에 맞는 메뉴에서 이름 바꾸기를 선택한 다음, 파일 이름을 BankAccountTests.cs로 바꿉니다.From the context menu, choose Rename, and then rename the file to BankAccountTests.cs. 프로젝트에서 코드 요소 UnitTest1에 대한 모든 참조 이름을 바꿀지 묻는 대화 상자에서 를 선택합니다.Choose Yes on the dialog that asks if you want to rename all references to the code element UnitTest1 in the project.

이 단계에서는 클래스 이름을 BankAccountTests로 변경합니다.This step changes the name of the class to BankAccountTests. BankAccountTests.cs 파일에는 이제 다음 코드가 들어 있습니다.The BankAccountTests.cs file now contains the following code:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

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

테스트에서 프로젝트에 using 문 추가Add a using statement to the project under test

using 문을 클래스에 추가하여 정규화된 이름을 사용하지 않고 테스트 중인 프로젝트를 호출할 수 있습니다.You can also add a using statement to the class to be able to call into the project under test without using fully qualified names. 클래스 파일의 맨 위에 다음을 추가합니다.At the top of the class file, add:

using BankAccountNS;

테스트 클래스 요구 사항Test class requirements

테스트 클래스의 최소 요구 사항은 다음과 같습니다.The minimum requirements for a test class are:

  • [TestClass] 특성은 테스트 탐색기에서 실행하려는 단위 테스트 메서드가 포함된 모든 클래스의 관리 코드에 대한 Microsoft 단위 테스트 프레임워크에 필요합니다.The [TestClass] attribute is required in the Microsoft unit testing framework for managed code for any class that contains unit test methods that you want to run in Test Explorer.

  • 테스트 탐색기에서 실행하려는 각 테스트 메서드에는 [TestMethod] 특성이 있어야 합니다.Each test method that you want Test Explorer to run must have the [TestMethod] attribute.

[TestClass] 특성이 없는 단위 테스트 프로젝트에 다른 클래스를 사용하거나 [TestMethod] 특성이 없는 테스트 클래스에 다른 메서드를 사용할 수 있습니다.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. 테스트 메서드에서 이러한 다른 클래스와 메서드를 사용할 수 있습니다.You can use these other classes and methods in your test methods.

첫 번째 테스트 메서드 만들기Create the first test method

이 절차에서는 단위 테스트 메서드를 작성하여 Debit 클래스의 BankAccount 메서드 동작을 확인합니다.In this procedure, you'll write unit test methods to verify the behavior of the Debit method of the BankAccount class. Debit 메서드는 이 문서의 앞부분에 나와 있습니다.The Debit method is shown previously in this article.

확인해야 하는 동작이 3개 이상 있습니다.There are at least three behaviors that need to be checked:

  • 이 메서드는 대변 금액이 잔액보다 큰 경우 ArgumentOutOfRangeException 을 발생시킵니다.The method throws an ArgumentOutOfRangeException if the debit amount is greater than the balance.

  • 이 메서드는 차변 금액이 0보다 작을 경우 ArgumentOutOfRangeException을 throw합니다.The method throws ArgumentOutOfRangeException if the debit amount is less than zero.

  • 대변 금액이 유효한 경우 이 메서드는 잔고에서 차변 금액을 뺍니다.If the debit amount is valid, the method subtracts the debit amount from the account balance.

이 연습에서 사용하지 않으므로 기본 TestMethod1 메서드를 삭제할 수 있습니다.You can delete the default TestMethod1 method, because you won't use it in this walkthrough.

테스트 메서드를 만들려면To create a test method

첫 번째 테스트에서는 유효 금액(잔고보다 작고 0보다 큰 값)이 계좌로부터 올바른 금액을 인출하는지 확인합니다.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. 다음 메서드를 BankAccountTests 클래스에 추가합니다.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");
}

메서드가 간단함: 기초 잔액으로 새 BankAccount 개체를 만든 다음, 유효한 금액을 인출합니다.The method is straightforward: it sets up a new BankAccount object with a beginning balance, and then withdraws a valid amount. AreEqual 메서드를 사용하여 최종 잔액이 기대한 것과 같은지 확인합니다.It uses the AreEqual method to verify that the ending balance is as expected.

테스트 메서드 요구 사항Test method requirements

테스트 메서드는 다음 요구 사항을 충족해야 합니다.A test method must meet the following requirements:

  • [TestMethod] 특성으로 데코레이트됩니다.It's decorated with the [TestMethod] attribute.

  • void를 반환합니다.It returns void.

  • 매개 변수를 사용할 수 없습니다.It cannot have parameters.

테스트 빌드 및 실행Build and run the test

  1. 빌드 메뉴에서 솔루션 빌드를 선택합니다.On the Build menu, choose Build Solution.

    오류가 없는 경우 실행하지 않은 테스트 그룹에 나열된 Debit_WithValidAmount_UpdatesBalance와 함께 테스트 탐색기가 나타납니다.If there are no errors, Test Explorer appears with Debit_WithValidAmount_UpdatesBalance listed in the Not Run Tests group.

    빌드에 성공한 후 테스트 탐색기가 나타나지 않는 경우 메뉴에서 테스트 를 선택하고, 을 선택한 다음, 테스트 탐색기를 선택합니다.If Test Explorer does not appear after a successful build, choose Test on the menu, then choose Windows, and then choose Test Explorer.

  2. 모두 실행 을 선택하여 테스트를 실행합니다.Choose Run All to run the test. 테스트가 실행되는 동안 창 맨 위의 상태 표시줄에 애니메이션이 사용됩니다.While the test is running, the status bar at the top of the window is animated. 테스트 실행이 끝날 때 테스트 메서드가 통과했으면 녹색이 되고 테스트가 실패하면 빨간색이 됩니다.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.

  3. 이러한 경우 테스트가 실패합니다.In this case, the test fails. 테스트 메서드가 실패한 테스트 그룹으로 이동합니다.The test method is moved to the Failed Tests group. 창 하단에서 세부 정보를 보려면 테스트 탐색기에서 메서드를 선택합니다.Select the method in Test Explorer to view the details at the bottom of the window.

코드를 수정하고 테스트 다시 실행Fix your code and rerun your tests

테스트 결과 분석Analyze the test results

테스트 결과에 실패를 설명하는 메시지가 포함됩니다.The test result contains a message that describes the failure. AreEquals 메서드의 경우 메시지에 예상 값(Expected<value> 매개 변수)과 실제로 수신한 값(Actual<value> 매개 변수)이 표시됩니다.For the AreEquals method, the message displays what was expected (the Expected<value> parameter) and what was actually received (the Actual<value> parameter). 잔고가 감소할 것으로 예상했지만 실제로는 인출금만큼 증가했습니다.You expected the balance to decrease, but instead it actually increased by the amount of the withdrawal.

단위 테스트에서 버그 발견됨: 차감해야 할 경우 잔고에 인출금이 추가됩니다.The unit test has uncovered a bug: the amount of the withdrawal is added to the account balance when it should be subtracted.

버그 수정Correct the bug

오류를 수정하려면 다음 줄을To correct the error, replace the line:

m_balance += amount;

다음으로 바꿉니다.with:

m_balance -= amount;

테스트 다시 실행Rerun the test

테스트 탐색기에서 모두 실행 을 선택하여 테스트를 다시 실행합니다.In Test Explorer, choose Run All to rerun the test. 빨강/녹색 막대가 테스트 통과를 나타내기 위해 녹색으로 바뀌고 테스트는 통과한 테스트 그룹으로 이동합니다.The red/green bar turns green to indicate that the test passed, and the test is moved to the Passed Tests group.

단위 테스트를 사용하여 코드 개선Use unit tests to improve your code

이 섹션에서는 반복적인 분석 프로세스, 단위 테스트 개발 및 리팩터링을 통해 프로덕션 코드를 보다 강력하고 효과적으로 만드는 방법을 설명합니다.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.

문제 분석Analyze the issues

유효한 금액이 Debit 메서드에서 제대로 공제되었는지 확인하기 위한 테스트 메서드를 만들었습니다.You've created a test method to confirm that a valid amount is correctly deducted in the Debit method. 이제 차변 금액이 다음 중 하나인 경우 메서드가 ArgumentOutOfRangeException을 throw하는지 확인합니다.Now, verify that the method throws an ArgumentOutOfRangeException if the debit amount is either:

  • 잔고보다 크거나greater than the balance, or
  • 0보다 작음less than zero.

테스트 메서드 만들기Create the test methods

차변 금액이 0보다 작은 경우 올바른 동작을 확인하기 위해 테스트 메서드를 만듭니다.Create a test method to verify correct behavior when the debit amount is less than zero:

[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 the ExpectedException attribute on the test method.
}

ExpectedExceptionAttribute 특성을 사용하여 올바른 예외가 throw되었음을 어설션합니다.Use the ExpectedExceptionAttribute attribute to assert that the correct exception has been thrown. ArgumentOutOfRangeException 을 throw되는 경우가 아니면 이 특성으로 인해 테스트에 실패합니다.The attribute causes the test to fail unless an ArgumentOutOfRangeException is thrown. 차변 금액이 0보다 작을 때, 보다 일반적인 ApplicationException을 throw하기 위해 테스트 중인 메서드를 일시적으로 수정하면 테스트가 올바르게 작동합니다—즉, 실패합니다.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.

인출한 금액이 잔고보다 많을 경우를 테스트하려면 다음 단계를 수행합니다.To test the case when the amount withdrawn is greater than the balance, do the following steps:

  1. Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange라는 새 테스트 메서드를 만듭니다.Create a new test method named Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange.

  2. Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange 의 메서드 본문을 새 메서드로 복사합니다.Copy the method body from Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange to the new method.

  3. debitAmount 를 잔액보다 큰 값으로 설정합니다.Set the debitAmount to a number greater than the balance.

테스트 실행Run the tests

두 테스트 메서드를 실행하면 테스트가 올바르게 작동하는지 알 수 있습니다.Running the two test methods demonstrates that the tests work correctly.

분석 계속 수행Continue the analysis

하지만 마지막 두 테스트 메서드는 문제가 있습니다.However, the last two test methods are also troubling. 테스트가 실행될 때 테스트 중인 메서드의 어떤 조건이 예외를 throw하는지를 확신할 수 없습니다.You can't be certain which condition in the method under test throws the exception when either test is run. 마이너스 차변 금액 또는 잔고보다 큰 금액이라는 두 가지 조건을 구별하는 몇 가지 방법으로 테스트에서 신뢰도를 높일 수 있습니다.Some way of differentiating the two conditions, that is a negative debit amount or an amount greater than the balance, would increase your confidence in the tests.

테스트 중인 메서드를 다시 살펴보면 인수 이름을 매개 변수로 받는 ArgumentOutOfRangeException 생성자가 두 조건문 모두에 사용된다는 사실을 알 수 있습니다.Look at the method under test 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");

훨씬 많은 정보를 보고하는 데 사용할 수 있는 생성자가 있음: ArgumentOutOfRangeException(String, Object, String)에는 인수 이름, 인수 값 및 사용자 정의 메시지가 포함됩니다.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. 이 생성자를 사용하도록 테스트 중인 메서드를 리팩터링할 수 있습니다.You can refactor the method under test to use this constructor. 더 좋은 점은 공개적으로 사용할 수 있는 형식 멤버를 사용하여 오류를 지정할 수 있다는 점입니다.Even better, you can use publicly available type members to specify the errors.

테스트 중인 코드 리팩터링Refactor the code under test

먼저 클래스 범위에서 오류 메시지에 대한 두 개 상수를 정의합니다.First, define two constants for the error messages at class scope. 다음을 테스트 중인 클래스에 배치합니다(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";

그런 다음, Debit 메서드에서 두 조건문을 수정합니다.Then, modify the two conditional statements in the Debit method:

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

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

테스트 메서드 리팩터링Refactor the test methods

ExpectedException 테스트 메서드 특성을 제거하고 대신, throw된 예외를 catch하며 관련 메시지를 확인합니다.Remove the ExpectedException test method attribute and instead, catch the thrown exception and verify its associated message. StringAssert.Contains 메서드는 두 문자열을 비교하는 기능을 제공합니다.The StringAssert.Contains method provides the ability to compare two strings.

이제 Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange는 다음과 같습니다.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 (ArgumentOutOfRangeException e)
    {
        // Assert
        StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
    }
}

재테스트, 재작성 및 재분석Retest, rewrite, and reanalyze

테스트 중인 메서드에 버그가 있다고 가정하고 Debit 메서드가 ArgumentOutOfRangeException을 throw하지 않으며 예외와 함께 올바른 메시지를 출력하지 않는 것에 염려하지 마세요.Assume there's a bug in the method under test, and the Debit method doesn't even throw an ArgumentOutOfRangeException, nevermind output the correct message with the exception. 현재는 테스트 메서드가 이러한 사례를 처리하지 않습니다.Currently, the test method doesn't handle this case. debitAmount 값이 유효하면(즉, 잔액보다 작지만 0보다 큼) 예외가 catch되지 않으므로 어설션이 절대로 시작되지 않습니다.If the debitAmount value is valid (that is, less than the balance but greater than zero), no exception is caught, so the assert never fires. 그런데도 테스트 메서드를 통과합니다.Yet, the test method passes. 예외가 throw되지 않는 경우에도 테스트 메서드가 실패하지 않아야 하므로 이 방법은 좋지 않습니다.This is not good, because you want the test method to fail if no exception is thrown.

이것은 테스트 메서드의 버그입니다.This is a bug in the test method. 문제를 해결하려면 테스트 메서드 끝에 예외가 throw되지 않은 경우를 처리하도록 Fail 어설션을 추가합니다.To resolve the issue, add an Fail assert at the end of the test method to handle the case where no exception is thrown.

하지만 테스트를 다시 실행하여 올바른 예외가 catch되면 테스트가 실패한다는 점이 확인되었습니다.But rerunning the test shows that the test now fails if the correct exception is caught. catch 블록은 예외를 catch하지만 메서드가 계속 실행되고 새로운 Fail 어설션에서 실패합니다.The catch block catches the exception, but the method continues to execute and it fails at the new Fail assert. 이 문제를 해결하려면 catch 블록에서 StringAssert 다음에 return문을 추가합니다.To resolve this problem, add a return statement after the StringAssert in the catch block. 테스트를 다시 실행하여 이 문제가 수정되었는지 확인합니다.Rerunning the test confirms that you've fixed this problem. Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange의 최종 버전은 다음과 같습니다.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 (ArgumentOutOfRangeException e)
    {
        // Assert
        StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
        return;
    }

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

테스트 코드가 개선되어 보다 강력하고 유익한 테스트 메서드가 제공됩니다.The improvements to the test code led to more robust and informative test methods. 하지만 무엇보다도 중요한 것은 테스트 중인 코드 역시 향상되었다는 점입니다.But more importantly, they also improved the code under test.