ASP.NET Core 통합 테스트 소개

이 게시물에서는 ASP.NET Core 컨트롤러를 테스트하는 방법에 대해 간략하게 소개합니다.

"통합 테스트"라는 용어는 데이터 액세스 테스트 또는 파일 시스템 액세스와 같은 다른 경우도 포함합니다.

프로젝트 설정



일반적인 지침은 다음과 같은 방식으로 ASP.NET Core 프로젝트를 구성하는 것입니다.

.
├── src
│   └── MyProject.Api
│       └── Controllers
│           └── ValuesController
└── test
    ├── IntegrationTests
    │   └── MyProject.Api.Test
    │       └── ValuesControllerTest
    └── UnitTests

TestHost NuGet 설치



.NET Core 테스트 프로젝트를 만든 다음 Microsoft.AspNetCore.TestHost 패키지를 설치합니다.
이 패키지는 TestServer를 구성하는 옵션을 제공합니다.
> Install-Package Microsoft.AspNetCore.TestHost

기본 클래스 만들기


ControllerTest 클래스가 상속할 수 있는 기본 클래스를 만듭니다. 요청을 수행하는 데 사용되는 TestServerHttpClient를 설정합니다.

[TestClass]
public abstract class IntegrationTestInitializer
{
    protected HttpClient _client;

    [TestInitialize]
    public void Setup()
    {
        var builder = new WebHostBuilder()
            .UseStartup<Startup>();
        var server = new TestServer(builder);

        _client = server.CreateClient();
    }
}

ControllerTest 만들기



테스트하려는 컨트롤러가 다음과 같다고 가정해 보겠습니다.

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

기본 클래스가 설정되면 기본 클래스에서 간단하게 상속하고 _client를 사용하여 API에 대한 요청을 수행할 수 있습니다.

[TestClass]
public class ValuesControllerTest : IntegrationTestInitializer
{
    [TestMethod]
    public async Task CanGetValues()
    {
        List<string> expectedResponse = new List<string> { "value1", "value2" };

        var responseJson = await _client.GetStringAsync("api/values");
        List<string> actualResponse = JsonConvert.DeserializeObject<List<string>>(responseJson);

        Assert.AreEqual(expectedResponse.Count, actualResponse.Count);
        foreach(var expectedValue in expectedResponse)
        {
            Assert.IsTrue(actualResponse.Contains(expectedValue));
        }
    }
}

이 게시물에서는 매우 기본적인 ASP.NET Core API를 통합 테스트하는 방법을 설명했습니다.

실제로는 액세스해야 하는 API 뒤에 데이터베이스가 있을 수 있으며 일부 엔드포인트는 API 키 또는 JWT로 보호될 수도 있습니다.
그러나이 게시물은 통합 테스트에 대한 빠른 소개 역할만 해야 합니다.


kai-ostwald / 통합 테스트 샘플


통합 테스트 작성 방법을 보여주는 ASP.NET Core 샘플 프로젝트





통합테스트샘플


컨트롤러에 대한 통합 테스트 방법을 보여주는 ASP.NET Core 샘플 프로젝트


View on GitHub

좋은 웹페이지 즐겨찾기