xUnit 사용법 요약
1. 개요
xUnit은 .NET 환경에서 가장 널리 사용되는 단위 테스트 프레임워크 중 하나입니다.
간결하고 확장성이 좋아, 실무에서도 가장 자주 활용됩니다.
2. 기본 개념
| 항목 |
설명 |
| 목적 |
코드 단위(함수, 클래스 등)를 독립적으로 검증 |
| 특징 |
Attribute 기반, DI 지원, 병렬 실행 가능 |
| 주요 패키지 |
xunit, xunit.runner.visualstudio, Microsoft.NET.Test.Sdk |
3. 설치
dotnet new xunit -n MyProject.Tests
dotnet add package xunit
dotnet add package xunit.runner.visualstudio
dotnet add package Microsoft.NET.Test.Sdk
4. 기본 구조
using Xunit;
public class CalculatorTests
{
[Fact]
public void Add_ShouldReturnSum()
{
var calc = new Calculator();
int result = calc.Add(2, 3);
Assert.Equal(5, result);
}
}
5. Theory / InlineData
public class MathTests
{
[Theory]
[InlineData(2, 3, 5)]
[InlineData(-1, 1, 0)]
[InlineData(10, 5, 15)]
public void Add_ShouldWorkForVariousInputs(int a, int b, int expected)
{
var calc = new Calculator();
Assert.Equal(expected, calc.Add(a, b));
}
}
6. Setup / Teardown
public class DatabaseTests : IDisposable
{
private readonly Database _db;
public DatabaseTests()
{
_db = new Database();
_db.Connect();
}
[Fact]
public void Query_ShouldReturnExpectedData()
{
var result = _db.Query("SELECT * FROM Users");
Assert.NotEmpty(result);
}
public void Dispose()
{
_db.Dispose();
}
}
7. Fixture 예시
public class DatabaseFixture : IDisposable
{
public Database Db { get; }
public DatabaseFixture()
{
Db = new Database();
Db.Connect();
}
public void Dispose() => Db.Dispose();
}
public class UserTests : IClassFixture<DatabaseFixture>
{
private readonly DatabaseFixture _fixture;
public UserTests(DatabaseFixture fixture)
{
_fixture = fixture;
}
[Fact]
public void UserCount_ShouldBePositive()
{
var count = _fixture.Db.GetUserCount();
Assert.True(count > 0);
}
}
8. 실행
dotnet test
9. 주요 Assert 메서드
| 메서드 |
설명 |
| Assert.Equal(a, b) |
두 값이 같은지 비교 |
| Assert.NotEqual(a, b) |
두 값이 다른지 비교 |
| Assert.True(condition) |
조건이 true인지 확인 |
| Assert.False(condition) |
조건이 false인지 확인 |
| Assert.Null(obj) |
null 확인 |
| Assert.NotNull(obj) |
null 아님 확인 |
| Assert.Throws(action) |
예외 발생 확인 |
10. 예외 검증
[Fact]
public void Divide_ShouldThrowException_WhenDivideByZero()
{
var calc = new Calculator();
Assert.Throws<DivideByZeroException>(() => calc.Divide(10, 0));
}
11. 정리
| 개념 |
내용 |
| [Fact] |
독립 테스트 메서드 |
| [Theory] + [InlineData] |
데이터 기반 반복 테스트 |
| 생성자 / Dispose |
Setup / Teardown 역할 |
| IClassFixture |
공용 리소스 공유 |
| Assert |
검증 도구 |
| dotnet test |
테스트 실행 명령 |
12. 간단한 예제 (의존성 없는 서비스)
public class UserService
{
public bool IsAdult(int age) => age >= 19;
}
using Xunit;
public class UserServiceTests
{
private readonly UserService _sut = new();
[Theory]
[InlineData(19, true)]
[InlineData(18, false)]
public void IsAdult_ReturnsExpected(int age, bool expected)
{
var ok = _sut.IsAdult(age);
Assert.Equal(expected, ok);
}
}
13. 요약
- 테스트 클래스: 서비스 1개당 1개 파일 (
UserServiceTests.cs)
- 메서드명:
메서드명_조건_결과
- 한 테스트는 한 가지 검증만 수행
- 외부 의존성은 Fake로 대체
- 상태 공유 금지
댓글