단위 테스트(Unit Test)는 프로그램의 개별 모듈(함수, 메서드, 클래스 등)이 의도한 대로 동작하는지 검증하는 테스트입니다. 주로 개발 초기 단계에서 작성하여, 코드 변경 시 오류를 빠르게 발견하고 유지보수를 쉽게 만들어 줍니다.
C# 개발 환경에서는 다양한 테스트 프레임워크를 사용할 수 있습니다. 대표적으로 MSTest, xUnit, NUnit이 있으며, 이 중 NUnit은 강력한 기능과 유연한 구성을 지원해 많은 개발자들이 선호합니다.
프레임워크 | 특징 | 설치 방법 |
---|---|---|
MSTest | Microsoft 공식 지원 | 기본 제공 |
xUnit | 최신 .NET과 잘 통합됨 | NuGet 설치 |
NUnit | 다양한 기능과 유연한 구조 | NuGet 설치 |
NUnit은 C# 개발에서 널리 사용되는 단위 테스트 프레임워크입니다. 간결한 문법과 풍부한 어트리뷰트를 제공하여, 효율적인 테스트 코드를 작성할 수 있습니다.
주요 특징:
[Test]
, [TestCase]
, [SetUp]
등)JustMock은 Telerik에서 제공하는 Mocking Framework로, 의존성이 있는 객체나 외부 리소스를 Mock 처리하여 독립적인 테스트를 가능하게 합니다.
주요 특징:
public class Calculator
{
public int Add(int a, int b) => a + b;
public int Divide(int a, int b)
{
if (b == 0) throw new DivideByZeroException("0으로 나눌 수 없습니다.");
return a / b;
}
}
using NUnit.Framework;
[TestFixture]
public class CalculatorTests
{
private Calculator calculator;
[SetUp]
public void Setup()
{
calculator = new Calculator();
}
[Test]
public void Add_TwoNumbers_ReturnsSum()
{
var result = calculator.Add(2, 3);
Assert.AreEqual(5, result);
}
[Test]
public void Divide_ByZero_ThrowsException()
{
Assert.Throws<DivideByZeroException>(() => calculator.Divide(10, 0));
}
}
using Telerik.JustMock;
using NUnit.Framework;
public interface IDataService
{
string GetData();
}
public class DataProcessor
{
private readonly IDataService _dataService;
public DataProcessor(IDataService dataService)
{
_dataService = dataService;
}
public string ProcessData()
{
return _dataService.GetData().ToUpper();
}
}
[TestFixture]
public class DataProcessorTests
{
[Test]
public void ProcessData_ReturnsUpperCaseData()
{
var mockService = Mock.Create<IDataService>();
Mock.Arrange(() => mockService.GetData()).Returns("test data");
var processor = new DataProcessor(mockService);
var result = processor.ProcessData();
Assert.AreEqual("TEST DATA", result);
}
}
[TestFixture]
: 테스트 클래스 지정
[Test]
: 테스트 메서드 지정
[TestCase]
: 다양한 입력값으로 테스트
예제:
[TestCase(1, 2, 3)]
[TestCase(-1, -1, -2)]
[TestCase(0, 0, 0)]
public void Add_TestCases_ReturnsExpectedResult(int a, int b, int expected)
{
var result = calculator.Add(a, b);
Assert.AreEqual(expected, result);
}
[TestCaseSource]
: 외부 데이터 소스를 활용한 테스트
예제:
private static object[] DivideTestCases =
{
new object[] { 10, 2, 5 },
new object[] { 9, 3, 3 },
new object[] { 15, 5, 3 }
};
[TestCaseSource(nameof(DivideTestCases))]
public void Divide_WithTestCaseSource_ReturnsExpectedResult(int a, int b, int expected)
{
var result = calculator.Divide(a, b);
Assert.AreEqual(expected, result);
}
[SetUp]
: 테스트 실행 전 초기화
[TearDown]
: 테스트 실행 후 정리
[Ignore]
: 테스트 제외
[Category]
: 테스트 분류
Ctrl + R, A
dotnet test
단위 테스트는 코드 품질을 높이고 안정성을 유지하는 데 필수적인 도구입니다. NUnit과 JustMock을 활용해 효율적이고 체계적인 테스트를 작성해보세요!