TDD를 따르는 것이 필연적으로 DI로 이어 집니까?


14

TDD (Test Driven Development), DI (Dependency Injection) 및 IoC (Inversion of Control)를 동시에 수행하는 방법을 배웠습니다. TDD를 사용하여 코드를 작성할 때 항상 클래스 생성자에서 DI를 사용합니다. 이것이 TDD를 배우는 방법 때문인지 또는 이것이 TDD의 자연스러운 부작용인지 궁금합니다.

그래서 내 질문은 이것입니다 : 외부 서비스에 의존하지 않는 TDD 교장과 작문 단위 테스트를 따르는 것이 필연적으로 DI로 이어 집니까?


8
나는 단위 테스트의 예술을 읽고 있으며 그것이 확실히 의존성 주입 (DI)으로 이어질 것 같습니다.
프로그래머

2
무슨 언어입니까? DI / etc는 Java에서 필요하지만 언어 제한 때문입니다. 파이썬과 같은 언어는 테스트에서 원숭이 패치 종속성을 가질 수 있으므로 필요하지 않습니다.
이즈 카타

@Izkata : DI가 언어 제한에 대한 해결책이라는 데 동의합니다. 그러나 원숭이 패칭은 덜 엄격한 언어에서 반드시 같은 것은 아닙니다. 다른 방법들 중에서도 일급 기능을 선호합니다.이 기능을 사용하면 DI가 학문에 의해 근사한 것을 자연스럽게 수행 할 수 있습니다.
Javier

답변:


19

데이터베이스 나 외부 서비스에 의존하지 않는 다음 TDD 및 쓰기 단위 테스트가 필연적으로 DI로 이어 집니까?

DI에 대한 광범위한 정의는 그렇습니다. 수업은 진공 상태에 존재하지 않으므로 어떻게 든 종속성을 채워야합니다. 때로는 가치를 제공하는 것이 좋습니다. 때로는 생성자에 모형을 제공해야합니다. 때때로 IoC 컨테이너를 통해. 때로는 개인 테스트 접근자를 통해. 모든 테스트 클래스를 클래스에 주입하여 개별적으로 작동 할 수 있습니다.


9

DI에 대해 이미 알고 있지만 요점을 본 적이없는 사람들에게는 단위 테스트가 거의 항상 DI 사용으로 이어질 것이라고 생각합니다.

당신이 경우 하지 않는 DI에 대해 알고 쓰기 단위 테스트에 노력하고, 어떤 사람들은 자연스럽게 일부는 좌절 얻을 것이다 DI를 재발견 결국 연구를 통해 DI를 발견,하지만 당신은 단순히 사람에게 발생하지 빈도를 놀라게 될 것입니다 것입니다 단위 테스트를보다 쉽게하기 위해 소프트웨어를 설계하는 더 좋은 방법이있을 수 있습니다. 그 사람들은 단위 테스트를 다루기 힘든 것으로 작성하고 포기합니다.


8

단위 테스트는 DI로 이어집니다 (느슨하게 결합 된 단위를 작성해야하므로). TDD는 "verbatim"단위 테스트 대신 계층별로 테스트를 작성하는 데 사용될 수도 있기 때문에 반드시 TDD는 아닙니다. 이 기사를보십시오

http://stephenwalther.com/archive/2009/04/11/tdd-tests-are-not-unit-tests.aspx

차이점에 대한 설명.


1
"TDD가 UT가 아님"의 경우 +1 또한 극단적 인 언 커플 링은 TDD가 아닌 UT의 일반적인 결과임을 인식합니다.
Javier

3

예 / 아니요 : TDD는 잘 구조화 된 코드를 작성하여 자체적으로 DI로 연결됩니다.

즉, TDD는 일반적으로 캡슐화, SRP 및 재사용 성과 관련하여 올바른 방법을 보냅니다. 코드를 테스트하는 것만이 아니라 테스트를 사용하여 더 나은 디자인을 구현하는 것입니다. 객체가 자체 종속성을 생성하면 특정 응용 프로그램 내의 특정 컨텍스트 내에 존재하며 응용 프로그램에 더 많이 짜여 질 수 있습니다. DI는 테스트 관점뿐만 아니라 코드 품질 관점에서도 좋습니다.


당신은 예와 대답이없는 부분을 분명히 설명해 주시겠습니까? DI없이 TDD를 어떻게합니까?
Gilles

'아니요'부분은 TDD와 DI 사이의 직접적인 연결이라고 생각하지 않습니다. 코드 품질을 통해 간접적입니다. 머리카락을 쪼개고 있지만 테스트 품질뿐만 아니라 코드 품질이 목표로 삼고 있다고 생각했습니다.
Tim

0

다른 답변에서 이미 지적했듯이 TDD에는 단위 테스트가 필요하지 않습니다 . TDD를 수행하는 동안 통합 / 기능 테스트를 작성할 수도 있습니다. TDD를 적용하는 몇 가지 방법 중 단위 테스트 작성은 "가까워 질 때까지 가짜"방식입니다 (자세한 내용은 Kent Beck의 책 참조).

"TDD는 필연적으로 DI로 이어진다"는 말이 아니다. 유닛 테스트를 작성할 때 필요한 것은 테스트중인 유닛을 외부 종속성의 구현에서 분리 하는 것입니다. DI를 사용하거나 사용하지 않고 쉽게 수행 할 수 있습니다. 아마도 가장 좋은 방법은 적절한 격리 / 모의 도구를 사용하는 것입니다.


그러나 모의를 사용하기 위해 반드시 클래스의 종속성을 주입해서는 안됩니까?
Gilles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.