나는 모두 단위 테스트에 관심이 있지만 때때로 이러한 형태의 테스트 우선 개발이 정말 유익한 지 궁금합니다.
이와 같은 작고 사소한 테스트는 코드베이스의 "탄광의 카나리아"가 될 수 있으며 너무 늦기 전에 위험을 경고합니다. 사소한 테스트는 상호 작용을 올바르게 수행하는 데 도움이되므로 계속 유지하는 데 유용합니다.
예를 들어, 익숙하지 않은 API를 사용하는 방법을 조사하기 위해 마련된 사소한 테스트를 생각해보십시오. 해당 테스트가 API를 "실제로"사용하는 코드에서 수행하는 작업과 관련이있는 경우 해당 테스트를 계속 유지하는 것이 유용합니다. API가 새 버전을 출시하고 업그레이드해야하는 경우. 이제 API가 회귀를 포착하는 데 사용할 수있는 실행 가능한 형식으로 기록되는 방식에 대한 가정이 있습니다.
... [I] 실제 프로세스에서는 코드 (비즈니스 요청, 요구 사항 문서, 아키텍처 문서) 위에 3-4 개의 레이어가 있으며, 여기서 실제 정의 된 비즈니스 규칙 (할인 가격은 가격-할인)이 잘못 정의 될 수 있습니다. 그럴 경우 단위 테스트는 아무 의미가 없습니다.
테스트를 작성하지 않고 수년 동안 코딩을 해왔다면 가치가 있다는 것이 즉시 분명하지 않을 수 있습니다. 그러나 가장 좋은 작업 방법이 "일찍 릴리스, 자주 릴리스"또는 "민첩한"방식으로 신속하고 지속적으로 배포 할 수있는 능력을 원하는 경우 테스트는 확실히 의미가 있습니다. 이를 수행하는 유일한 방법은 테스트를 통해 코드에 대한 모든 변경 사항을 합법화하는 것입니다. 테스트가 아무리 작더라도 일단 그린 테스트 스위트가 있으면 이론적으로 배포 할 수 있습니다. "지속적 생산"및 "영구 베타"를 참조하십시오.
이러한 사고 방식을 갖기 위해 "먼저 테스트"할 필요는 없지만 일반적으로 그 목표에 도달하는 가장 효율적인 방법입니다. TDD를 수행 할 때 2 ~ 3 분의 작은 Red Green 리 팩터주기에 자신을 고정합니다. 어느 시점에서도 멈추고 떠날 수 없으며 디버깅하고 다시 조립하는 데 한 시간이 걸리는 완전한 혼란을 겪을 수 없습니다.
또한 단위 테스트는 또 다른 실패 지점입니다 ...
성공적인 테스트는 시스템의 오류를 보여주는 테스트입니다. 실패한 테스트는 테스트 논리 또는 시스템 논리의 오류를 경고합니다. 테스트의 목표는 코드를 깨뜨 리거나 하나의 시나리오가 작동 함을 증명하는 것입니다.
당신이있는 거 쓰기 테스트는 경우 후 코드, 당신은 순서대로 테스트가 진정으로 작동하는지 볼 수 있기 때문에 "나쁜"입니다 테스트를 작성하는 위험을 실행, 당신은 그것을 모두 파손 및 작업을 볼 필요가있다. 코드 다음에 테스트를 작성할 때 이는 "함정을 풀고"코드에 버그를 도입하여 테스트 실패를 확인해야 함을 의미합니다. 대부분의 개발자는 이에 대해 불안 할뿐만 아니라 시간 낭비라고 주장합니다.
여기서 우리는 무엇을 얻습니까?
이런 식으로 일을하면 확실히 이점이 있습니다. Michael Feathers는 "레거시 코드"를 "테스트되지 않은 코드"로 정의합니다. 이 접근 방식을 사용하면 코드베이스에 대한 모든 변경 사항을 합법화합니다. 테스트를 사용하지 않는 것보다 더 엄격하지만, 대규모 코드베이스를 유지하는 경우 그 자체로 가치가 있습니다.
Feathers와 관련하여 확인해야 할 두 가지 훌륭한 리소스가 있습니다.
이 두 가지 모두 이러한 유형의 관행과 원칙을 "그린 필드"가 아닌 프로젝트에 적용하는 방법을 설명합니다. 밀접하게 결합 된 구성 요소, 고정 된 종속성 및 반드시 제어 할 수없는 항목에 대한 테스트를 작성하는 기술을 제공합니다. "이음새"를 찾고 그 주위를 테스트하는 것이 전부입니다.
[I] 할인 가격이 잘못된 경우에도 테스트 팀은 문제를 발견 할 것입니다. 단위 테스트로 작업을 어떻게 저장 했나요?
이런 습관은 투자와 같습니다. 반품은 즉시 이루어지지 않습니다. 시간이 지남에 따라 축적됩니다. 테스트를하지 않는 것에 대한 대안은 본질적으로 회귀를 포착하거나 통합 오류에 대한 두려움없이 코드를 도입하거나 설계 결정을 주도 할 수없는 빚을지고 있습니다. 아름다움은 코드베이스에 도입 된 모든 변경 사항을 합법화한다는 것입니다.
내가 여기서 무엇을 놓치고 있습니까? 지금까지 TDD를 유용하게 받아들이는 데 어려움을 겪고 있으므로 TDD를 사랑하도록 가르쳐주세요. 나도 원한다. 왜냐하면 나도 진보적이기를 원하기 때문이다. 그러나 그것은 나에게 말이되지 않는다.
나는 그것을 전문적인 책임으로 본다. 노력하는 것이 이상적입니다. 그러나 따라 가기가 매우 어렵고 지루합니다. 그것에 관심이 있고 테스트되지 않은 코드를 생성해서는 안된다고 생각한다면, 좋은 테스트 습관을 배울 의지력을 찾을 수있을 것입니다. 내가 지금 많이하는 한 가지는 (다른 사람들과 마찬가지로) 테스트없이 코드를 작성하고 그것을 버리는 규율을 갖는 시간입니다. 이것은 낭비적인 것처럼 보일 수 있지만 실제로는 아닙니다. 그 운동으로 회사의 물리적 재료가 드는 것과는 다릅니다. 문제를 이해하고 더 높은 품질과 테스트 가능한 방식으로 코드를 작성하는 데 도움이되었습니다.
내 조언은 궁극적으로 당신이 정말로 그것을 잘하고 싶은 욕망이 없다면 전혀하지 말라는 것입니다. 유지되지 않거나 잘 수행되지 않는 불량한 테스트는 테스트가없는 것보다 더 나쁠 수 있습니다. 혼자서 배우는 것은 어렵고 아마 좋아하지 않을 것입니다.하지만 그렇게하고 싶은 욕구가 없거나 충분한 가치를 볼 수 없다면 배우는 것은 거의 불가능할 것입니다. 시간 투자를 보증합니다.
두 사람은 테스트가 사양을 적용하는 데 도움이된다고 계속 언급했습니다. 사양도 틀렸다는 것은 제 경험이었습니다.
개발자의 키보드는 고무가 도로와 만나는 곳입니다. 사양이 잘못되어 깃발을 올리지 않으면 비난받을 가능성이 높습니다. 또는 적어도 코드가 있습니다. 테스트와 관련된 규율과 엄격함은 준수하기 어렵습니다. 전혀 쉽지 않습니다. 연습, 많은 학습 및 많은 실수가 필요합니다. 그러나 결국 그것은 갚습니다. 빠르게 진행되고 빠르게 변화하는 프로젝트에서는 속도가 느려지더라도 밤에 잠을 잘 수있는 유일한 방법입니다.
여기서 고려해야 할 또 다른 사항은 테스트와 근본적으로 동일한 기술이 과거에 작동하는 것으로 입증되었다는 것입니다. "클린 룸"과 "계약 별 설계"는 모두 동일한 유형의 "메타"코드 구조를 생성하는 경향이 있습니다. 테스트는 다른 지점에서 수행하고 적용합니다. 이러한 기술 중 어느 것도 은색 총알이 아니며 엄격함으로 인해 출시 시간 측면에서 제공 할 수있는 기능의 범위에서 궁극적으로 비용이 발생합니다. 그러나 그것은 그것이 무엇에 관한 것이 아닙니다. 당신이 제공하는 것을 유지할 수 있다는 것입니다. 그리고 그것은 대부분의 프로젝트에서 매우 중요합니다.