TDD가 디자인에 관한 것이라면 왜 필요합니까? [닫은]


10

TDD 전문가들은 TDD가 테스트에 관한 것이 아니라 디자인에 관한 것이라고 점점 더 많이 알려줍니다 . 그래서 저는 TDD없이 정말 훌륭한 디자인을 만드는 일부 개발자들을 알고 있습니다. 그러면 TDD를 연습해야합니까?


14
그들이없이 잘하고 있다면 필요하지 않습니다. 모든 "모범 사례"가 모든 사람에게 적합한 것은 아닙니다.
Rook

1
비슷한 질문에 대한 나의 대답 : programmers.stackexchange.com/questions/98485/…
Rei Miyasaka

답변:


18

TDD는 최고의 디자인을 완성하는 데 도움이 될뿐 아니라 더 적은 노력으로 더 많은 도움을받을 수 있습니다.

어떤 디자인이 가장 좋을지 결정하기 전에 문제에 2 개 또는 3 개의 찌르기가있었습니다. 이제 정확히 같은 시간에 테스트를 작성하고 올바른 디자인에 집중합니다. 그리고 보너스로 반복 가능한 테스트 모음이 있습니다. 승리!

즉, TDD가 아무것도 제공하지 않는 사람들이있을 것입니다. 그들이 끝날 때 자동화되고 반복 가능한 테스트를 계속 가지고 있다면 괜찮습니다.


4
더 적은 노력으로 정말?
SiberianGuy

3
네 진짜로 요. TDD는 클래스를 소비하기 위해 작성할 수있는 코드를 작성하기 시작하기 때문에 호출 코드 및 기능 측면에서 클래스에 대해 생각하게합니다. 클래스 "블라인드"를 작성할 때 나는 호출 클래스가 기대하는 것보다 더 많은 일에 초점을 맞추는 경향이 있습니다. 이는 거의 항상 실수입니다.
pdr

4
다시 한 번 그 단어가 forced있습니다. 나는 왜 사람들이 TDD에 관한 토론에서 발생하는 "강제"라는 단어의 빈도에 의해 더 자주 방해받지 않는지 모른다. 무언가를 올바르게 디자인 하도록 강요 할 필요는 없습니다 . 그들은 물건을 올바르게 설계 하는 법 을 배워야 하며, 특히 강제하는 행위가 엄청나게 많은 시간이 걸리는 경우, 강요하지 않고 계속 그렇게해야합니다.
Rei Miyasaka

3
@Rei : 사람들은 상대방이 실제로 "푸시"또는 "안내"를 의미한다는 것을 알기 때문에 더 자주 방해받지 않습니다. . 그리고 그렇습니다. 어떤 사람들은 운전하지 않고 자연스럽게 그렇게 생각한다는 것을 알 수 있습니다. 그러나 여전히 소프트웨어를 테스트해야하므로 훨씬 나아지지는 않습니다.
pdr

3
누군가가 "모듈 식 설계를 강요한다"고 말할 때, 그들은 실제로 강요됩니다. TDD를 사용하여 구성 할 수없는 디자인을 만드는 것은 매우 어렵지만 불가능하지는 않습니다. 문제는 이러한 강력한 결과가 아닙니다. 그것은 많은 노력과 노력이 필요합니다. 적절한 디자인은 가르치고 배울 수있는 기술 이며 학습에 시간을 소비해야합니다. 또한 TDD를 위해 작성된 테스트는 버그를 잡기 위해 작성된 테스트와 크게 다르지 않습니다. 만일 그렇다면, 무언가 잘못되었습니다 .
Rei Miyasaka

12

특정 TDD 전문가가 실제로 말하려는 것은 TDD가 설계 프로세스 라는 것이 아닙니다 (많은 사람들이 불행히도 그렇게 해석하지는 않았지만). 여기서 메시지는 TDD와 같은 프로세스를 올바르게 사용 하면 전체 디자인을 향상시키는 경향이 있다는 것입니다.

기본 개념은 TDD보다 훨씬 오래된 개념입니다. 테스트 가능성을위한 설계 . SOLID 원칙, 특히 단일 책임 원칙 을 엄격하게 준수하면 코드를 매우 쉽게 테스트 할 수 있습니다. 당신이 당신의 디자인에 비트 sloppier 경향이 경우 반면에, 당신은 아마의 좌절을 피하기 위해, 더 자주이 작업을 수행하도록 강요하는 단위 테스트를 작성하는 과정을 찾을 수의 (a) 파악 무엇 에 필요 (b) 실제 테스트를 작성하는 것보다 종속성을 설정하는 데 더 많은 시간을 소비합니다.

당신은하지 않습니다 이 혜택을 얻기 위해 TDD를 따라하지만, 하지 테스트를 작성하는 도움을 초기 - 당신이하지 않을 경우 전이나 도중, 클래스를 구현하는 것이 바람직 곧 후. 너무 오래 기다리면 저자가 말하고있는 "더러운 하이브리드"테스트의 위험이 있습니다.이 테스트는 취하기 쉽고 무해한 리팩토링 중에 깨지기 쉬우므로 큰 가치가 없습니다. 규모는 매우 어려운 과정을 재 설계합니다.

테스트를 작성하지 않으면 실제로 테스트 가능성을 설계하고 있는지 알 수 없으며 15 % 코드 적용 범위의 "기능 테스트"는 포함되지 않습니다.

물론 단일 테스트를 작성하지 않고도 좋은 디자인을 만들 있습니다. 그러나 훌륭한 디자인이라고 확신하십니까? 테스트에 의해 명확하게 지정되지 않은 경우 어떻게 알 수 있습니까? 테스트는 많은 문제를 찾아 내고 QA 프로세스는 눈에 띄는 버그를 발견 할 수 있지만, 잘못된 디자인 결정 은 찾아 낼 수 없습니다 .


1
좋은 디자인의 요점은 테스트 만하는 것이 아닙니다. 그러나 그렇습니다. TDD는 결함이있는 디자인을 발견하기에 좋은 도구입니다.
deadalnix

4

당신은하지 않습니다 단순한 대답은 TDD를 배울하기 위해 노력하고 사람에서 오는 필요 로하지만, 당신을 제공하는 주요 혜택은 매우 간단하다 신뢰 : 응용 프로그램 작동하는지 신뢰. 유스 케이스가 만족된다는 확신. 논리가 "Foobar"모듈에 적합하다는 확신. CEO가 자신이 읽은 새로운 기능을 추가하고 싶을 때 6 개월 동안 코드를 유지 관리하고 확장 할 수 있도록 코드가 올바르게 구성되어 있다는 확신 애플리케이션이 커질 때 아키텍처가 무너지지 않도록하거나 새로운 기능을 배심원 조작하기 위해 지저분한 해킹이 필요하다는 토대를 마련했습니다.

위의 내용은 약간 복음적인 것으로 들리지만 TDD의 이점을 보는 방식입니다. TDD를 사용하여 우수하고 견고한 아키텍처 설계를 만들 수 있다고해도 손으로 일을 올바르게 수행 한 다음 일이 올바르게 완료되었음을 증명할 수 있으며 더 중요한 것은 일을 올바르게 유지 하기위한 기준을 제공합니다 . 내가 TDD에 푹 빠져서 작은 코드를 사용하면 코드를 깨끗하게 만들고 적절한 소프트웨어 엔지니어링 개념을 따르도록 강요했다. 그렇지 않으면 "가장 빠른 것"을 수행하는 경우가 많았다.


+1 TDD는 피드백입니다. 피드백의 대부분이 진행됨에 따라 상당히 객관적이고 완전 자동화되므로 모든 기술 수준의 팀원이 공유 할 수 있습니다. TDD 이전에는 좋은 코드가 "느끼고"있거나 사용자가 소프트웨어를 얻은 후 언젠가 확인되었습니다. 루프가 짧을수록 더 자신감이 생깁니다. 불행히도 TDD는 좋은 디자인을 "느끼는"느낌으로 과신이되기 쉽지만, 자기 수정이 훨씬 쉽습니다.
Steve Jackson

2

나는 내 경험으로 만 이야기 할 수 있습니다. 저에게 TDD는 개발 스타일 습관 도구 상자에 없었던 몇 가지 사항을 가져 왔습니다. 그러나 TDD가 모든 것에 대한 해결책은 아니라고 다시 말할 가치가 있습니다. 항상 탐색과 프로덕션 준비 구현을 분리하려고합니다. 탐사 단계의 TDD는 절대적으로 필요하지 않으며 심지어 속도가 느려집니다. 프로덕션 준비 코드의 다른 측면에서는 단기 및 장기적으로 개발자의 정신 건강과 프로젝트의 업에 매우 유용한 몇 가지 이점을 제공합니다.

  • TDD는 구현하기 전에 생각하게 만듭니다. 일반적으로 많은 촬영을 방지하고 솔루션을 잊어 버리는 매우 좋은 연습입니다.
  • 그것은 문제의 작은 부분에 대해 생각하게하며, 함께 맞는 작은 조각에 대한 해결책을 깨뜨립니다.
  • 문제에 맞지 않는 것을 스터브 / 모의 / 가짜로해야만 할 때마다 자연스럽게 하나의 "WTF를 던지는데, 왜 그렇게하지 않아도됩니까?" . 그리고 그것은 사물 사이의 연결을 더 잘 깨닫게 해줍니다.
  • 내 코드에 대해 쉽게 실행 가능한 검사를 제공하므로 고통스러운 "var_dump", "p", "pp", "echo"코드 디버깅 스타일을 거칠 필요가 없습니다. 그것은 단지 무엇이 잘못되었는지, 언제 잘못되었는지를보고합니다. 그리고 아직 확인하지 않으면 간단한 테스트를 반복하여 확인하는 것이 중요합니다.
  • 배포하기 전에 모든 테스트를 통과하면 코드가 작동하는지 확인합니다. 그런 다음 손톱을 먹는 대신 케이크를 먹고 커피를 마시고 오후를 즐깁니다.
  • 높은 수준의 테스트는 무언가를 리팩토링해야하는 경우에 매우 좋습니다. 내 모듈이 외부에 일부 기능을 제공해야하고 올바르게 작동하는지 입증하기 위해 기능 / 통합 / 오이 테스트를 개발 한 경우 해당 코드에서 지옥을 리팩토링하는 것이 매우 용감합니다. 여러 번 테스트를 거치지 않았고 리팩터링해야하는 코드에 직면했습니다. 이 경우 실제로 두 가지 방법이 있습니다. 1) 코드를 삭제하십시오. 2) 변경 사항을 건너 뛰고 그대로 유지하십시오.

TDD로 해결되지 않는 것이 있습니다. 당신이 짓고있는 것을 만드는 법을 모른다면, TDD는 당신을위한 해결책을 만들지 않을 것입니다. 문제 및 솔루션에 대한 대략적인 "디자인"또는 개요가 필요합니다. TDD는 더 높은 품질의 코드로 더 우아하고 유지 관리 가능한 방식으로 구현할 수 있습니다.

마지막으로 TDD 관행에 의존하는 BDD 용어로 생각하는 것을 선호합니다. BDD를 사용하면 도메인 어휘를 사용하여 솔루션을 구현하고 소프트웨어를 문제에 더 잘 맞출 수 있습니다.


1

훌륭한 디자인을 달성하는 데는 여러 가지 방법이있을 수 있으며, "훌륭한"또는 "좋은"구성 요소에 대한 다양한 해석이있을 수 있습니다. 나는 대부분의 TDDers가 정의에 대해 당신과 동의하지 않을 것이라고 생각합니다. 우리가 생각하는 코드를 보아도 좋을 것이라고 생각합니다. TDD는 우리를 매우 특정한 특성으로 이끌어 주며, 이러한 특성은 TDD 이외의 코드에서는 거의 발견되지 않습니다.

테스트 가능성은 분명히 그 특성 중 하나이며 가장 중요한 특성입니다. 매우 작은 메소드 및 클래스는 아마도 하위 특성 일 수 있으며, 이는 탁월한 이름 지정으로 이어집니다. 어쩌면 TDD를 수행하지 않고 이러한 자질을 얻는 프로그래머를 알고있을 것입니다.


1
예를 들어 군사, 우주 등의 폭포 프로세스에 의해 생성 된 코드에서 이와 동일한 특성을 거의 확실하게 발견 할 것입니다. 일상적인 프로젝트를위한 대부분의 조직.
Aaronaught

@Aaronaught 화성 기후 궤도 팀 에게 알려주세요 . :-)
Eric King

나는 90 년대 비 무기 군사 프로젝트에서 워터 폴 프로세스에 대한 경험이 있었으며 다른 군사 응용 분야의 베테랑들과도 많은 수랭식 토론을했습니다. 일반적인 합의는 폭포수 방법론과 비용이 추가 된 청구는 유지 관리가 매우 어려운 버기 시스템을 생성한다는 것입니다.
케빈 클라인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.