단위 테스트와 테스트 중심 개발의 차이점


64

설명을 읽음으로써, 나는 TDD 테스트에서 함수를 작성하기 전에 수행되고 단위 테스트에서 그 후에 수행된다는 것을 이해합니다.

이것이 가장 큰 차이점입니까, 아니면 두 용어를 비교할 수도 없습니다. 아마도 단위 테스트는 TDD의 통합 부분 일 것입니다.

답변:


104

단위 테스트 는 테스트 할 TDD 를 테스트 하는 것을 말합니다 .

둘은 직교입니다.

단위 테스트는 개별 행동 단위를 테스트하는 것을 의미합니다. 개별 행동 단위는 개별적으로 개별적으로 테스트 할 수있는 가장 작은 행동 단위입니다. (나는 그 두 가지 정의가 원형이라는 것을 알고 있지만 실제로는 잘 작동하는 것 같습니다.)

코드를 작성하기 전, 코드를 작성한 후 또는 코드를 작성하는 동안 단위 테스트를 작성할 수 있습니다.

TDD는 테스트가 개발 (및 디자인)을 주도하게하는 것을 의미합니다. 단위 테스트, 기능 테스트 및 승인 테스트를 통해이를 수행 할 수 있습니다. 일반적으로 세 가지를 모두 사용합니다.

TDD의 가장 중요한 부분은 중간 D 입니다. 당신은 시험이 당신을 운전 하게했습니다 . 테스트를 마치면 수행 할 작업, 다음에 수행 할 작업을 알려줍니다. API가 무엇인지, 디자인이 무엇인지 알려줍니다. (이것은 중요합니다 : TDD는 먼저 테스트를 작성하는 것이 아닙니다. 먼저 테스트를 작성하지만 TDD를 연습하지 않는 많은 프로젝트가 있습니다. 먼저 테스트를 작성하는 것이 테스트가 개발을 주도하게하는 전제 조건입니다.)


1
좋은 답변입니다. TDD는 테스트를 통해 개발 노력을 끌어낼 수있는 기능을 제공 할 때입니다.
Martin

그들은 직교하지 않습니다. 단위 테스트없이 TDD를 가질 수 없습니다.
JacquesB

1
@JacquesB, 왜? 우리의 테스트는 어떤 정의로든 단위 테스트라고 부르는 것이 아니며 인프라 및 기타 구성 요소에 너무 많이 의존하지만 여전히 우리 중 일부는 TDD를 수행 할 정도로 충분히 관찰 가능합니다.
AProgrammer

3
@AndrewWillems : TDD는 테스트 가 개발을 주도 한다는 것을 의미합니다 . 테스트 결과에 따르면 디자인의 모양을 결정하지 않습니다. 당신은 다음에 무엇을 해야할지 결정하지 않습니다. 당신은 당신이 완료되면 결정하지 않습니다, 테스트는 알려줍니다. 먼저 테스트를 작성한 다음 그들이 말하는 모든 것을 무시하는 것이 가능합니다. 예를 들어, 먼저 테스트를 작성할 수 있지만 모든 테스트가 녹색 인 후에도 코드를 계속 작성할 수 있습니다. 다시 말해, 먼저 테스트를 작성하지만 테스트를 테스트로 취급하고 개발을 유도하지는 않습니다.
Jörg W Mittag

1
@ JörgWMittag 당신은 순전히 그것을 볼 수도 있지만 TDD가 흑백이 아니라는 것도 알고 있습니다. TDD를 제대로 사용한다고해서 테스트가 개발을 완전히 이끌지는 못하고 테스트는 디자인의 모양을 항상 결정하지는 않습니다. 리팩토링은 어떻습니까? TDD의 매우 중요한 측면입니다. 또한 실제 세계에서는 '테스트에서 말하는 모든 것을 무시'하는 것은 없습니다. 정의에 따라 테스트를 먼저 작성하면 '일부 TDD 형식'을 사용합니다.
NickL

21

단위 테스트는 테스트 주도 개발의 구성 요소입니다

테스트 중심 개발을 수행하지 않고도 단위 테스트를 수행 할 수 있습니다. 그러나 단위 테스트를 사용하지 않으면 테스트 중심 개발을 수행 할 수 없습니다.

전통적인 단위 테스트 를 할 때는 코드를 작성한 테스트 를 작성하십시오.

테스트 주도 개발 방식은 코드 작성 하기 전에 단위 테스트 작성하는 것입니다.

간단한 단위 테스트와 비교하여 TDD (IMHO)의 가장 흥미로운 장점 :

  • 코드는 완전히 테스트 된 코드입니다. 고통스러운 테스트입니다.
  • 클래스를 올바르게 디자인해야합니다.
  • 또한 간단하게 바보유지해야합니다 .
  • Red-Green-Refactor의주기는 절대적인 지연 킬러입니다!

이 문장에서 "단위"를 놓친 적이 있습니까? "그러나 테스트를 사용하지 않고 테스트 중심 개발을 수행 할 수는 없습니다." ?
ratkok 2016 년

@ratkok : 아닙니다. 그것은 의도적이지 않았습니다. 그 문제를 해결하겠습니다.

나는이 정의가 가장 좋다. 다른 답변보다 단어로 정리하는 것이 좋습니다.
Tek

2
실제 단위 테스트 대신 모듈 테스트 또는 시스템 테스트를 사용하여 TDD를 수행 할 수 있습니다. 테스트를 실행하는 데 너무 오래 걸리면 많은 이점을 잃을 것이기 때문에 조언하지는 않지만 불가능하지는 않습니다.
Toby Speight

13

TDD 및 단위 테스트는 종종 잘못 사용되는 두 가지 매우 구체적인 용어입니다.

TDD는 실패 할 테스트를 작성하고 실행에 필요한 최소량의 코드를 작성한 다음 코드를 리팩터링하여 정리합니다. 이 작업은 사이클, 실패-> 통과-> 리팩터링으로 수행되며 알려진 각 코드 요구 사항에 대한 새로운 테스트가 추가됩니다. 보다 최근에, TDD는 유사한주기에서 승인 테스트를 작성하는 ATDD (BDD의 서브 세트)와 구별하기 위해 해당주기의 단위 테스트 작성에 대해 더욱 구체적으로되었습니다.

단위 테스트는 작고 격리 된 단위로 코드를 테스트하는 것입니다. 여기서 혼동하는 것은 xUnit 또는 Rspec과 같은 단위 테스트 도구를 사용하는 경우 단위 테스트를 작성하는 테스트를 실행한다고 생각하는 것입니다. 반드시 그런 것은 아닙니다. 이러한 도구를 사용하여 Selenium 프레임 워크를 사용하여 테스트를 실행할 수 있습니다.이 경우 단위 테스트 러너를 사용하여 승인 테스트를 작성합니다. 단위 테스트는 속도를 위해 다른 모든 것으로부터 격리 된 작은 논리에 중점을 둔 테스트입니다 (자주 실행하고 새로운 버그에 대한 빠른 피드백을 얻을 수 있도록).


1
JUnit 자체에 대한 JUnit 테스트는 좋은 예입니다.이 중 상당 부분은 JUnit으로 작성되었지만 단위 테스트가 아니라 기능 테스트 및 승인 테스트입니다. 또한 JUnit의 작성자는 TDD의 작성자이기도하며, JUnit은 상당량의 기능 테스트 및 승인 테스트를 사용하여 TDD를 사용하여 개발되었습니다. 수락 테스트는 TDD 의 필수 부분입니다.
Jörg W Mittag

6

TDD는 개발에 앞서 테스트 사례를 작성하는 방식으로 개발자가 테스트 사례를 통과하는 코드를 작성합니다. 단위 테스트는 시스템 테스트, 통합 테스트 및 승인 테스트 이외의 좁은 범위의 테스트 유형을 설명하는 데 사용되는 용어입니다.


3

TDD는 코드 작성에 대한 철학적 접근 방식입니다. 먼저 테스트를 작성하십시오. 작성하는 테스트는 단위 테스트입니다.


1

두 가지를 분리하는 방법은 TDD가 테스트에 관한 것이 아니라 코드 설계에 관한 것임을 고려하는 것입니다. 그런 다음 단위 테스트를 사용하여 종료 코드에 대한 기대치를 설정합니다. 종료 코드가 작성되고 테스트 (사양)를 통과하면 테스트를 사용하여 설계된 코드가 있습니다.


1

모든 훌륭한 답변. 단위 테스트는 '단위'를 작은 구성 요소로 간주하는 반면 TDD는 통합 및 승인 테스트를 포함하도록 확장됩니다.

(일부 TDD 변형은 '단위'를 원하는 기능을 향한 가장 작은 단계로 간주합니다 ...)


그들은해야하지만 실제로는 경험하지 않습니다. 기업 / 그룹은 프로그래머가 jUnit 테스트를 먼저 테스트하도록 강요하면 TDD를 수행한다고 말합니다. 그런 다음 개발 중에 모든 것이 이미 테스트되어 QA 및 통합 테스트를 없애거나 크게 줄였다는 사실을 사용합니다.
jwenting

1
@jwenting은 그것을 실행한다고 주장하는 사람들의 단점에 대한 방법론을 비난하지 않습니다. 어떤 도구라도 오용 될 수 있습니다
Steven A. Lowe

1
나는 아니지만 TDD가 이론과 현실에 큰 차이가 있음을 알아야합니다. 그리고 대부분의 사람들 (OP 포함)은 아마도 현실을 볼 수 있기 때문에 그 차이를 지적해야합니다.
jwenting

TDD가 디자인에 관한 것임을 고려하면-왜 승인 테스트가 포함됩니까? 디자인을 어떻게 "구동"할 것인가?
Vitalii Isaenko

@VitaliiIsaenko 수락 테스트는 설계를위한 최고 수준의 범위 지정 제공
스티븐 A. 로우
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.