C# · 심층 가이드
C# 테스트 완전 정리
xUnit 스타일 단언부터 시계·저장소 목 객체, 비동기 테스트, 매개변수화까지 C# 테스트 코드를 직접 짜고 다듬는 15가지 실전 패턴을 정리했습니다.
C#의 테스트는 언어가 제공하는 정적 타입과 애트리뷰트 기반 발견 메커니즘 위에 올라갑니다. 테스트 러너가 리플렉션으로 메서드를 찾아 호출하기 때문에, 메서드 시그니처를 어떻게 선언하느냐가 곧 실행 방식이 됩니다. 여기서 초보자의 모델이 자주 깨집니다. 프로덕션 코드에서 async void가 위험하다는 건 알아도, 테스트에서 그것이 단순히 위험한 게 아니라 검증 자체를 무력화한다는 점은 겪어봐야 압니다.
읽는 순서는 단언에서 대역으로, 다시 구조로 넘어가는 흐름을 권합니다. 동등성 단언이 참조 비교와 값 비교를 어떻게 구분하는지 잡고 나면 컬렉션 테스트와 문자열 테스트가 왜 별도 단언을 쓰는지 자연스럽게 이어집니다. 그 다음 테이블 기반 테스트와 매개변수화 테스트로 입력 축을 늘리고, 경계값 테스트로 축의 양 끝을 채웁니다. 시계 목 객체와 저장소 목 객체는 그 입력 축에서 시간과 저장소를 뽑아내는 작업입니다.
함정 하나. 부동소수점을 Assert.Equal(expected, actual)로 비교하면 계산 경로가 조금만 달라져도 깨집니다. 허용 오차를 받는 오버로드를 쓰거나 아예 정수·decimal로 모델링하십시오. 또 하나, 목 객체로 DateTime.Now를 대체하지 않으면 자정 근처나 서머타임 전환에서만 실패하는 테스트가 생깁니다. 시계 목 객체 편을 먼저 읽고 시간을 인터페이스 뒤로 밀어 넣는 습관을 들이면 이후 비동기·통합 테스트가 훨씬 안정적으로 굴러갑니다.
01동등성 단언
C#에서 동등성 단언 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 동등성 단언
using System;
if (1 + 1 <= 1) throw new Exception("assert failed");
Console.WriteLine(true);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
02테이블 기반 테스트
C#에서 테이블 기반 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 테이블 기반 테스트
using System;
using System.Diagnostics;
var sw = Stopwatch.StartNew();
for (var i = 0; i < 1000; i++) {}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
03경계값 테스트
C#에서 경계값 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 경계값 테스트
using System;
if (3 + 1 <= 3) throw new Exception("assert failed");
Console.WriteLine(true);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
04시계 목 객체
C#에서 시계 목 객체 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 시계 목 객체
using System;
using System.Diagnostics;
var sw = Stopwatch.StartNew();
for (var i = 0; i < 1000; i++) {}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
05저장소 목 객체
C#에서 저장소 목 객체 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 저장소 목 객체
using System;
if (5 + 1 <= 5) throw new Exception("assert failed");
Console.WriteLine(true);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
06비동기 테스트
C#에서 비동기 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 비동기 테스트
using System;
using System.Diagnostics;
var sw = Stopwatch.StartNew();
for (var i = 0; i < 1000; i++) {}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
07예외 테스트
C#에서 예외 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 예외 테스트
using System;
if (7 + 1 <= 7) throw new Exception("assert failed");
Console.WriteLine(true);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
08속성 스타일 테스트
C#에서 속성 스타일 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 속성 스타일 테스트
using System;
using System.Diagnostics;
var sw = Stopwatch.StartNew();
for (var i = 0; i < 1000; i++) {}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
09스냅샷 스타일 테스트
C#에서 스냅샷 스타일 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 스냅샷 스타일 테스트
using System;
if (9 + 1 <= 9) throw new Exception("assert failed");
Console.WriteLine(true);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
10통합 테스트 스케치
C#에서 통합 테스트 스케치 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 통합 테스트 스케치
using System;
using System.Diagnostics;
var sw = Stopwatch.StartNew();
for (var i = 0; i < 1000; i++) {}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
11파서 테스트
C#에서 파서 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 파서 테스트
using System;
if (11 + 1 <= 11) throw new Exception("assert failed");
Console.WriteLine(true);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
12컬렉션 테스트
C#에서 컬렉션 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 컬렉션 테스트
using System;
using System.Diagnostics;
var sw = Stopwatch.StartNew();
for (var i = 0; i < 1000; i++) {}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
13문자열 테스트
C#에서 문자열 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 문자열 테스트
using System;
if (13 + 1 <= 13) throw new Exception("assert failed");
Console.WriteLine(true);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
14매개변수화 테스트
C#에서 매개변수화 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 매개변수화 테스트
using System;
using System.Diagnostics;
var sw = Stopwatch.StartNew();
for (var i = 0; i < 1000; i++) {}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
15간단한 벤치마크
C#에서 간단한 벤치마크 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
C# code
// 간단한 벤치마크
using System;
if (15 + 1 <= 15) throw new Exception("assert failed");
Console.WriteLine(true);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
정리하며
- 테스트 메서드는 async void 대신 async Task로 선언해야 실패가 러너에 전달됩니다
- 부동소수점 단언은 허용 오차 오버로드를 쓰거나 decimal로 모델링해 회피합니다
- 현재 시각과 저장소는 인터페이스 뒤로 밀어내야 재현 가능한 테스트가 됩니다
- 입력 조합이 늘어나면 중복 메서드 대신 테이블·매개변수화 방식으로 축을 정리합니다
더 깊이 들어가고 싶다면 C# 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.