[C#/COMMON/NUNIT] NUnit 단위 테스트 사용하기


■ NUnit 단위 테스트를 사용하는 방법을 보여준다.

1. 설치

– 아래 링크에서 비주얼 스튜디오 확장을 다운로드 받아 설치한다.

URL

2. 작성 규칙

2.1 구성 규칙

– 각각 프로젝트에 대해 1:1로 테스트 프로젝트를 작성한다.
– 각각의 public 클래스에 대해 1:1로 테스트 클래스를 작성한다.
– 메소드가 없는 모델 클래스의 경우 별도로 테스트 클래스를 작성하지 않고 기능 클래스에 의해 같이 테스트되도록 한다.
– 각각의 public 메소드에 대해 최소 1개 이상의 테스트 메소드를 작성한다.
– public 메소드가 아닌 경우 public 메소드에 의해 같이 테스트되도록 작성한다.

2.2 명명 규칙

◆ 프로젝트명 및 어셈블리명 : 테스트하려는 프로젝트에 .Test를 추가한다.

구문

◆ 클래스명 : 테스트하려는 클래스명에 Test 접미어를 추가한다.

구문

◆ 메소드명 : 테스트하려는 메소드명에 Test 접미어를 추가한다.

구문

◆ 만약 하나의 메소드에 대해 여러 테스트 케이스를 적용할 경우, 메소드명의 접미어로 언더스코어(_)와 [설명]을 추가한다.

구문

3. 작성 가이드

예제 기준으로 작성 방법을 설명한다.

3.1 테스트 클래스 자동 생성

Visual Studio 편집 창에서 테스트 클래스를 생성하려는 대상 클래스 내부에서 마우스 오른쪽 버튼을 클릭해 컨텍스트 메뉴를 열고 [단위 테스트 만들기] 메뉴를 선택한다.

[단위 테스트 만들기] 대화 상자에서 아래와 같이 선택한다.

※ 한번 설정하면 Visual Studio를 다시 열기 전까지 설정이 유지된다.

[확인] 버튼을 누르면 다음과 같이 자동으로 테스트 클래스가 생성되고, 테스트 프로젝트가 없는 경우 프로젝트까지 자동 생성된다.

예제 코드 (C#)

3.2 기본 예제

아래는 간단한 단위 테스트 코드 작성 예제이다.

테스트 대상 클래스 코드 (C#)

※ 위와 같이 테스트 결과를 검증할 때는 NUnit3에 추가된 Assert.That 메소드를 사용한다.
※ 가급적 NUnit2까지 사용하던 Assert.AreEqual, Assert.IsTrue 등 메소드 사용을 지양하고 확장성이 높은 Assert.That 메소드로 통일하여 사용한다.

3.3 Assert 사용하기

Assert.That은 위의 예제 외에도 다음과 같이 다양하게 사용할 수 있다.

예제 코드 (C#)

테스트 하려는 코드가 예외를 발생시키는 경우, 다음 코드로 확인한다.

예제 코드 (C#)

3.4 초기화 기능 설정

다음과 같이 필요에 따라 테스트시 코드 초기화 및 정리 기능을 사용할 수 있다.

예제 코드 (C#)

3.5 TestCase 특성 사용

다음과 같이 TestCase 특성을 이용하여 동일한 테스트 함수를 여러번 사용할 수도 있다.

아래 예제에서는 테스트 사례별로 NumberTest 메소드가 4번 호출되며, NumberTest 메소드의 반환값과 TestCase 특성의 ExpectedResult 인자값을 비교하여 값이 동일한 경우만 테스트를 통과한다.

예제 코드 (C#)

3.6 TestFixture 특성 사용

테스트 클래스에 TestFixture 특성을 이용해 위와 유사하게 테스트 클래스를 재활용하여 테스트를 반복 수행할 수도 있다.

URL

3.7 Moq 설치 및 사용

Moq 누겟 참조를 추가한다.

Moq를 사용하면 메소드나 속성이 특정 값을 리턴하거나 예외를 발생시키도록 흉내(mock)내어, 테스트 시나리오를 자동화하고 코드 커버리지를 증가시키는데 도움을 준다.

다음은 VPN 클라이언트를 실행하지 않고도 VPN 클라이언트가 실행된 것처럼 테스트하는 예제이다.

예제 코드 (C#)

다음과 같이 특정 메소드가 예외를 발생시키도록 설정할 수도 있다.

예제 코드 (C#)

※ 주의 : Moq를 적용할 수 있는 멤버의 접근 한정자는 최소한 protected virtual이어야 한다.

Mock 인스턴스를 자주 생성하는 경우, 다음과 같이 MockRepository를 이용하여 생성하여 CallBase 값을 매번 설정하는 코드를 제거할 수도 있다.

예제 코드 (C#)