NUnit을 사용하여 .NET 단위 테스트 시작
일반적으로 코드를 개발하는 동안 자동화된 단위 테스트를 수행하는 것이 좋습니다. 이렇게 하면 개발 주기 초기에 버그를 찾는 데 도움이 되고 장기적으로 시간을 절약할 수 있습니다.
코드를 개발하는 동안 자동화된 단위 테스트는 좋은 방법으로 간주됩니다. 이렇게 하면 개발 주기 초기에 버그를 찾는 데 도움이 되고 장기적으로 시간을 절약할 수 있습니다. 개발자는 이러한 테스트를 여러 번 실행하여 다른 입력 세트에 대한 특정 코드 단위의 동작을 확인할 수 있습니다.
단위 테스트는 기본적으로 코드 또는 함수의 특정 단위의 동작을 확인하고 기능을 구현하는 개발자가 작성합니다.

우리는 함수가 전체 시스템의 일부가 되기 전에 함수의 동작을 테스트하고 다양한 조건에서 이 동작을 테스트하기 위해 코드를 작성하여 프로덕션에 들어갑니다. 일반적으로 함수는 SUT(테스트 중인 시스템)의 다른 함수와 격리되어 테스트됩니다.
NET에는 단위 테스트를 작성하는 두 가지 옵션이 있습니다.
- MS 테스트 사용
- Using NUnit
이 기사에서는 NUnit을 사용하여 C# 클래스의 단위 테스트를 시작하는 방법을 배웁니다. 우리는 다음을 통해 나아갈 것입니다.
- 테스트 중인 시스템 만들기
- Setting up NUnit
- 테스트 프로젝트 만들기
- Test 클래스 및 메서드 만들기
- 테스트 실행을 위한 다양한 옵션
- Understanding TestFixtures and TestTearDown
- 무시 테스트 작업
System Under Test
이 예에서는 계산기 시스템에 대한 단위 테스트를 작성할 것입니다. 계산기의 인터페이스가 아래 목록과 같이 정의되어 있다고 가정해 보겠습니다.
namespace Calculator { public interface ICalculator { int Add(int num1, int num2); int Mul(int num1, int num2); } }
Calculator 클래스는 아래 목록과 같이 구현됩니다.
namespace Calculator { public class Calculator :ICalculator { public int Add(int num1, int num2) { int result = num1 + num2; return result; } public int Mul(int num1, int num2) { int result = num1 + num2; return result; } } }
의도적으로 Mul 함수를 잘못 구현했음을 알 수 있습니다.
NUnit 작업을 시작하고 테스트를 작성하려면 다음 단계를 따라야 합니다.
- 테스트 프로젝트 만들기
- NUnit 라이브러리에 대한 참조 추가
- 테스트 중인 시스템 프로젝트에 대한 참조 추가
- 테스트 클래스 만들기 및 테스트 메서드 작성
테스트 프로젝트 설정
테스트 프로젝트를 만들려면 아래 목록과 같이 클래스 라이브러리 프로젝트를 추가합니다. 일반적으로 명명 규칙에 따라 테스트 프로젝트의 이름을 ProjectUnderTest.Test로 지정해야 합니다. 여기서는 계산기 프로젝트를 테스트할 것이므로 테스트 프로젝트의 이름은 Calculator.Test 여야 합니다.

테스트 프로젝트가 만들어지면 프로젝트에서 NUnit에 대한 참조를 추가할 수 있는 두 가지 옵션이 있습니다.
- 확장 프로그램 및 업데이트 사용
- NuGet 패키지 사용
확장 및 업데이트를 사용하려면 Tool->Extension 및 업데이트 클릭한 다음 NUnit 테스트 어댑터를 선택합니다.
NuGet 패키지를 사용하려면 프로젝트를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 NuGet 패키지 관리 옵션을 선택합니다. NuGet 패키지 관리자에서 NUnit을 검색하고 아래 이미지와 같이 프로젝트에 VS 및 NUnit용 NUnit 테스트 어댑터를 설치합니다.

NUnit 테스트 어댑터를 설치한 후 NUnit으로 작업할 수 있습니다.
테스트 중인 시스템 프로젝트에 대한 참조 추가
다음으로, 테스트 프로젝트에서 계산기 프로젝트(테스트 중인 시스템)에 대한 참조를 추가해야 합니다. 추가하려면 테스트 프로젝트를 마우스 오른쪽 단추로 클릭하고 계산기 프로젝트에 대한 참조를 추가합니다.

Test 클래스 및 Test 메서드 만들기
계속해서 테스트 클래스와 테스트 메서드를 만들기 전에 테스트 프로젝트의 구조를 이해하겠습니다. SUT 프로젝트 이름이 Calculator이므로 테스트 프로젝트의 이름을 Calculator.Tests로 지정해야 합니다. 테스트 대상 클래스의 이름은 Calculator이므로 테스트 이름은 CalculatorTest여야 합니다. 마지막으로, 테스트 함수의 이름은 테스트 중인 함수의 이름이어야 하며 그 앞에 "should"라는 단어가 추가되어야 합니다. 여기서 아이디어는 테스트 프로젝트, 클래스 및 함수에 읽을 수 있는 이름을 지정하는 것입니다.
SUT 프로젝트와 테스트 프로젝트 간의 관계는 아래 이미지와 같이 설명할 수 있습니다.

다음으로 Test Class와 Test Methods를 만들어 보겠습니다. 다음을 사용해야합니다.
- TestFixture 특성을 사용하여 테스트 클래스를 만듭니다.
- 테스트 메서드를 만들기 위한 Test 속성
테스트 클래스는 아래 목록과 같이 만들 수 있습니다.
using NUnit.Framework; namespace Calculator.Tests { [TestFixture] public class CalculatorTest { [Test] public void ShouldAddTwoNumbers() { ICalculator sut = new Calculator(); int expectedResult = sut.Add(7, 8); Assert.That(expectedResult, Is.EqualTo(15)); } [Test] public void ShouldMulTwoNumbers() { ICalculator sut = new Calculator(); int expectedResult = sut.Mul(7, 8); Assert.That(expectedResult, Is.EqualTo(56)); } } }
위의 목록에서 우리는 다음과 같습니다.
- SUT Calculator 클래스의 개체 만들기
- 메소드 호출하기
- NUnit assert 사용하여 결과 주장 (주장에 대해서는 이후 게시물에서 자세히 설명 할 것입니다)
테스트 프로젝트를 빌드한 후 테스트를 실행해야 합니다.
테스트 실행
테스트를 실행할 수 있는 세 가지 옵션이 있습니다.
- Visual Studio 테스트 탐색기 사용
- NUnit GUI 사용
- NUnit 명령 프롬프트를 사용합니다
Visual Studio Test Explorer
Visual Studio Test Runner를 사용하려면 아래 이미지와 같이 TEST-WINDOWS-TEST EXPLORER 옵션을 클릭하여 테스트 탐색기를 시작합니다.

테스트 탐색기에 나열된 단위 테스트를 볼 수 있어야 합니다. 특정 테스트를 선택하여 실행하거나 모든 테스트를 실행하도록 선택할 수 있습니다. Calculator.Tests 프로젝트의 테스트를 실행한 후 테스트 탐색기에서 아래 이미지와 같이 결과를 볼 수 있습니다. ShouldAddTwoNumbers 테스트는 통과한 반면 ShouldMulTwoNumbers 테스트는 실패했음을 알 수 있습니다(예상됨).

NUnit GUI
NUnit GUI의 MSI는 여기에서 다운로드할 수 있습니다. 다운로드가 완료되면 NUnit GUI를 설치하고 파일 메뉴에서 프로젝트 열기 옵션을 선택한 다음 Calculator.Test 프로젝트에 DLL을 추가합니다. DLL을 추가한 후 UI에 로드된 테스트를 볼 수 있어야 합니다. 테스트를 실행하려면 실행을 선택하고 클릭합니다. NUnit UI에서 실패한 테스트에 대한 메시지를 명확하게 볼 수 있습니다.

NUnit 명령 프롬프트
테스트를 실행하는 세 번째 옵션은 NUnit 명령 프롬프트를 사용하는 것입니다. Program Files 아래의 NUnit\Bin 폴더로 이동하고(해당 위치는 선택한 설치 경로에 따라 다름) 파일을 nunit-console.exe 실행합니다. 큰따옴표로 묶으면 아래 이미지와 같이 테스트를 실행하기 위한 두 번째 매개 변수로 테스트 프로젝트 dll의 전체 경로를 전달해야 합니다.

NUnit 명령 프롬프트 옵션은 연속 통합에 매우 유용합니다.
TestFixtureSetUp 및 TestFixtureTearDown
NUnit 테스트의 두 가지 매우 중요한 개념은 Test Setup과 Teardown입니다. Calculator.Test에서는 두 테스트 모두에서 SUT 계산기의 개체를 만듭니다. 이것은 올바른 관행이 아닙니다. 테스트를 실행하기 전에 테스트에 필요한 모든 개체를 만들어야 합니다. 다른 시나리오는 다음과 같습니다.
- 첫 번째 테스트를 실행하기 전에 데이터베이스 연결을 만듭니다.
- 첫 번째 테스트를 실행하기 전에 특정 개체의 인스턴스를 만듭니다.
- 모든 테스트를 실행한 후 데이터베이스에 대한 모든 연결을 삭제합니다.
- 테스트를 실행하기 전에 시스템에서 특정 파일을 삭제합니다.
TestFixtureSetUp 및 TestFixtureTearDown을 사용하여 위의 시나리오를 해결할 수 있습니다. TestFixtureSetUp은 테스트를 실행하기 전에 실행되는 코드이고, TestFixtureTearDown은 모든 테스트를 실행한 후에 실행되는 코드 조각입니다.

Calculator.Test를 고려해 보겠습니다. 두 테스트 모두에서 SUT 계산기의 개체를 만듭니다. 반면 테스트를 실행하기 전에 Calculator 클래스의 개체가 필요하고 모든 테스트를 실행한 후에 이를 처리해야 합니다. 아래 목록과 같이 SetUp 및 TearDown과 같이 테스트 클래스를 수정할 수 있습니다.
using NUnit.Framework; namespace Calculator.Tests { [TestFixture] public class CalculatorTest { ICalculator sut; [TestFixtureSetUp] public void TestSetup() { sut = new Calculator(); } [Test] public void ShouldAddTwoNumbers() { int expectedResult = sut.Add(7, 8); Assert.That(expectedResult, Is.EqualTo(15)); } [Test] public void ShouldMulTwoNumbers() { int expectedResult = sut.Mul(7, 8); Assert.That(expectedResult, Is.EqualTo(56)); } [TestFixtureTearDown] public void TestTearDown() { sut = null; } } }
위의 목록에서 다음을 확인할 수 있습니다.
- [TestFixtureSetUp]에 귀속되는 함수가 있습니다. 이 함수는 테스트를 실행하기 전에 실행됩니다. 생성된 인스턴스를 모든 테스트에서 사용할 수 있도록 이 함수 내에 SUT Calculator의 개체를 만들고 있습니다.
- [TestFixtureTearDown]에 속성이 지정된 함수가 있습니다. 이 함수는 모든 테스트가 실행된 후에 실행됩니다. 이 함수 내에서 SUT Calculator의 개체를 배치하고 있습니다.
테스트 무시
테스트를 실행하는 동안 발생할 수 있는 또 다른 시나리오는 실행할 특정 테스트를 무시할 수 있다는 것입니다. 예를 들어 세 개의 테스트가 있고 나머지 테스트를 실행하는 동안 테스트 중 하나를 무시하려고 합니다. 이 작업은 [ignore] 속성으로 테스트를 무시하도록 하여 수행할 수 있습니다.
아래 목록에 표시된 것처럼 테스트를 무시할 수 있습니다.
[Test] [Ignore] public void ShouldNotMulTwoNumbers() { int expectedResult = sut.Mul(7, 8); Assert.That(expectedResult, Is.EqualTo(15)); }
테스트 탐색기에서 모든 테스트를 실행하면 무시된 테스트에 대해 아래 이미지와 같은 메시지가 표시됩니다.

결론
이 기사에서는 .NET에서 NUnit을 사용하여 단위 테스트를 시작했습니다. 아래 요점과 같이 NUnit을 사용하여 Unit Testing의 다양한 구성 요소에 대해 배웠습니다.
- 테스트 중인 시스템 만들기
- Setting up NUnit
- 테스트 프로젝트 만들기
- Test 클래스 및 메서드 만들기
- 테스트 실행을 위한 다양한 옵션
- Understanding TestFixtures and TestTearDown
- 무시 테스트 작업
이 기사가 단위 테스트를 시작하는 데 도움이 되기를 바랍니다 – 읽어 주셔서 감사하고 즐거운 코딩 해 주셔서 감사합니다!
