2024. 3. 3. 18:24ㆍ기타 (회고 및 정보글 등)
기존 운영 플랫폼은 Razor 페이지를 사용하여 간략하게 구축되어 있었고, 테스트 환경은 구축되어 있지 않았다.
하지만 게임 속 일차원적인 정보를 들여다보는 기능 외에도, 데이터를 처리하거나 실시간으로 유저의 데이터를 확인할 수 있어야 하는 요구사항이 있었다.
이처럼 운영플랫폼이 중요해짐에 따라 이를 고도화하는 업무를 진행하게 되었다. 목표는 크게 두 가지었다.
1. Rest api 환경을 구축
2. Xunit 테스트 환경을 구축
위 작업에 의의는 안정성, 확장성 등을 고려하여 앞으로 더욱 중요한 기능 개발을 원활하게 하기 위한 구조를 설계하는 것이다.
Rest api 에 대한 공통 처리를 위해서 프론트 개발자 분과 논의하여 응답데이터 구조를 제네릭 클래스를 만들어서 공통 처리하는 BaseController 클래스를 작성했다.
모든 API 컨트롤러는 이를 상속받아 편리하게 Rest api를 작성할 수 있게 되었다.
스프링에서의 기본 개념을 바탕으로 닷넷코어와 비교하며 개념을 파악하고 적용했으며, 공식문서에서 자세히 설명되어 있어서 참고하여 비교적 쉽게 Rest api 환경을 구축할 수 있었다.
테스트 환경을 구축하는 작업은 생각보다 어렵고, 고려할 점이 많은 작업이었다.
우선 테스틑 하고자 하는 서비스 프로젝트를 xUnit 테스트 프로젝트가 참조할 수 있게 직접 설정해줘야 했다.
(Junit이 참 그리웠다.)
또한 몇 가지 문제에 직면했다.
첫 번째로, 스프링의 yml 파일처럼 환경변수 등을 제어할 수 있는 Json 파일이 있으며, 이를 실행하는 환경에 따라 동적으로 사용하게끔 해야 했다.
하지만 테스트 프로젝트를 실행하면 launchSettings.json에서 테스트환경이라는 정보를 읽지 못해서 에러가 발생했다.
해결 방법은 file → setting → Unit Testing → xUnit.net 에서 Use Specific configuration file 을 체크해준 후
local-test.runsettings 파일을 세팅해줬다.
<?xml version="1.0" encoding="utf-8"?>
<!-- File name extension must be .runsettings -->
<RunSettings>
<RunConfiguration>
<EnvironmentVariables>
<!-- List of environment variables we want to set-->
<ASPNETCORE_ENVIRONMENT>local-test</ASPNETCORE_ENVIRONMENT>
</EnvironmentVariables>
</RunConfiguration>
</RunSettings>
appsetting.local-test.json 에서는 개발과는 또 다른 테스트용 데이터베이스 정보를 작성해줌으로써 독립시킨다.
두 번째로, 테스트를 각각 실행하면 성공하지만, 전체 테스트를 실행하면 실패한다.
현재 테스트 환경은 어느 환경에서나 동일한 결과를 보장하고 도메인별 독립된 환경을 보장하기 위해서 테스트 클래스마다 도커 컨테이너를 띄우고 그 안에서 테스트를 수행하도록 했다.
또한 테스트의 실행속도를 위해서 테스트 클래스들은 병렬로 실행하도록 설정했다.
하지만 테스트 클래스 내에서 각 테스트 함수는 같은 데이터베이스를 공유하기 때문에 데이터의 정합도가 깨지며 실패한다.
이를 해결하기 위해서 테스트 공통 인퍼페이스에서 각 함수마다 데이터베이스를 초기화하는 로직을 추가했다.
await _context.Database.EnsureDeletedAsync();
await _context.Database.EnsureCreatedAsync();
이렇게 되면, 한 클래스 내에서 데이터베이스 데이터가 겹치면서 발생하는 실패는 없어진다.
세 번째로, 통합 테스트는 api를 호출해서 통신이 정상적으로 동작하는지 체크하고, 그에 따른 로직 처리까지 정상적으로 이루어지는지 데이터베이스까지 체크해야 했다.
테스트 환경에서 Refit 라이브러리를 사용하여 호출하고자 하는 end point를 정의하고, 이를 함수 호출하듯이 API를 호출할 수 있었다.
그리고 도커 컨테이너에 데이터베이스를 생성하면서 해당 데이터베이스에서 사용할 DbContext를 테스트코드에서 사용할 수 있게 공통화처리 함으로써 컨테이너 DB에서 데이터를 확인할 수 있었다.
환경을 구축하는 작업은 복잡하지만, 한 번 구축한 환경을 기반으로 테스트를 진행하게 될 것이므로 흐름을 정확히 이해하고, 더욱 편리하게 사용할 수 있도록 고려해야 한다는 점에서 좋은 경험을 할 수 있었다.
'기타 (회고 및 정보글 등)' 카테고리의 다른 글
[회고록]비동기 프로그래밍에서 종종 발생하는 실수 / DBContext Scope 이슈 (0) | 2024.03.31 |
---|---|
[리팩토링] TrendPick 프로젝트 정산 프로세스 이슈 해결 및 리팩토링 과정 / 정산 프로세스 개편 (0) | 2023.08.25 |
[Junit] TrendPick 프로젝트 테스트 코드 작성 중 테스트 실행이 되지 않고 오류가 발생하는 경우 (0) | 2023.08.03 |