다음을 통해 공유


단위 테스트의 구조

업데이트: 2007년 11월

단위 테스트는 C#, Visual Basic 또는 Visual C++로 작성된 클래스의 멤버인 메서드입니다.

참고:

C++ 프로덕션 코드로 단위 테스트를 사용하는 방법 및 C++로 작성된 단위 테스트를 사용하는 방법에 대한 자세한 내용은 단위 테스트와 C++를 참조하십시오.

Team System 테스트 도구에서 단위 테스트를 인식하려면 이 소스 코드 파일이 Visual Studio 솔루션의 일부인 테스트 프로젝트에 있어야 합니다. 이 프로젝트 또는 전체 솔루션을 빌드할 때 테스트 프로젝트는 실행 가능한 단위 테스트를 포함하는 어셈블리로 빌드됩니다.

모든 단위 테스트 메서드는 [TestMethod()] 특성(Visual Basic의 경우 <TestMethod()>)으로 표시되고, [TestClass()] 클래스의 멤버입니다. 이 클래스는 Microsoft.VisualStudio.TestTools.UnitTesting 네임스페이스에 정의됩니다. 단위 테스트를 생성하면 이 네임스페이스는 생성된 파일에서 시작 부분의 using 또는 Imports 문에 포함됩니다.

단위 테스트 특성 및 속성

단위 테스트 메서드의 [TestMethod()] 특성 및 포함하는 클래스의 [TestClass()] 특성 외에도 다른 특성을 통해 특정 단위 테스트 기능을 사용할 수 있습니다. 이러한 특성 중 주요 특성으로는 [TestInitialize()] 및 [TestCleanup()]을 들 수 있습니다. [TestInitialize()]로 표시된 메서드를 사용하여 단위 테스트가 실행될 환경을 준비합니다. 이 작업의 목적은 단위 테스트 실행을 위해 알려진 상태를 설정하는 것입니다. 예를 들어, [TestInitialize()] 메서드를 사용하여 테스트에서 사용할 특정 데이터 파일을 복사, 변경 또는 생성할 수 있습니다.

[TestCleanup()]으로 표시된 메서드를 사용하여 테스트가 실행된 후 환경을 알려진 상태로 되돌립니다. 즉, 폴더에서 파일을 삭제하거나 데이터베이스를 알려진 상태로 되돌립니다. 예를 들어, 주문 입력 응용 프로그램에 사용된 메서드를 테스트한 후 재고 데이터베이스를 초기 상태로 다시 설정합니다. 또한 종료자 메서드가 아니라 [TestCleanup()] 또는 ClassCleanup 메서드에서 정리 코드를 사용하는 것이 좋습니다. 종료자 메서드에서 throw되는 예외는 발견되지 않으므로 예기치 않은 결과가 발생할 수 있습니다.

테스트 클래스에 대한 중요한 속성으로 TestContext 속성이 있습니다. 이 속성에는 현재 실행 중인 단위 테스트의 이름, 배포 디렉터리, 로그 파일 이름, 연결되어 있는 데이터베이스(데이터 기반 테스트인 경우) 등의 정보가 포함되어 있습니다. TestContext 속성은 TestContext 인스턴스를 반환합니다. 자세한 내용은 TestContext 클래스 사용을 참조하십시오.

단위 테스트 예제

다음 코드 조각에서는 C#으로 작성된 간단한 단위 테스트를 보여 줍니다.

[TestMethod()]
public void DebitTest()
{
    string customerName = "Mr. Bryan Walton"; 
    double balance = 11.99; 
    BankAccount target = new BankAccount(customerName, balance);
    double amount = 11.22; 
    target.Debit(amount);
    Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05); // 0.05 is tolerance for floating-point comparison
    //Assert.Inconclusive("A method that does not return a value cannot be verified.");
}

다른 예제를 보려면 데이터 기반 단위 테스트 코딩을 참조하십시오.

단위 테스트 결과

다음과 같은 세 가지 방법으로 단위 테스트 성공 여부를 확인할 수 있습니다.

  • 하나 이상의 Assert 문을 사용하여 특정 결과의 유효성을 검사합니다. 자세한 내용은 Assert 문 사용을 확인하십시오.

  • 예외가 throw되었는지 여부를 확인합니다. 이 경우에도 하나 이상의 Assert 문을 사용하는 것이 좋습니다.

  • 특정 예외가 throw되는지 확인합니다. 이 작업은 ExpectedExceptionAttribute 특성을 사용하여 수행할 수 있습니다.

Assert 문 사용

테스트에서 생성되는 성공 또는 실패 결과가 테스트가 완료해야 하는 작업보다 중요한 경우 해당 테스트 코드에 하나 이상의 Assert 문을 사용해야 합니다.

테스트 엔진은 모든 단위 테스트가 성공 상태에서 시작하는 것으로 가정합니다. Assert 문이 상태를 성공에서 실패 또는 결과를 작성할 수 없음으로 변경하여 성공 상태와 충돌하는 결과를 생성할 때까지 또는 ExpectedExceptionAttribute 특성에 지정되지 않은 예외가 throw될 때까지 테스트는 성공 상태를 유지합니다. 즉, Assert 문이 사용되지 않은 단위 테스트는 실행될 때마다 성공 결과를 생성합니다. 이 테스트가 항상 쓸모 없는 것은 아닙니다. 코드가 예외를 throw하지 않고 실행되는지 확인하려는 경우에 이 테스트가 유용합니다. 단위 테스트에서 실행된 코드는 테스트에서 명확한 결과가 생성되었는지 여부나 테스트에 Assert 문이 포함되어 있는지 여부에 상관없이 코드 검사 통계에 포함되어 보고됩니다.

그러나 특정 작업이 수행 중인지 또는 특정 상태에 도달했는지 여부를 확인하려면 Asserts를 사용해야 합니다. Microsoft.VisualStudio.TestTools.UnitTesting 네임스페이스에서는 Assert 문을 여러 개 사용할 수 있습니다. 다양한 Assert 문을 사용하면 융통성 있게 작업을 수행할 수 있습니다. 예를 들어, Assert.Fail() 문을 사용하여 강제로 테스트가 실패하도록 할 수 있습니다. 이러한 Assert 문 외에도 if 블록에서 Assert 문을 사용하여 고유한 사용자 지정 기능을 구성할 수 있습니다.

테스트에서 반환되는 결과에 관계없이 Assert 문에 따라 테스트의 성공 여부가 결정됩니다. 단일 테스트에 Asserts 문이 여러 개 포함되어 있는 경우 상태를 실패 또는 결과를 작성할 수 없음으로 변경하는 Assert 문이 발견될 때까지 테스트 상태가 성공으로 유지됩니다.

자세한 내용은 Assert 클래스 사용을 참조하십시오.

참고 항목

참조

Microsoft.VisualStudio.TestTools.UnitTesting

기타 리소스

단위 테스트 만들기