본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

ASP.NET Core 문서
ASP.NET Core
ASP.NET Core 시작하기프로젝트 구조와 설정핵심 개념데이터, 검증, 인증테스트배포
토론

ASP.NET Core 안내서 · 5/6

테스트

ASP.NET Core 앱은 보통 두 단계로 테스트합니다. 서비스와 로직을 검사하는 단위 테스트, 그리고 WebApplicationFactory로 앱 전체를 메모리에 띄워 검사하는 통합 테스트입니다. .NET에서는 xUnit이 가장 널리 쓰이며, NUnit과 MSTest도 같은 방식으로 동작합니다.

테스트 프로젝트 만들기

dotnet new xunit -o tests/TodoApi.Tests
dotnet add tests/TodoApi.Tests/TodoApi.Tests.csproj reference src/TodoApi/TodoApi.csproj
dotnet add tests/TodoApi.Tests/TodoApi.Tests.csproj package Microsoft.AspNetCore.Mvc.Testing
dotnet sln add tests/TodoApi.Tests/TodoApi.Tests.csproj
dotnet test

dotnet test는 솔루션의 모든 테스트 프로젝트를 빌드하고 실행합니다. 편집기의 테스트 탐색기에서도 같은 테스트가 보입니다.

단위 테스트

일반 클래스는 웹 호스트 없이 바로 테스트할 수 있습니다.

public static class Slug
{
    public static string Create(string title) =>
        string.Join('-', title.ToLowerInvariant().Split(' ', StringSplitOptions.RemoveEmptyEntries));
}
public class SlugTests
{
    [Fact]
    public void Joins_words_with_hyphens()
    {
        Assert.Equal("hello-asp-net", Slug.Create("Hello ASP NET"));
    }

    [Theory]
    [InlineData("  spaced   out ", "spaced-out")]
    [InlineData("One", "one")]
    public void Normalizes_input(string input, string expected)
    {
        Assert.Equal(expected, Slug.Create(input));
    }
}

[Fact]는 테스트 하나를, [Theory]는 [InlineData] 줄마다 같은 테스트를 반복 실행합니다. 의존성이 있는 서비스는 인터페이스나 TimeProvider 같은 추상화에 의존하게 만들어, 테스트에서 직접 만든 가짜 객체나 NSubstitute, Moq 같은 라이브러리의 대역을 넘길 수 있게 합니다.

WebApplicationFactory로 통합 테스트

Microsoft.AspNetCore.Mvc.Testing 패키지의 WebApplicationFactory<TEntryPoint>는 앱을 메모리 안의 테스트 서버로 띄우고 HttpClient를 건네줍니다. 실제 Program.cs, 설정, DI를 그대로 쓰므로 라우팅, 미들웨어, 직렬화까지 함께 검사됩니다.

최상위 문을 쓰면 컴파일러가 만드는 Program 클래스가 public이 아닙니다. 최신 SDK는 아래 선언을 자동으로 만들어 주기도 하지만, Program.cs 끝에 직접 적어 두면 어느 버전에서나 동작합니다.

public partial class Program { }
using System.Net;
using System.Net.Http.Json;
using Microsoft.AspNetCore.Mvc.Testing;

public class TodoApiTests(WebApplicationFactory<Program> factory)
    : IClassFixture<WebApplicationFactory<Program>>
{
    [Fact]
    public async Task Get_unknown_todo_returns_404()
    {
        var client = factory.CreateClient();

        var response = await client.GetAsync("/todos/999");

        Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
    }

    [Fact]
    public async Task Post_then_get_returns_the_todo()
    {
        var client = factory.CreateClient();

        var created = await client.PostAsJsonAsync("/todos", new { title = "Write tests" });
        created.EnsureSuccessStatusCode();
        var todo = await created.Content.ReadFromJsonAsync<Todo>();

        var fetched = await client.GetFromJsonAsync<Todo>($"/todos/{todo!.Id}");
        Assert.Equal("Write tests", fetched!.Title);
    }
}

IClassFixture는 테스트 클래스마다 앱을 하나 만들어 그 클래스의 테스트끼리 공유하므로, 테스트가 서로의 데이터에 기대지 않도록 작성합니다.

테스트 호스트 바꾸기

WebApplicationFactory를 상속하면 환경을 정하거나 서비스를 바꿔 끼울 수 있습니다. ConfigureTestServices는 앱 자체의 서비스 등록이 끝난 뒤에 실행됩니다.

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Time.Testing;

public class TodoApiFactory : WebApplicationFactory<Program>
{
    public FakeTimeProvider Time { get; } = new();

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.UseEnvironment("Testing");
        builder.ConfigureTestServices(services =>
        {
            services.RemoveAll<TimeProvider>();
            services.AddSingleton<TimeProvider>(Time);
        });
    }
}

FakeTimeProvider는 Microsoft.Extensions.TimeProvider.Testing 패키지에 있으며, 테스트에서 Time.Advance(...)로 시계를 앞당길 수 있습니다. 데이터베이스는 Testing 환경이 버려도 되는 별도 데이터베이스를 가리키게 하거나, Testcontainers로 Docker에서 실제 데이터베이스를 띄워 씁니다.

dotnet test --filter "FullyQualifiedName~TodoApiTests"
dotnet test --collect:"XPlat Code Coverage"

정리

  • dotnet new xunit으로 xUnit 프로젝트를 만들고 dotnet test로 실행합니다.
  • 서비스는 직접 단위 테스트하고, 의존성은 바꿔 끼울 수 있게 설계합니다.
  • WebApplicationFactory<Program>는 통합 테스트를 위해 실제 앱을 메모리에 띄웁니다.
  • 직접 만든 팩터리에서 ConfigureTestServices로 환경과 서비스를 바꿉니다.
이 장에 대해 질문이 있나요?
이전 장데이터, 검증, 인증다음 장배포

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.