Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TDD 정리 #46

Open
hongcheol opened this issue Aug 21, 2021 · 0 comments
Open

TDD 정리 #46

hongcheol opened this issue Aug 21, 2021 · 0 comments

Comments

@hongcheol
Copy link
Owner

TDD

TDD(Test Driven Development)는 테스트 주도 개발이라는 뜻으로 만들고자하는 기능의 내용을 담고 있으면서 만들어진 코드를 검증까지 해줄 수 있도록 테스트 코드를 먼저 만들고 테스트를 성공하게 해주는 코드를 작성하는 방식의 개발 방법입니다.

그렇다면 테스트는 과연 무엇일까요?

테스트는 무엇인가

테스트는 만든 코드에 확신을 가질 수 있게 해주는 도구입니다. 테스트를 통해 검증한 코드는 정상적으로 작동한다는 확신을 가질 수 있으며, 변화한 부분 이외의 부분은 검증이 완료된 상태이기 때문에, 변경한 부분으로 인해 발생하는 변화만 신경쓰면 되기 때문에 변화에 유연하게 대처할 수 있게 해줍니다.

테스트는 개발자가 의도한대로 코드가 정확히 작동하는지 확인하는 것이기 때문에, 테스트하려는 대상에 집중할 수 있는 사이즈로 만드는 것이 중요합니다. 그렇기 때문에 관심사의 분리를 통해서 적당한 사이즈로 단위 테스트를 만들어야합니다.

단위 테스트를 하는 이유는 웹 개발을 예시로 설명을 해보겠습니다.

웹 개발 초기에 회원 가입 기능을 개발하고 있는 상황을 생각해보면, DB에 데이터가 잘 들어가는지 확인을 하려고 할 때, 단위 테스트를 사용하지않으면, 프론트 코드까지 작성을 해서 데이터를 넘겨받아와서 저장하는 기능까지 구현을 해놓은 다음에 제대로 작동하는지 확인해야합니다. 이런 식으로 개발을 하면, 문제가 발생했을 때, 어디서 발생했는지 확인이 힘들 뿐만 아니라 초기에 간단하게 대응할 수 있었던 문제를 엄청 복잡한 과정을 통해 해결해야하는 일이 생길 수 있습니다. 그렇기 때문에 관심사에 맞는 크기의 단위 테스트를 만들어 테스트 하는 것이 중요합니다.

그렇다면 테스트를 작성할 때 어떤 점을 유의해야하는지 알아보겠습니다.

1. 테스트는 자동으로 수행되도록 코드로 만드는 것이 중요하다.

테스트를 진행할 때, 입력에 실수가 있어서 오류가 나면 다시 테스트를 반복해야하고, 테스트를 실행하기위해서 서버를 띄우고 프로그램을 배치한 후, 테스트 용으로 브라우저를 띄우고 주소를 입력해야하는 귀찮은 작업도 필요합니다. 하지만 자동으로 수행되도록 코드를 만들어놓으면 이런 시간을 단축할 수 있으며 자주 반복이 가능합니다.

2. 지속적인 개선과 점진적인 개발을 위한 테스트를 해야한다.

작성한 코드를 만든 후에 이를 검증하는 테스트 코드를 만들어두면, 코드를 개선하는 작업을 할 때 유리합니다. 혹시 개선 과정 중간에 설계를 잘못하거나, 수정에 실수가 있었다면 테스트를 통해서 바로 확인을 할 수 있기 때문입니다.

그렇기 때문에 이전까지 기능해놓았던 구현들이 문제 없음을 검증한다면, 조금씩 기능을 추가하면서 테스트트하는 점진적인 개발이 가능해집니다. 테스트를 통해 기존에 만들어둔 기능들이 새로운 기능을 추가하느라 수정한 코드에 영향을 받지않고 잘 작동하는지까지도 확인할 수 있기 때문에, 개발 전단계에 걸쳐 테스트는 필수적입니다.

3. 테스트 결과는 일관성이 있어야한다.

코드에 변경사항이 없다면 테스트는 항상 동일한 결과를 내야합니다.
테스트가 외부 상태에 따라서 성공하기도 하고, 실패하기도 한다면 그 테스트는 좋은 테스트라고 할 수 없습니다.

4. 포괄적인 테스트를 해야한다.

2번에서 관심사에 따른 단위 테스트를 진행해야한다고 말했는데, 갑자기 포괄적으로 테스트를 해야한다는 말이 나와서 의아할 수 있습니다.

하지만 여기서 말하는 포괄적인 테스트라는 것은 성공하는 테스트만 골라서 만들면 안된다는 뜻입니다.

평소에는 정상적으로 잘 동작하는 것처럼 보이지만 막상 특별한 상황이 되면 엉뚱하게 동작한다면, 이는 추후에 큰 문제를 만들 수 있고 원인을 찾기 힘들어서 고생할 수 있습니다.
"항상 네거티브 테스트를 먼저 만들어라"라는 말이 있을만큼 부정적인 케이스를 먼저 만드는 테스트 습관을 들이는 것이 중요합니다.

테스트가 이끄는 개발

앞서 설명했던 것처럼 테스트 주도 개발은 만들고자하는 기능의 내용을 담으면서 만들어진 코드를 검증할 수 있는 코드를 먼저 만든 후에, 그 테스트를 성공하게 해주는 코드를 작성하는 방식의 개발방법입니다.

이는 테스트를 만들어가면서 개발하는 방법이 주는 극대화한 방법입니다.

실패한 테스트를 성공시키기위한 목적이 아닌 코드는 만들지 않는다

는 TDD의 기본 원칙입니다.

TDD는 테스트를 먼저 만들고 그 테스트가 성공하도록 하는 코드만 만드는 방식으로 진행하기 때문에, 테스트를 빼먹지 않고 만들 수 있습니다. 그리고 테스트를 작성하는 시간과 애플리케이션 코드를 작성하는 시간의 간격이 짧아져 전체적인 개발 시간이 짧아집니다.

테스트를 만들어뒀기 때문에, 코드를 작성하면 바로바로 테스트를 실행해볼 수 있기 때문입니다.

TDD에서는 테스트를 작성하고 이를 성공시키는 코드를 만드는 작업의 주기를 가능한 짧게 가져가도록 권장됩니다. 그래서 TDD 방식은 애자일 을 통한 개발을 할 때 필수적입니다.

TDD의 장점

  1. 코드를 만들어 테스트를 실행하는 그 간격이 매우 짧기 때문에 개발한 코드의 오류를 빠르게 발견할 수 있습니다. 빨리 발견된 오류는 쉽게 대응이 가능하기 때문에 TDD를 통해서 개발을 하면 개발시간을 단축할 수 있습니다.

  2. 테스트 코드는 애플리케이션 코드보다 상대적으로 작성하기 쉽고 각 테스트가 독립적이기 때문에, 코드의 양에 비해서 작성하는 시간이 얼마 걸리지않습니다.

  3. 개발하고 싶은 기능을 일반 언어가 아닌 테스트 코드로 표현해서, 마치 코드로 된 설계문서처럼 만들어놓을 수 있습니다. 이렇게 설계 문서처럼 만들어 놓은 후에 실제 기능을 가진 애플리케이션 코드를 만들고 나면, 그 테스트를 바로 실행해서 설계한대로 코드가 작동하는지 확인할 수 있습니다.

    이때 테스트가 실패하면 설계한 대로 코드가 만들어지지 않았다는 것을 바로 알 수 있습니다. 이 과정에서 문제가되는 부분을 알 수 있고, 다시 코드를 수정하고 테스트를 수행해서 테스트가 성공하도록 코드를 계속 다듬어가면서 테스트를 끝내면 코드의 구현과 테스트라는 두가지 작업이 동시에 끝나기 때문에 정말 효율적입니다.

@hongcheol hongcheol self-assigned this Aug 21, 2021
@Baemung Baemung added the Week2 label Sep 5, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants