테스트 중심 개발로 인해 SOLID를 따라야합니까?


15

TDD 실무자 로부터 TDD 의 장점 중 하나는 개발자가 SOLID 원칙 (단일 책임, 개방 폐쇄, Liskov 대체, 인터페이스 분리 및 종속성 반전) 을 따르도록 강요한다는 것 입니다. 그러나 저에게는 SOLID를 따르는 것이 중요하므로 테스트 가능한 아키텍처를 만드는 것이 중요하다는 것을 이해하기 위해 몇 가지 테스트 (주로 단위 테스트)를 작성하는 것으로 충분합니다.

TDD는 개발자가 단위 테스트를 작성하는 것보다 SOLID를 더 적극적으로 따르도록 강요합니까?


1
TDD는 주로 개발자가 테스트를 작성하도록하는 것입니다. 따라서 단위 테스트를 작성하면 SOLID 코드가 작성된다고 말하면 TDD가 SOLID 코드를 작성하도록 요구합니다. 이것은 단지 당신이 말한 것을 기반으로하며 내 대답에서 볼 수있는 내 의견을 정확하게 반영하지 않습니다.
Yam Marcovic

1
Yam : 동의하지 않습니다. TDD는 단위 테스트 작성에 관한 것이 아닙니다. TDD는 당면한 문제에 대한 최소한의 복잡하고 정확한 해결책을 제시합니다. 테스트는 절차의 부산물 일뿐입니다.
Amit Wadhwa

정의에 의한 TDD는 코드 전에 테스트를 작성하는 것에 관한 것입니다. 이론적으로 테스트 없이도 최소한의 복잡하고 정확한 솔루션을 만들 수 있습니다. 테스트는 단순히 즉각적인 피드백과 회귀 인식을 제공합니다. 테스트를 통해과 복합 솔루션을 만드는 것이 여전히 가능하기 때문에 TDD는 최소한의 복잡한 솔루션을 만드는 것이 아닙니다. 그것은 당신이 말한 것과 반대입니다. 우아한 솔루션은 절차의 부산물이며 다른 방식은 아닙니다.
얌 마르코비치

답변:


24

우선, TDD는 SOLID 코드를 작성 하도록 강요 하지 않습니다 . 원한다면 TDD를 수행하고 하나의 큰 혼란을 만들 수 있습니다.

물론, SOLID 원칙을 아는 것이 도움이됩니다. 그렇지 않으면 많은 문제에 대해 좋은 답변을 얻지 못하고 나쁜 테스트와 함께 잘못된 코드를 작성할 수 있기 때문입니다.

SOLID 원칙에 대해 이미 알고 있다면 TDD는 그 원칙에 대해 생각하고 적극적으로 사용하도록 권장합니다.

즉, 반드시 SOLID의 모든 문자를 다룰 필요는 없지만 , 적어도 부분적으로 SOLID 코드를 작성하도록 권장하고 장려합니다.

예를 들면 다음과 같습니다.

  1. 필요한 것을 조롱 할 수 있도록 분리 된 코드를 작성해야합니다. 이것은 의존성 역전 원리를 지원합니다 .
  2. 명확하고 짧은 테스트를 작성해야하므로 테스트에서 너무 많이 변경하지 않아도됩니다 (그렇지 않은 경우 큰 코드 노이즈 소스가 될 수 있음). 이는 단일 책임 원칙을 지원합니다 .
  3. 이 문제는 논쟁의 여지가 있지만 인터페이스 분리 원칙을 사용하면 "이 5 가지 방법을 조롱하지 않은 이유는 무엇입니까?" 더 중요한 것은, 어떤 방법을 조롱할지 결정할 때 선택의 여지가 없다는 것입니다. 테스트하기 전에 클래스의 전체 코드를 실제로 다루고 싶지 않고 시행 착오를 사용하여 작동 방식에 대한 기본적인 이해를 얻으려는 경우에 좋습니다.

Open / Closed 원칙을 준수 하면 일반적으로 테스트중인 클래스에서 파생 된 테스트 클래스의 외부 서비스 호출을 재정의 할 수 있으므로 코드 뒤에 작성된 테스트에 도움이 될 수 있습니다. TDD에서 나는 이것이 다른 원칙들만큼 필요하지 않다고 생각하지만, 오해 될 수 있습니다.

Liskov 대체 규칙을 준수하는 것은 동일한 정적 유형 인터페이스를 구현하는 경우 지원되지 않는 인스턴스를 받기 위해 클래스의 변경 사항을 최소화하려는 경우 유용하지만 적절한 테스트 사례에서는 발생하지 않을 수 있습니다. 일반적으로 테스트 대상 클래스의 종속성에 대한 실제 구현을 전달하지 않습니다.

가장 중요하게, SOLID 원칙은보다 깨끗하고 이해하기 쉽고 유지 보수가 쉬운 코드 작성을 장려하기 위해 만들어졌으며 TDD도 마찬가지였습니다. 따라서 TDD를 올바르게 수행하고 코드와 테스트의 모양에주의를 기울이면 (즉각적인 피드백, API 및 정확성을 현명하게 얻을 수 있기 때문에 어렵지 않습니다) 일반적으로 SOLID 원칙에 대해 걱정할 필요가 없습니다.


또한 Open / closed 및 Liskov 대체를 따르지 않으면 조롱은 나중에 중단됩니다. 따라서 TDD가 OCP 및 LSP를 적용하는 데 도움이되지 않더라도 생성 된 테스트를 통해 중단 된 시점을 알려줍니다. 일반적으로 테스트의 효과는 있지만 언급 할 가치가 있습니다.
Jonas Schubert Erlandsson

9

아니

TDD는 지속적인 리팩토링으로 인해 모범 사례를보다 쉽게 ​​따를 수 있지만 어떠한 원칙도 따르지 않습니다. 작성하는 코드를 테스트하기 만하면됩니다. 테스트를 만족시키기 위해 코드를 작성할 때 원하는 원칙을 따를 수 있습니다. 전혀 원칙이 없습니다.


2

SOLID 원칙에 대한 이해는 TDD를 시작했을 때 몇 배나 늘어났습니다. 종속성을 조롱하는 방법에 대해 생각하기 시작하자마자 코드베이스의 거의 모든 구성 요소가 대체 구현이 가능하다는 것을 깨달았습니다. 간단한 퍼블릭 API를 테스트하는 것이 훨씬 쉽습니다.

또한 대부분의 디자인 패턴에 대한 이해도를 높였습니다. 특히 전략 패턴.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.