본문 바로가기
Computer Science

[CS] 테스트와 TDD

by DuncanKim 2022. 7. 9.
728x90

[CS] 테스트와 TDD

 

 

 

개발자의 필수 역량은?

기능을 빠르게 구현하는 것. 기능에 해당하는 테스트를 작성하는 것. 두 가지라고 할 수 있다.

빠르게 구현을 했다 하더라도, 그것이 신뢰가 없는 코드면 개발자는 쓸모 없는 에너지 드링크를 마시며 쓸모 없는 시간을 낭비한 것이라고 봐도 될 듯하다.

내가 쓸모 없는 시간을 보내지 않기 위해 나를 도와주는 것, 구현을 하고 나서 그것이 신뢰가 있는지를 확인해 볼 수 있는 것.

 

그것은 바로 '테스트 케이스'이다.

 

 

테스트란 무엇인가?

 

개발자 세상에서 테스트란, 소프트웨어 테스트를 말한다.

제품(함수, 특정기능, UI, 성능, API 스펙 등)이 예상하는 대로, 원하는 대로 동작 하는지 확인하는 것이다.

제품 또는 서비스의 품질을 확인하고 소프트웨어의 버그를 찾는 것이다.

 

 

테스트의 프로세스

 

비즈니스 로직을 가지고 있는 소스코드가 있으면, 이에 해당하는 테스트 코드를 작성한다. 이 테스트 코드는 개발자가 구현하고 싶은, 생각하는, 예상하는 코드가 맞는지 확인할 수 있어야 한다. 함수, 특정기능, UI, 성능, API 스펙 등 종류에 따라서 다양한 테스트 프레임워크나 라이브러리를 활용할 수 있다.

 

테스트가 모두 패스되었다면, 퇴근할 수 있다.

테스트가 실패하면 야근을 해야하고 재수정을 해야 한다.

정리하면, 개발 과정에서 예상한 대로 제대로 돌아가는지를 확인하는 것이 테스트라고 할 수 있다.

 

 

 

TDD 

 

Test-driven development, 테스트 주도 개발
개발 전에 테스트 코드를 먼저 작성하는 "방식".

 

코드를 하나부터 열까지 작성을 해놓고 프로젝트가 엎어질 수도 있다. 수많은 오류를 뛰어넘으며 무엇인가를 해놓았는데, 그것이 무용지물로 돌아가버리면 개발자 입장에서는 개발이 정말 재미없어질 수도 있다. 회사 입장에서도 거창한 목표를 잡고 결과물을 예상하고 경영을 하고 있는데, 무엇인가가 잘못되어 계속 제품 출시가 미루어지고 미루어지고 할 수도 있다.

 

큰 목표를 '제품 출시'라고 두고, 그 안에서 세부적인 결과물 빌드 과정을 "테스트"를 통해서 구현해나가는 과정이 있다. 그것이 바로 TDD이다. 코드를 작성하기 전에 특정한 기능에 한해서 하나의 케이스만 먼저 테스트를 진행한다. 테스트를 수행하면 당연히 오류가 나게 되는데, 기능을 완벽히 구현하지 않았기 때문이다. 실패한 케이스가 성공할 정도로만 조금의 코드를 작성해서 테스트를 다시 해서 성공하도록 만든다.

 

만약 성공하면 그 다음 기능 구현으로 넘어가서 하나의 테스트를 진행하고 오류가 나면 그것을 수정할 만큼의 코드를 입력하고, 다시 돌려보고 성공을 하면 그 다음 기능을 수행하는 순환을 거친다.

 

성공적으로 구현이 완료되었다면, 모든 테스트들을 통과할 수 있을 것이다. 이 테스트들을 기반으로 해서 코드의 퀄리티를 개선하고 아키텍쳐를 개선하는 리팩토링을 해나갈 수 있다.

 

무엇이 옳은 코드인지 고민하지 않고, 먼저 테스트 케이스를 통과시킬 정도로만 코드를 만든 뒤에 최적화의 과정을 거치는 것이다. 최적화를 했는데도 불구하고 테스트 케이스를 통과하지 못한다면 어디서 오류가 났는지를 잡는 것이 더 큰일이 되어버리고, 그것을 덮으려 회사를 레스토랑으로 만들어 스파게티를 양산하는 모습을 보여줄 수도 있는 것이다. TDD는 이러한 점에서 개발자에게 재미를 부여하고 더 효율적인 개발 방법이라고 할 수 있다.

 

 

왜 TDD인가?

 

작성하고자 하는 코드의 모든 요구사항에 대한 철저한 분석과 명확한 이해가 필요하기 때문이다. 명확한 요구사항을 기반으로 해서 설계를 진행하여 모든 요구 사항(목표)에 대해 점검하고, 사용자 입장에서 코드를 작성하는 개발을 할 수 있다. 구현 보다는 인터페이스에 집중하면서 코드의 퀄리티를 향상시킬 수 있는 것이다. 이렇게 되면 시스템 전반적으로 설계가 향상되는 결과를 가져올 수 있다.

 

또한 개발자 개인에게 있어서는 계속 무엇인가를 수정해나가는 퀘스트를 해나가는 느낌으로 일을 할 수 있기 때문에 재미와 집중력이 향상되는 효과를 가져올 수 있다.

 

728x90

'Computer Science' 카테고리의 다른 글

[C언어] 문자열 활용하기  (0) 2022.07.12
[CS] 결합도와 응집도  (0) 2022.07.12
[CS] 객체지향 디자인패턴  (0) 2022.07.07
[CS] 프로세스와 스레드  (0) 2022.07.06
[CS] 동기와 비동기의 개념 차이  (0) 2022.07.05

댓글