단위 테스트를 작성하기 전에 코드를 작성할 때의 단점은 무엇입니까?


33

나는 항상 단위 테스트를 작성하고 코드 작성을 시작해야한다는 권고를 보았습니다. 그러나 다른 방법으로가는 것이 훨씬 편안하다고 생각합니다. 코드를 작성한 다음 단위 테스트를 작성하십시오. 실제 코드를 작성한 후에 훨씬 명확하게 느껴지기 때문입니다. 코드를 작성한 다음 테스트를 수행하는 경우 테스트 가능한 디자인을 만드는 데 많은 노력을 기울이더라도 테스트 가능하도록 코드를 약간 변경해야 할 수도 있습니다. 반면에 테스트를 작성한 다음 코드를 작성하면 테스트가 코드가 형성 될 때마다 자주 변경됩니다.

테스트 작성을 시작하고 코딩으로 넘어 가기위한 많은 권장 사항을 볼 때 다른 방법으로 코드를 작성하고 단위 테스트를 수행하면 어떤 단점이 있습니까?


7
그것을 수용하기 전에 왜 특정 연습이 "모범 사례"인지 묻기 위해 +1
TaylorOtwell

답변:


37

빨간색이 답입니다. 레드는 TDD의 레드 그린 리 팩터 사이클에서 얻을 수없는 것입니다. 먼저, 실패한 테스트를 작성하십시오. 실패를 조심하십시오. 그것은 당신의 빨간색이며, 중요합니다. 그것은 말합니다 : 나는이 요구 사항을 가지고 있으며 내 코드가 만족스럽지 않다는 것을 알고 있습니다. 따라서 2 단계 (녹색)로 이동하면 코드가 현재 해당 요구 사항을 충족하고 있음을 알 수 있습니다. 요구 사항을 충족하는 방식으로 코드베이스를 변경했음을 알고 있습니다.

코드를 기반으로 코드 이후에 개발 된 요구 사항 (테스트)은 그러한 확신과 신뢰를 박탈합니다.


+1-탁월한 점수 및 점수! 귀하의 의견에 감사드립니다!
k25

7
테스트! = 요구 사항. 테스트와 코드는 모두 요구 사항 에서 파생 되어야합니다 .
Bart van Ingen Schenau

2
@Bart van Ingen Schenau : TDD의 강점은 정확하게 테스트 요구 사항입니다. 또한 실행 가능한 요구 사항입니다.
mouviciel

1
@Bart : 단위 테스트는 종종 (높은 수준의) 고객 요구 사항에 대해 너무 상세하지만, 일단 작성되면 결정적인 요구 사항이어야하는 자동화 된 수락 테스트와 같은 높은 수준의 테스트도 고려할 경우 특히 아이디어가 유효합니다. 이것이 "민첩한 수용 테스트"의 본질입니다.
Martin Wickman

3
TDD는 테스트에 관한 것이 아니라 사양에 관한 것입니다. TDD 접근 방식에 내장 된 테스트는 어떤 제품을 만들어야하는지에 대한 개발자와 고객 간의 의사 소통 수단입니다.
mouviciel

18

코드를 작성한 다음 테스트를 수행하면 코드가 사양을 충족하는지 확인하기 위해 테스트를 작성하는 대신 코드를 통과하도록 테스트 작성의 함정에 빠지기가 너무 쉽습니다.

그것은 분명히 일을하는 유일한 방법은 아니며 소프트웨어를 개발하는 "최상의"방법은 없습니다. 테스트 사례를 개발하기 위해 많은 선행 작업을 수행하면 제안 된 아키텍처에 결함이 있는지 나중에 알지 못합니다. 먼저 코드를 개발하면 더 빨리 실행하여 더 적은 침몰로 다시 디자인 할 수 있습니다 노력.


예, 당신은 첫 번째 요점에 대해 옳습니다. 그러나 나는 항상 그렇게하지 않도록합니다. 테스트가 실패하면 항상 코드로 이동하여 올바른지 확인한 다음 테스트가 올바른지 확인한 다음 잘못된 것을 수정하십시오. 당신의 의견에 감사드립니다, 나는 내 마음에 이것을 유지합니다 .. 1 포인트와 마지막 포인트에 대해 나에게서 +1 ...
k25

2
그러나 시험에 합격하면 어떨까요? 실제로 관심 코드를 실행하지 않기 때문에 테스트가 통과 될 수 있습니다. 테스트는 초기에 실패해야하기 때문에 TDD에서 실제로 발생할 수 없으며, 그렇지 않은 경우 수정하지 않으면 2 단계로 진행하지 않습니다. 따라서 테스트에는 실패 모드가 있으며 테스트에는 먼저 존재하지 않습니다.
Carl Manaster

@Carl Manaster-예, 당신은 유효한 포인트를 가지고 있습니다. 코드를 작성한 후 요구 사항을 완벽하게 알고 있으므로 단위 테스트 사례가 이상적입니다. 테스트 사례가 통과되면 코드가 옳다고 말하고 테스트가 실패하면 내가 말한 내용을 따릅니다. 그러나, 나는 당신이 거기에 유효한 점이 있다는 것을 100 % 동의합니다.
k25

@ k25 : 요점은 테스트 사례가 통과해도 코드가 올바른지 여부를 알 수 없다는 것입니다. 테스트 사례가 잘못되었을 수 있습니다.
아논.

@곧. 네, 맞습니다.이 경우도 고려하겠습니다.
k25

12

실제로, 사람들은 약어에있는 다른 두 글자를 잊지 만 TDD는 테스트에 관한 것입니다. 여기에서 읽을 수있는 것 : T 또는 TDD가없는 TDD는 Testing이 아닙니다 .

문제는 TDD로 단단히 짜여진 많은 다른 것들을 배웠다는 것입니다. 먼저 테스트하면 문제가되지 않습니다. 중요한 것은 소프트웨어 디자인에 대한 것 입니다.

단위 테스트를 "올바른 방법" 으로 작성할 수 있도록 ( 즉, 격리되고 빠르며 자동화 된 상태로), 코드를 쉽게 만드는 방식으로 코드를 배열하는 방법에 대해 다시 생각해야한다는 점을 잘 알고있을 것입니다 테스트합니다.

개인적으로 나는 그런 글이 있다는 것을 몰라도 SOLID 원리 를 배웠습니다 . 단위 테스트를 작성하면 클래스를 다시 작성해야하기 때문에 테스트하기가 너무 복잡하지 않기 때문입니다. 그것은 다음과 같은 것들로 이어졌습니다.

  • 이해가 안되거나 개인 메소드에 상주하는 기능을 별도의 클래스로 옮겨서 별도로 테스트 할 수있었습니다. (단일 책임 원칙).
  • 큰 상속 구조를 피하고 대신 구성으로 구현을 확장해야했습니다 (Open-Closed 원칙에서 두드러짐).
  • 나는 상속에 대해 똑똑해야했고, 공유 할 수있는 스텁 메소드 (Liskov Substitution Principle)를 사용할 수있는 공통 코드를 볼 때마다 추상 클래스를 사용했습니다.
  • 인터페이스와 추상 클래스를 작성하여 클래스를 분리 테스트 할 수있었습니다. 실수로 모의 객체를 작성하게합니다. (인터페이스 분리 원리)
  • 많은 인터페이스와 추상 클래스를 작성했기 때문에 공통 유형을 사용하도록 변수와 매개 변수를 선언하기 시작했습니다 (종속 반전 원리).

항상 테스트를 먼저 수행하지는 않지만 테스트를 좀 더 쉽게하기 위해 따라야 할 좋은 OO 원칙과 관행을 따릅니다. 이제는 자체 코드를 작성하지 않습니다. 쉽게 테스트하거나 더 중요하게 코드를 작성했습니다. 쉽게 유지 .


1
소프트웨어 디자인을 생각할 때 SOLID가 +1되면 자연스럽게 나타납니다.
ocodo

+1 (실제로 +10을주고 싶었지만 할 수 없었습니다). 정확히 내 생각-당신은 포인트 목록이 매우 좋았습니다. 그것이 제가이 질문을 한 이유입니다. 코드를 작성한 후 단위 테스트 작성을 시작했을 때 클래스가 훨씬 더 커졌다 고 느꼈습니다. 그러나 귀하의 의견에 감사드립니다. 양측의 장단점을보고 싶었습니다.
k25

10

다른 모든 대답은 훌륭하지만 만지지 않은 한 가지 점이 있습니다. 테스트를 먼저 작성하면 테스트가 작성됩니다. 일단 작업 코드를 작성하면 테스트를 건너 뛰고 UI를 통해 테스트하려는 유혹이 있습니다. 코드를 작성하기 전에 항상 테스트에 실패한 규칙이 있으면이 트랩을 피할 수 있습니다.


4

테스트를 먼저 작성하면 디자인이 "돌로 캐스트"되기 전에 디자인에 대해 생각할 수있는 또 다른 기회가됩니다.

예를 들어, 특정 매개 변수 세트를 취하는 메소드가 필요하다고 생각할 수 있습니다. 그리고 코드를 먼저 작성한 경우 해당 방식으로 코드를 작성하고 테스트를 지정된 매개 변수에 맞 춥니 다. 그러나 테스트를 먼저 작성하는 경우 "잠시만 기다리십시오.이 매개 변수를 기본 코드에 사용하고 싶지 않으므로 API를 변경해야합니다."라고 생각할 수 있습니다.


첫 번째 포인트에 +1 그러나 매개 변수 수준에 도달하지 못하면 디자인을 다른 사람들과 논의하고 받아 들인다면 어떨까요?
k25

@ k25-디자인 된대로 사용하기 어려운 경우에는 더 많은 생각이 필요합니다. 때로는 아주 드물게 어려운 일입니다. 그러나 더 간단한 작업으로 줄일 수 있습니다. 나는 링크가 없지만 Gosling 또는 Goetz는 몇 년 전에 Googling의 가치가있는 API 디자인에 대해 인터뷰했습니다.
Anon

확실히, 포인터에 감사합니다, 나는 확실히 그들을 살펴볼 것입니다 ...
k25

2

테스트 작성을 시작한 다음 코딩으로 넘어 가기위한 많은 권장 사항을 볼 때,

이것에 대한 진정한 이유가 있습니다.

"옳은 기분으로 행동하라"라고 말하면 사람들은 가장 멍청하고 끔찍한 일을합니다.

"테스트를 먼저 작성하십시오"라고 말하면 사람들이 적어도 올바른 일을 시도 할 수 있습니다.

다른 방법으로 코드를 작성한 다음 단위 테스트를 수행하면 단점은 무엇입니까?

일반적으로 시끄러운 테스트 및 테스트 가능하도록 재 작업해야하는 디자인.

그러나 이것은 "보통"일뿐입니다. 어떤 사람들은 디자인과 테스트를 동시에 발전시킵니다. 어떤 사람들은 테스트 가능한 코드를 작성하고 재 작업없이 테스트를 작성합니다.

"테스트 우선"규칙은 실마리가 전혀없는 사람들을 가르치고 가르치기 위해 특별히 있습니다.

비슷한 방식으로 길을 건너기 전에 항상 "두 가지 방법"을 보라고합니다. 그러나 실제로는 그렇지 않습니다. 그리고 그것은 중요하지 않습니다. 나는 오른 손잡이 운 전국에 살고 있으며, 건너기 시작할 때 왼쪽 만 봐야합니다.

왼손잡이 국가를 방문했을 때, 왼쪽 만 보면 나를 죽일 수있었습니다.

규칙은 이유를 위해 매우 강력하게 명시되어 있습니다.

당신이하는 일은 당신 자신의 문제입니다.


2

시험을 작성하는 요점은

  • 코드를 테스트하는 방법
  • 테스트 할 수 있도록 코드가 있어야하는 인터페이스

간단한 일을한다면, 테스트가 간단하고 인터페이스가 분명하기 때문에 어떤 것을 먼저 작성하든 (테스트 우선 습관을 기르는 것이 좋지만) 중요하지 않을 것입니다

그러나 TDD는 단위 테스트뿐만 아니라 승인 테스트로 확장되며 인터페이스가 중요하지 않습니다.


1

먼저 테스트를 작성하지 않으면 TDD (Test Driven Development)를 수행하지 않는 것입니다. 이점은 다양하며 여러 번 연습 할 때까지 종종 믿기 어렵습니다. 기존 개발에 비해 TDD를 통해 얻은 이점은 다음과 같습니다.

  1. 테스트의 안전망-무의식적으로 무언가를 깰 염려없이 큰 변화를 만들 수 있습니다
  2. 유기적 인 디자인-내가 끝내는 디자인은 일반적으로 처음부터 끝났을 때의 디자인과 항상 다르며 항상 더 좋았습니다.
  3. 생산성-작은 목표를 향해 노력하고 (이 하나의 테스트를 통과) 모든 테스트를 통과하면 실제로 효과가 있으며 동기를 부여합니다. 한 쌍으로 추가하면 생산성이 새로운 최고 수준에 도달합니다.

책 : Beck, K. 예제를 통한 테스트 주도 개발

좋은 예 : http://jamesshore.com/Blog/Lets-Play/


+1-멋진 포인트 (특히 1 일)와 링크 감사합니다!
k25

0

테스트를 작성할 때 실패 조건을 감지하는 방법을 어떻게 알 수 있습니까? 답은 "테스트 테스트"입니다. 그렇게하는 방법은 먼저 테스트를 작성하고 실패한 것을보고 테스트중인 장치가 성공적으로 코딩되었을 때만 통과하는 것을 보는 것입니다 (다른 답변 중 하나에 언급 된 빨간색 / 녹색 / 리 팩터 사이클).

먼저 코드를 작성하고 테스트를 수행하면 테스트에 정직한 실패가 있는지 여부에 대한 의문이 남습니다.

테스트는 사양을 나타냅니다. 코드가 "모양"될 때 ​​테스트를 수정해야하는 경우 사양이 변경되고 있음을 나타냅니다. 그것은 좋을 수도 있고 아닐 수도 있습니다. 문제에 대한 이해가 처음에는 정확하지 않았 음을 의미 할 수 있습니다. 다른 한편으로, 그것은 당신이 달성하고자 하는 것이 아니라 장치가 어떻게 일을하고 있는지 "테스트하는"것을 의미 할 수 있습니다.

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