카테고리 없음

TDD 테스트 주도 개발

노엠디엔 2023. 8. 24. 19:51

리액트를 통해 프로젝트를 생성하게 되면 따라오는 jsest와 테스트 코드 파일을 보고

사용 방법과 왜 사용하는지에 대해 항상 의문이었는데 테스트 코드에 대해 처음부터 

알아보려고 한다!

강의를 통해 TDD부터 알아보게 되었는데

TDD란 Test Driven Development의 약자로 ‘테스트 주도 개발’이라고 한다.

매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나로, 개발자는 먼저 요구사항을 검증하는
자동화된 테스트 케이스를 작성한 후 그 테스트 케이스를 통과하기 위한 최소한의 코드를 생성한다.
마지막으로 작성한 코드를 표준에 맞도록 
리팩터링 한다.

 

먼저 오류가 나는 코드를 작성하고 -> 그 코드를 테스트에서 통과시키며 -> 리펙토링 하는 것이 순서라고 한다!

보통 일반 개발 방식은 다음과 같이 요구사항 분석하고 바로 코드를 개발하는 것인데 

이렇게 되면 많은 문제가 생긴다고 한다.. 이미 겪어보긴 했다..

보통 개발 방식은 ‘요구사항 분석 → 설계 → 개발 → 테스트 → 배포’의 형태의 개발 주기를 갖는다.

  1. 소비자의 요구사항이 처음부터 명확하지 않을 수 있다.
  2. 따라서 처음부터 완벽한 설계는 어렵다.
  3. 자체 버그 검출 능력 저하 또는 소스코드의 품질이 저하될 수 있다.
  4. 자체 테스트 비용이 증가할 수 있다.

국엔 코드를 작성하면서 코드들은 재사용과 유지보수를 어렵게 만들며.

에러가 발생하는 구간을 예측하기 힘들어 그만큼 시간적으로 더 소모된다.

TDD 개발방식의 장점!?

객체 지향적인 코드 생산

TDD는 코드의 재사용 보장을 명시하므로 TDD를 통한 소프트웨어 개발 시 기능 별 철저한 모듈화가 이뤄진다.

이는 종속성과 의존성이 낮은 모듈로 조합된 소프트웨어 개발을 가능하게 하며 필요에 따라 모듈을 추가하거나 제거해도 소프트웨어 전체 구조에 영향을 미치치 않게 된다.

재설계 시간의 단축

테스트 코드를 먼저 작성하기 때문에 개발자가 지금 무엇을 해야 하는지
분명히 정의하고 개발을 시작하게 된다.
테스트 시나리오를 작성하면서 다양한 예외사항에 대해
생각해 볼 수 있으며
개발 진행 중 소프트웨어의 전반적인 설계가 변경되는 일을 방지할 수 있다.

디버깅 시간의 단축

사용자의 데이터가 잘못 나온다면 DB의 문제인지, 비즈니스 레이어의 문제인지 UI의 문제인지 실제 모든 레이어들을
전부 디버깅해야 하지만, TDD의 경우 자동화 된 유닛 테스팅을 전제하므로 특정 버그를 손 쉰 게 찾아낼 수 있다.

테스트 문서의 대체 가능

TDD를 하게 될 경우 테스팅을 자동화 시킴과 동시에 보다 정확한 테스트 근거를 산출할 수 있다.

추가 구현의 용의 함

개발이 완료된 소프트웨어에 어떤 기능을 추가할 때 가장 우려되는 점은 해당 기능이 기존 코드에 어떤 영향을 미칠지 알지 못한다는 것이다. 하지만 TDD의 경우 자동화된 유닛 테스팅을 전제하므로 테스트 기간을 획기적으로 단축시킬 수 있다.

 

TDD 개발방식의 단점..?

 생산성 저하

처음부터 테스트코드와 개발 코드 2개의 코드를 짜야하고 중간중간 테스트를 하면서 고쳐나가기 때문에.

TDD 방식의 개발 시간은 일반적인 개발 방식에 비해 대략 10~30% 정도로 늘어난다고 함!?.

 

 100% 안정성을 보장하지 않음

TDD는 어디까지 개발자가 설계한 예상 가능한 예측값과 환경을 기반으로 한다.

예를 들어 외부 의존성이 가지고 있는 오류, 네트워크의 문제, 하드웨어의 문제등

설계한 요소 외에 대한 부분은 리스크를 가져갈 수밖에 없으며 이는 테스트 코드에 대해 100% 안전하다고
여길 수 없음을 의미한다고 함.

 

테스팅의 종류?

단위 테스팅(Unit testing)

  • 하나의 모듈/컴포넌트/클래스가 기대한대로 동작하는지, 제공하는 기능들을 테스트
  • 대상 컴포넌트에서 의존하는 일부 대상은 목(mock:가짜를 의미) 객체를 이용하여 테스트
    하기 편한 환경을 구축 가능
  • 개발자가 작성하며 자동화된 테스팅이다.

통합 테스팅(intergration testing)

  • 두 개 이상의 모듈이 잘 연동/연결이 되었는지 테스팅, 모듈간에 발생하는 에러 검증
  • e.g 3rd party API를  호출하면 어떤 응답을 기대하는지 테스팅
  • 개발자가 작성하며 자동화된 테스팅

E2E 테스팅(End-to-end testing)

  • 실제 사용자가 이용하는 환경과 최대한 유사하게만들어 사용자의
    경험을 전반적으로 테스팅하는 것
  • 사용자의 입장에서 시스템이 기능을 올바르게 제공하는지 테스팅함
  • e.g.시나리오 : 사용자가 '그룹 생성하기' 버튼을 클릭하면 해당 페이지로 리다이렉팅 된다 등
  • QA 조직이 따로 있을 경우, 개발자가 아닌 QA전문가 작성하기도 한다고함!?
  • 자동화된 테스팅이다.

인수테스팅(End-to-end testing)

  • 사람으로 수동으로 테스팅하는 의미
  • 시스템이 주어진 요구사항을 잘 충족하는지 테스팅(QA조직이 있다면 QA가 수행?)

 

TDD를 알아보면서 그럼 어떻게 TDD 개발 방식으로 구현해야 할지 감이 잡히진 않는 것 같다..

예전부터 취업 공고나 실업무에서는 테스트 코드 작성과 TDD 개발 방식에 대해 많이 보였던 것 같은데

협업하는 부분에서도 테스트코드는 개발 성장에 많은 도움이 될 것 같다.

다음에는 jest를 사용하는 방법으로 정리해 봐야겠다. jest 딱 대

 

 

참고 블로그 : https://jay-flow.medium.com/tdd%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80-18cb5979629c

https://hanamon.kr/tdd%EB%9E%80-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A3%BC%EB%8F%84-%EA%B0%9C%EB%B0%9C/