본문 바로가기
개발 활동/스위프

[Test] 애플리케이션 테스트 방법

by 다음에바꿔야지 2024. 4. 29.

스위프 프로젝트를 진행하면서 2주차에는 백엔드 팀원끼리 테스트 관련 스터디를 진행하기로 했다. 구글링을 통해 배운 개념을 정리해보겠으며, 이를 우리 서비스에 어떻게 적용할 것인지까지 생각해볼 계획이다.

 

테스트 종류, 이 프로젝트에서 테스트를 어떻게 해볼지에 대해 중점적으로 다뤄볼 예정이다.

 

1. 테스트를 왜 해야 하는가?

1. 디버깅 비용 절감

애플리케이션은 좋은 코드와 설계를 갖추더라도 결함이 있을 수 밖에 없다. 버그는 항상 발생할 수 있고, 그것을 해결하기 위해 개발자는 디버깅을 꾸준히 할 수 밖에 없다.

디버깅을 할 때, 문제를 해결하는 시간보다 문제를 찾기 위한 시간이 더 소요된다. 어느 코드에서 어떤 케이스일때 문제가 발생했는지 파악하기 힘들기 때문이다.

테스트를 작성하더라도 완벽하게 결함을 없앨 순 없다. 하지만 테스트 코드를 통해 오류를 줄일 수 있고 빠르게 대처할 수 있다.

 

테스트는 범위와 비중에 따라 3가지로 나누어진다.

1. E2E(End-To-End)

: 최종 사용자의 흐름에 대한 테스트. 외부로부터 요청부터 응답까지 기능이 잘 동작하는지에 대한 테스트

2. Integeration

: 코드의 주요 흐름들을 통합적으로 테스트. 주요 외부 의존성(ex. 데이터베이스)에 대해서 테스트

3. Unit

: 도메인 모델과 비즈니스 로직을 테스트. 작은 단위의 코드 및 알고리즘 테스트

 

2. 코드 변경에 대한 불안감 해소

버그를 고쳤는데 다른데서 또 버그가 발생한다. 이를 회귀 버그라고 한다.

회귀 버그: 이전에 제대로 작동하던 소프트웨어 기능에 문제가 발생하는 것을 가리킨다. 일반적으로 회귀 버그는 프로그램 변경 중 뜻하지 않게 발생한다. - 위키 백과

 

애플리케이션은 요소들의 상호작용을 통해 구성되기 때문에 회귀 버그를 완전히 차단하고 예방할 수 없다. 그렇기 때문에 관리하고 대처해야 한다. 회귀 테스트는 기능 추가나 오류 수정으로 인해 새롭게 유입되는 오류가 없는지 검증해준다. 테스트 코드는 서비스가 지속 가능하게 발전하기 위해 필요한 코드라고 할 수 있다.

 

3. 더 나은 문서 자료

서비스가 커지면서 서비스의 복잡도가 늘어남에 따라 코드의 양이 많아지고 코드의 복잡도가 높아지게 된다. 신규 입사, 협업자들은 이러한 복잡한 코드를 이해하는데 많은 불편함을 겪을 수 있다.

테스트를 작성할 때 가장 먼저 명세를 작성하면서 코드의 실제 동작을 기술함으로써 이 코드가 어떤 역할을 가졌는지 이해하는데 도움을 준다. 문서화된 테스트는 기능과 코드를 이해하는데 도와준다.

 

4. 좋은 코드는 테스트하기 쉽다.

좋은 코드는 변경하기 쉬운 코드라고 한다. 외부의 영향을 받거나 내부적으로 의존성을 가지고 있는 코드는 변경에 유연하게 대응하지 못하고 재사용하기 어려운 코드이다. 그렇기 때문에 테스트를 작성하기 어려워지는 이유이기도 하다.

 

5. 테스트 자동화

자동화 테스트가 있으면 CI에서 테스트를 진행하며 버그가 배포되는 것을 방지할 수 있게 된다. 앞서 다룬 변경에 대한 내성과 회귀 버그를 지속적인 코드 병합 단계에서 확인할 수 있으므로 소프트웨어의 품질 또한 높여준다.

 

2. 테스트 코드 작성

테스트 코드를 작성하는데 다양한 패턴이 존재한다. 이 중 보편적이면서 사용해본 경험이 있는 패턴인 given-when-then 패턴에 대해 소개해보자 한다.

 

1. given(환경)

: 테스트 실행을 준비하는 단계(~라는 상황에서)

2. when(조건)

: 테스트를 진행하는 단계(~를 실행하면)

3. then(결과)

: 테스트 결과를 검증하는 단계(~가 된다)

 

테스트 라이브러리 목록

  • JUnit: 자바 프로그래밍 언어용 단위 테스트 프레임워크
  • Spring Test & Spring Boot Test: 스프링 부트 애플리케이션을 위한 통합 테스트 지원
  • AssertJ: 검증문인 어설션을 작성하는데 사용되는 라이브러리
  • Hamcrest: 표현식을 이해하기 쉽게 만드는데 사용되는 Matcher 라이브러리
  • Mockito: 테스트에 사용할 가짜 객체인 목 객체를 쉽게 만들고, 관리하고, 검증할 수 있게 지원하는 테스트 프레임워크
  • JSONassert: JSON용 어설션 라이브러리
  • JsonPath: JSON 데이터에서 특정 데이터를 선택하고 검색하기 위한 라이브러리

이 중, JUnit과 AssertJ를 가장 많이 사용한다. 

단위 테스트시에 JUnit과 AssertJ를 통해 기능을 테스트하면 될 것이다.

 

3. 테스트 케이스 작성

테스트 코드를 작성하기 전, 어떤 기능이 어떻게 동작해야하는지에 대한 테스트 케이스를 작성하면 좋다. 테스트 케이스를 문서화를 해두면 누락을 방지할 수 있고, 개발자도 이를 보고 편하게 테스트 코드를 작성할 수 있다.

테스트 케이스 작성 예시

 

 

4. 성능 테스트

E2E 단계에서 비기능적 요구사항이라고 할 수 있다. 애플리케이션의 품질을 높이기 위해 진행한다.

1. loading test

: 일정 시간 동안 틍정 Load를 주어 성능 확인

2. stress test

: 시스템의 한계 파악을 위해 점차 load를 늘려 한계점과 한계점에서의 시스템 동작을 확인

3. peak test

: 순간적으로 늘어나는 load(peak)에서의 성능 확인

etc

 

테스트를 구성할때는 테스트 유형에 얽매이기 보다는 우리가 필요한 테스트가 무엇인지를 고민하는게 중요하다. 우리가 테스트하고자 하는 기능, 개선하고 싶은 기능에 맞는 테스트 유형을 선택하는 것이 적절한 테스트라고 할 수 있다.

 

 

성능 테스트 도구

사용 용이성, 테스트의 다양성, 모니터링, 연동, CI/CD, 비용, 지원 프로토콜, 커뮤니티 활성도 등을 고려해 성능 테스트의 도구를 선택하는 것이 좋다.

구글에 검색해보니, 스프링에서는 JMeter, nGrinder를 많이 이용하는 것으로 보인다.

성능 테스트 도구는 추후 성능 테스트가 필요할 시 더 찾아보도록 한다.

 

이상으로 테스트 방법을 개략적으로 살펴보았으며, 팀원들과의 스터디를 통해 추가적으로 필요한 부분이나 부족한 내용을 파악 후 보충하는 프로세스를 진행할 것이다.

 

 

참고 자료: 

테스트 코드를 왜 그리고 어떻게 작성해야 할까?

 

테스트 코드를 왜 그리고 어떻게 작성해야 할까?

테스트 코드가 필요한 이유와 잘 작성하는 방법에 대해 공유합니다.

tech.inflab.com

이거 어디까지 올라가는 거예요? - 성능 테스트 환경 구축기

 

‘이거 어디까지 올라가는거예요?’ — 성능 테스트 환경 구축기

23년 하반기 백엔드 챕터 기술 과제를 해결한 과정을 공유합니다. 참여자의 역할과 기여, 그리고 유의미한 결과까지 담았어요!

blog.lemonbase.team

테스트 자동화 도입 여정기

 

테스트 자동화 도입 여정기

29CM 백엔드 셀은 Pytest를 활용하여 자동화된 테스트 환경을 운영하고 있습니다. 팀에서 유닛 테스트를 작성한지 2년이 되어가네요. ✌️😊✌️

medium.com

백엔드 개발자를 위한 스프링 부트 테스트

 

백엔드 개발자를 위한 스프링 부트 테스트 | 요즘IT

테스트 코드는 작성한 코드가 의도대로 잘 동작하고 예상치 못한 문제가 없는지 확인할 목적으로 작성하는 코드입니다. 보통 테스트 코드 관련 공부는 본 개발 공부를 하느라 미루는 경우가 많

yozm.wishket.com

 

추가 학습 자료:

https://okky.kr/articles/538114

 

OKKY - OKKYCON: 2018 발표 풀영상 공개!!

2018년 10월 18일 삼성SDS타워에서 개최된《OKKYCON: 2018  The Real TDD - TDD 제대로 알기》발표 영상을 공개합니다! 1. 정진욱님 - 테스트하기 쉬운 코드로 개발하기TDD가 어려운 이유는 테스트 기술이 부

okky.kr

https://www.wanted.co.kr/events/wantedtalk01

 

(무료) 테스트 코드와 배포 시스템 : Wanted Talk Engineering #1 | 원티드

원티드 개발팀의 테스트 코드와 배포 시스템을 소개합니다.

www.wanted.co.kr