"쓰기 테스트 + 통과까지 리팩터링"접근 방식은 매우 반 엔지니어링합니다.
리팩토링과 TDD에 대한 오해가있는 것 같습니다.
코드 리팩토링 은 소프트웨어의 비 기능적 속성 중 일부를 개선하기 위해 외부 기능 동작을 수정하지 않고 컴퓨터 프로그램의 소스 코드를 변경하는 프로세스입니다.
따라서 코드가 전달 될 때까지 코드를 리팩터링 할 수 없습니다 .
그리고 TDD, 특히 단위 테스트 (다른 테스트는 나에게 그럴듯 해 보이기 때문에 핵심 개선을 고려합니다)는 작동 할 때까지 구성 요소를 다시 디자인하는 것이 아닙니다. 구성 요소가 디자인 된대로 작동 할 때까지 구성 요소를 디자인하고 구현 작업을 수행합니다.
또한 정말 파악하는 것이 중요하다, 그 단위 테스트는 테스트에 관한 단위 . 항상 많은 것을 처음부터 작성하는 경향이 있으므로 그러한 단위를 테스트하는 것이 중요합니다. 토목 기사는 이미 자신이 사용하는 장치 (다른 재료)의 사양을 알고 있으며 작동 할 것으로 기대할 수 있습니다. 이것들은 종종 소프트웨어 엔지니어에게 적용되지 않는 두 가지 사항이며, 테스트를 거친 고품질의 구성 요소를 사용하기 때문에 사용하기 전에 장치를 테스트하는 것은 매우 공학적입니다.
토목 기사가 경기장을 덮기 위해 지붕을 만들기 위해 새로운 섬유 조직을 사용하려는 아이디어를 가지고 있다면, 필요한 사양 (예 : 무게, 침투성, 안정성 등)을 정의하여이를 단위로 테스트 할 것으로 예상합니다. 그런 다음 테스트가 완료 될 때까지 테스트하고 수정하십시오.
이것이 TDD가 작동하는 이유입니다. 테스트 된 유닛의 소프트웨어를 빌드 할 경우, 테스트 할 때 적용 범위가 넓다고 가정 할 때, 코드를 함께 연결하고 풀 코드에 문제가있을 것으로 예상 할 수 없을 때 훨씬 더 효과적입니다.
편집 :
리팩토링 의미 : 기능에 변화가 없습니다 . 단위 테스트 작성의 한 가지 요점은 리팩토링이 코드를 손상시키지 않도록하는 것입니다. 따라서 TDD는 리팩토링에 부작용이 없음을 보증하기위한 것입니다.
내가 말했듯이 단위는 시스템이 아닌 테스트 단위를 테스트하므로 입도는 정확하게 정의되기 때문에 입도는 관점의 주제가 아닙니다.
TDD는 훌륭한 아키텍처를 권장합니다. 모든 장치에 대한 사양을 정의하고 구현해야하므로 구현 전에 미리 설계해야하므로 생각과는 정반대입니다. TDD는 개별적으로 테스트 할 수있는 유닛의 생성을 지시하므로 완전히 분리됩니다.
TDD는 스파게티 코드에서 소프트웨어 테스트를 던져 파스타가 통과 할 때까지 교반한다는 의미는 아닙니다.
토목 공학과 달리 소프트웨어 공학에서 프로젝트는 일반적으로 끊임없이 발전합니다. 토목 공학에서는 x 톤을 운반 할 수 있고 시간당 n 대의 차량에 충분한 넓이 인 A 위치에 교량을 건설해야합니다.
소프트웨어 엔지니어링에서 고객은 기본적으로 어느 시점에서든 (완료 후) 결정을 내릴 수 있으며, 이중 데크 브리지를 원하고 가장 가까운 고속도로와 연결되기를 원하며 회사가 리프팅 브리지가되기를 원합니다. 최근에 범선을 사용하기 시작했습니다.
소프트웨어 엔지니어가되어 주어 디자인을 변경할 수 있습니다. 그들의 디자인에 결함이 있기 때문이 아니라 그것이 modus operandi이기 때문입니다. 소프트웨어가 제대로 엔지니어링 된 경우 모든 하위 수준 구성 요소를 다시 작성할 필요없이 상위 수준에서 다시 디자인 할 수 있습니다.
TDD는 개별적으로 테스트되고 분리 된 구성 요소로 소프트웨어를 구축하는 것입니다. 제대로 실행하면 요구 사항의 변경 사항이없는 것보다 훨씬 빠르고 안전합니다.
TDD는 개발 프로세스에 요구 사항을 추가하지만 다른 품질 보증 방법은 금지하지 않습니다. 물론 TDD는 공식 검증과 동일한 보안을 제공하지 않지만 공식 검증은 비용이 많이 들고 시스템 수준에서 사용하기가 불가능합니다. 그래도 원하는 경우 두 가지를 결합 할 수 있습니다.
TDD에는 시스템 수준에서 수행되는 단위 테스트 이외의 테스트도 포함됩니다. 설명하기 쉽지만 실행하기가 어렵고 측정하기가 어렵습니다. 또한, 그들은 그럴듯하다. 나는 그들의 필요성을 절대적으로 본다. 그러나 나는 그것들을 아이디어로 실제로 평가하지는 않는다.
결국 어떤 도구도 실제로 문제를 해결하지 못합니다. 도구는 문제를보다 쉽게 해결합니다. 다음과 같은 질문을 할 수 있습니다 : 끌이 어떻게 훌륭한 건축에 도움이됩니까? 똑바로 벽을 만들 계획이라면 직선 벽돌이 도움이됩니다. 물론, 만약 당신이 그 도구를 바보에게 주면, 그는 아마도 그의 발을 통해 도구를 밟을 것입니다. 그러나 그것은 초보자에게 잘못된 보안을 제공하는 TDD의 결함이 아닌 한 끌의 잘못이 아닙니다. 좋은 시험을 쓰지 않는 사람.
결론적으로, TDD는 TDD가없는 것보다 훨씬 잘 작동한다고 말할 수 있습니다.