본문 바로가기
C#

C#으로 유닛 테스트 작성하기: TDD와 NUnit 🧪✅

by 다다면체 2024. 12. 17.
728x90
반응형
반응형

소프트웨어 개발에서 품질을 보장하는 핵심 요소 중 하나는 테스트입니다. 🛡️ 특히 유닛 테스트와 테스트 주도 개발(TDD)은 버그를 줄이고 안정성을 높이는 데 중요한 역할을 합니다. 이번 글에서는 NUnit을 활용해 C#에서 유닛 테스트를 작성하는 방법과 Mocking 라이브러리인 Moq를 소개하며, TDD 접근법에 대해 알아보겠습니다. ✨


1. 유닛 테스트의 중요성

유닛 테스트(Unit Test)는 프로그램의 개별 구성 요소(유닛)를 검증하는 테스트입니다. 이를 통해 코드가 기대한 대로 작동하는지 확인할 수 있습니다. ✅

주요 이점

  • 빠른 피드백: 코드 변경 시 발생할 수 있는 문제를 빠르게 발견.
  • 안정성 확보: 코드 수정 후 기존 기능이 제대로 작동하는지 확인.
  • 리팩토링 지원: 안전하게 코드 구조를 개선할 수 있는 기반 마련.

2. NUnit을 이용한 테스트 작성

NUnit은 C#에서 널리 사용되는 유닛 테스트 프레임워크입니다. 간단한 설치 후 테스트를 작성하고 실행할 수 있습니다. 🎯

설치 방법

NuGet 패키지 관리자를 사용해 NUnit과 NUnit3TestAdapter를 설치합니다.

Install-Package NUnit
Install-Package NUnit3TestAdapter

기본 테스트 작성

다음은 NUnit으로 간단한 테스트를 작성하는 예제입니다:

예제 코드

using NUnit.Framework;

[TestFixture] // 테스트 클래스
public class CalculatorTests
{
    [Test] // 테스트 메서드
    public void Add_ShouldReturnSumOfTwoNumbers()
    {
        // Arrange
        var calculator = new Calculator();
        
        // Act
        int result = calculator.Add(3, 5);
        
        // Assert
        Assert.AreEqual(8, result, "Addition result should be 8.");
    }
}

public class Calculator
{
    public int Add(int a, int b) => a + b;
}

🛠️ Tip: Assert 메서드를 활용해 결과를 검증합니다.


3. Moq를 이용한 Mocking

Moq는 테스트에서 의존성을 모킹(Mock)하기 위한 라이브러리입니다. 복잡한 의존성을 제거하고 특정 동작만 테스트할 수 있도록 도와줍니다. 💡

설치 방법

NuGet을 사용해 Moq를 설치합니다:

Install-Package Moq

사용 예시

다음은 Moq를 활용해 인터페이스를 모킹하는 예제입니다:

예제 코드

using Moq;
using NUnit.Framework;

public interface INotificationService
{
    void Notify(string message);
}

public class UserManager
{
    private readonly INotificationService _notificationService;

    public UserManager(INotificationService notificationService)
    {
        _notificationService = notificationService;
    }

    public void CreateUser(string username)
    {
        // 유저 생성 로직
        _notificationService.Notify($"User {username} created.");
    }
}

[TestFixture]
public class UserManagerTests
{
    [Test]
    public void CreateUser_ShouldSendNotification()
    {
        // Arrange
        var mockNotificationService = new Mock<INotificationService>();
        var userManager = new UserManager(mockNotificationService.Object);

        // Act
        userManager.CreateUser("JohnDoe");

        // Assert
        mockNotificationService.Verify(ns => ns.Notify("User JohnDoe created."), Times.Once);
    }
}

🎯 Key Point: Verify 메서드로 특정 메서드 호출 여부를 검증할 수 있습니다.


4. TDD(테스트 주도 개발) 접근법

테스트 주도 개발(Test-Driven Development)은 개발 전 테스트를 먼저 작성하는 방법론입니다. 🔄 TDD의 주기는 다음과 같습니다:

  1. 테스트 작성: 실패할 테스트를 작성합니다. (Red)
  2. 코드 작성: 테스트를 통과하도록 최소한의 코드를 작성합니다. (Green)
  3. 리팩토링: 코드의 품질을 개선합니다. (Refactor)

TDD 실습 예제

요구사항: 숫자를 입력받아 짝수인지 확인하는 기능을 구현

  1. 실패할 테스트 작성
[Test]
public void IsEven_ShouldReturnTrueForEvenNumbers()
{
    var calculator = new Calculator();
    Assert.IsTrue(calculator.IsEven(4)); // 테스트 실패 예상
}
  1. 테스트 통과를 위한 최소 코드 작성
public bool IsEven(int number) => number % 2 == 0;
  1. 리팩토링 (필요 시 코드 개선)
public class Calculator
{
    public bool IsEven(int number)
    {
        return number % 2 == 0;
    }
}

🚀 실전 팁: TDD를 활용하면 코드 품질을 유지하면서 요구사항 변경에도 유연하게 대응할 수 있습니다.


마무리

테스트는 안정적이고 신뢰할 수 있는 소프트웨어를 만드는 데 필수적입니다. 🧪 NUnit과 Moq를 활용해 강력한 유닛 테스트를 작성하고, TDD 방식을 통해 버그 없는 코드를 작성해보세요.

더 나은 품질의 C# 애플리케이션을 만들기 위해 지금 바로 시작하세요! 💪✨

728x90
반응형