MSA 환경에서 BDD 이행
참고 자료
BDD란?
Behavior Driven Development(BDD)는 TDD(Test Driven Development)의 확장으로, 테스트 주도 개발에서 발생하는 문제를 해결하고자 등장했습니다. TDD는 테스트 코드를 먼저 작성하고, 이후에 이를 통과하는 코드를 작성하는 방식입니다. 하지만 TDD는 개발자에게는 유용했지만, 비기술적인 이해관계자(비즈니스 분석가, 제품 소유자 등)와의 소통에는 한계가 있었습니다. BDD는 이러한 한계를 극복하고자 했습니다. BDD는 단순히 기능을 검증하는 것에서 벗어나, 사용자 관점에서 원하는 행동이나 결과를 충족하는지 확인하는 데 초점을 맞춥니다.
BDD와 TDD 비교
BDD가 해결할 수 있는 문제
개발자와 이해관계자 (PO, BA) 간의 소통 오류
매니저: 우리 고객들이 쉽게 제품을 찾을 수 있도록 검색 기능을 추가해 주세요.
개발자: 구현완료! 여깄습니다.
매니저: 엇 단순한 검색창이 아니라 추천 검색어, 카테고리별 필터링, 자동 완성 기능도 포함된 검색 시스템이었습니다...!
방대한 문서
BDD는 테스트 케이스 자체가 요구사항 문서의 역할을 하므로 작성할 문서가 줄어듭니다.
개발자들의 시나리오 이해 부족으로 인한 테스트 커버리지 부족
BDD는 테스트를 요구사항의 일부로 간주하여 자연스럽게 테스트 커버리지를 높이는 데 도움을 줍니다.
QA의 회귀 테스트의 어려움 (놓쳐버린 몇몇 시나리오)
개발 완료 후 테스트할 시나리오를 명확히 알 수 있다.
번거러운 QA 업무 (테스트 자동화 결여)
테스트가 자동화되어 있지 않으면 매번 수동으로 테스트를 수행해야 하며, 이는 시간이 많이 걸리고, 사람이 직접 하다 보니 실수할 가능성도 높습니다.
요구사항 형상관리 어려움
BDD 구성요소
BDD를 하기 위해서는 다음과 같은 산출물들이 필요합니다.
JUnit
Feature 파일: PO, DEV, QA 모두가 이해할 수 있는 언어로 작성된 시나리오 파일
Cucumber: featrue 파일 명세를 코드로 매핑되어 실제 작동하는 테스팅 소프트웨어로 만들어준다.
BDD를 이용한 서비스 만들기
그럼 이제 BDD를 이용해서 행동을 기반한 테스트 자동화를 만들어 보겠습니다.
고객 요구사항
암산으로 하는 계산 문제풀이 서비스를 제공하고 싶어요. 우선 곱셈 문제만 필요합니다.
본인이 푼 문제 이력들을 볼 수 있어야 해요.
맞춘 개수에 따라 순위 점수제를 도입하고 싶어요.
사용자의 흥미를 위해 배지 제도도 부여하고 싶어요.
신규사용:
First time5문제 이상 풀이:
Brzone
UI


서비스 구성도
참고 자료가 MSA 책 예제 코드로 부터 BDD 적용하는 것이라 조금 복잡할 수 있습니다. Gateway와 Service Registry 같은 정보는 무시하고 Multiplication과 Gamification 그리고 사이에 큐 정도만 집중하시면 됩니다.
코드 Tree 구조
Feature 파일 작성
1. 문제 풀이
Mary 문제 요청/수신
John 1개 풀이 성공
Horatio 2개 풀이, 실패 그리고 성공
2. 점수판
캐런과 로우라 각각 5개 7개 풀고 점수와 배지 확인 후 랭킹도 확인
Step Definitions 작성
1. 문제 풀이
feature 파일에 Given-When-Then은 Cucumber의 step들과 매칭 됩니다 (정규표현식).

2. 점수판

챌린징
위에 코드에서 한가지 챌린징한 상황을 해결한 사례가 들어있습니다.

MSA 구조상 Event-Driven 방식으로 Async 통신을 하는 경우 가 있습니다. Multiplication -> Gamification 통신시 후자앱에서는 유저가 맞춘 문제에 따라서 점수 계산과 어떠한 배지를 줘야하는지의 과정을 거쳐야 합니다. 이 과정이 끝나기도 전에 step definition에서 Then으로 검증을 하게 되면은 테스트는 Fail이 나게 됩니다.
이러한 Eventual Consistency 문제를 해결하기 위해 Awaitility 라이브러리를 사용하는 것을 볼 수 있습니다.
주의
Thread.sleep(5000);을 이용해 해결하는 방법도 생각하실 수 있습니다. 하지만 시나리오가 2000개가 있고 매번 5초 기다렸다 검증을 한다면은 어떨까요? Awaitility 라이브러리를 사용하게 되면 정해진 시간안에 여러번 통신을 하게 성공할 경우 fast quit을 하게 됩니다.
실행 방법
MSA 코드들을 도커 컨테이너에 구동 시킨다 (github)
docker-compose -f docker-compose-public.yml upmultiplication과 gamification 앱도 구동이 될것이다.
BDD 코드를 실행한다.
모든 시나리오 돌리려면
맥/리눅스:
./mvnw test윈도우:
mvnw.cmd test
1개 feature 파일 시나리오만 돌리려면 아래 스크린샷 처럼

실행 결과
모든 시나리오 (solving_challenges.feature , leaderboard.feature) 돌렸을때 실행 결과이다.
어떤 Step Definition과 링크 됬는지 확인 가능하다.
리포트 기능

회사 경험
요구사항에 대한 feature 파일 시나리오와 그에 매핑되는 step definition을 만들고 각 step들이 QA 개발자가 만들어둔 실제 프로덕션 환경에서 MSA API들과 연계 통신하는 코드를 활용하는 경험을 하였다.

추가 읽을거리
Last updated




