본문 바로가기
C# & .NetCore

XUnit을 이용한 테스트

by 개발자 포비 2025. 11. 3.

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로 대체
  • 상태 공유 금지

댓글