단위 테스트의 ROI에 대한 확실한 증거가 있습니까?


127

단위 테스트는 훌륭하게 들리지만 중요한 가치가있는 다른 사람들을 설득 할 수 없다면 실제로 그것을 배우는 데 시간을 투자 해야할지 확실하지 않습니다. 나는 다른 프로그래머들, 더 중요하게는 경영진의 빈 카운터 (counter-counters)에게 테스트 프레임 워크를 배우고, 테스트를 작성하고, 업데이트를 유지하는 등의 시간이 추가로 소요될 것이라고 확신해야한다.

어떤 증거가 있습니까? 실제로 두 사람이 서로 다른 두 팀으로 동일한 소프트웨어를 개발 했습니까? 하나는 단위 테스트를 사용하고 다른 하나는 사용하지 않았습니까? 나는 그것을 의심한다. 난 그냥 "인터넷에서 찾아 봐, 모두가 그것에 대해 이야기하고 있기 때문에 그것이 옳은 일이어야한다"고 정당화해야합니까?

평신도들에게 단위 테스트가 노력할만한 가치가 있음을 확신시킬 수있는 확실한 증거는 어디에 있습니까?

답변:


98

예. 이것은이다 링크 NCST에서 보비 조지와 로리 윌리엄스의 연구에와 다른 Nagappan 등으로. 나는 더 많은 것이 확신합니다. 테스트에 관한 Dr. Williams 간행물 은이를 찾는 좋은 출발점이 될 수 있습니다.

[편집] 위의 두 논문은 구체적으로 TDD를 참조하며 TDD를 채택한 후 초기 개발 시간이 15-35 % 증가하지만 시험판 결함은 40-90 % 감소합니다. 전체 텍스트 버전을 구할 수없는 경우 Google Scholar 를 사용하여 공개적으로 사용 가능한 버전을 찾을 수 있는지 확인하시기 바랍니다.


14
첫 번째 연구는 agile + TDD를 워터 폴 프로젝트와 비교 한 결과, 두 개의 애자일 팀을 비교 한 결과가 더 적합합니다. 두 번째 연구는 TDD 프로젝트에 대한 품질 보너스가 거의 없거나 전혀없는 다른 연구를 언급합니다. 또한 TDD에 필요한 추가 시간에 대한 경영진의 추정치를 비교하면 도메인 전문 지식이 높은 두 팀의 예상치가 크게 높아지지만 테스트 범위는 20 % 더 낮습니다. 이것은 내 자신의 경험을 확인하고, 아직 작업하지 않은 시스템에서 훨씬 더 중요한 확신을 얻는 반면 테스트는 다른 모든 것에 방해가됩니다.
LearnCocos2D

두 연구는 비교 가능한 프로세스 모델과 테스트 방법 변경 만 비교하지 않습니다. 그것은 UT에 사용 된 시간을 실제로 더 잘 보냈다는 것입니다. 시스템 테스트. 그것은 "우리가 더 똑똑하게 시험한다면 도움이된다"는 연구일지도 모른다.
룬 FS

1
출시 후 버그를 수정하는 데 드는 비용이 전체 개발의 0.01 %라면 어떨까요? 이 경우 TDD는 끔찍한 투자가 될 것입니다. 그리고 버그가 적다면? 이 % s는 문맥이 없으면 아무 의미도 없습니다. 공정하게하기 위해 아직 전체 연구를 읽지 않았습니다. 그러나 게시물이 유용하기 때문에 (좋은 링크) ROI, IMO에 관한 질문에는 대답하지 않습니다.
Instine

1
@Instine Luckily (?) 이것이 사실이 아니라는 좋은 증거가 있습니다. 출시 후 버그 수정은 개발 초기에 발견 된 버그 (TDD가하는 것)보다 기하 급수적으로 비쌉니다. 이러한 맥락에서 모든 출시 후 버그에 대한 총 개발 비용의 0.01 %는 거의 발생하지 않습니다. (자세한 내용은 Code Complete , 특히 Boehm & Al. ,“소프트웨어 비용 이해 및 제어”, IEEE Trans Softw Eng (1988))를 참조하십시오.
Konrad Rudolph

첫 번째 연구의 샘플 크기는 24 명 (한 쌍으로 작업하므로 12 개 팀)으로 구성되어 있습니다. 통계적으로 유효한 표본 크기가 무엇인지 잘 모르겠지만이 수치는 낮습니다. 아마도 다른 사람이 알고 있습니까?
Zachary Yates

29

"나는 다른 프로그래머들, 더 중요한 것은 관리에있는 빈 카운터를 대화해야한다. 여분의 시간은 테스팅 프레임 워크를 배우고, 테스트를 작성하고, 업데이트를 유지하는 등의 시간이 소요될 것이다. "

왜?

조용하고 신중하게 그렇게하지 않는 이유는 무엇입니까? 한 번에 모두 할 필요는 없습니다. 작은 작은 조각으로 이것을 할 수 있습니다.

프레임 워크 학습에는 시간이 거의 걸리지 않습니다.

단 하나의 테스트를 작성하는 데는 시간이 거의 걸리지 않습니다.

단위 테스트 없이는 소프트웨어에 대한 확신이 있습니다. 하나의 단위 테스트로도 자신감이 있으며 하나 이상의 테스트가 통과했음을 증명할 수 있습니다.

그게 다야. 아무도 당신이하고있는 것을 알 필요가 없습니다. 그냥 해.


9
빈 카운터는 수명이 코드에 의존하는 경우 나머지 코드에서 단위 테스트를 지시 할 수 없습니다. 나는 단지 제안을지지한다. 그러나 한 가지주의 할 점이 있습니다. 혼자가 아닌 경우이 연습을 수용하려면 동료 개발자가 필요합니다. 그렇지 않으면 의도하지 않은 테스트를 중단합니다.
Thomas Eyde

그냥하고 그들에게 말하지 말고 커피 브레이크에서 당신의 대학에 아이디어를 판매하십시오 ;-)
Johan

3
마감 시간을 일정하게 지키지 않으면 해고 당할 수 있습니까?
Andrew

3
@Neko : 단위 테스트는 "비트 오버 헤드"를 추가하지 않습니다. 그들은 감소 바보 같은 실수의 전체 홍수를 방지하여 전체 워크로드를. 사업은 성장하지 않는다. 그것은 본질적으로 나쁜 코드에서 좋은 단위 테스트와 좋은 코드로 바뀝니다.
S.Lott

1
빈 카운터는 엔지니어가 도메인 문제에 대한 올바른 솔루션을 제공하기를 원합니다. 솔루션의 일부로 테스트를 작성할 수 있습니다. 그들은 눈치 채지 못할 것입니다. 그들이 요구한다면, 당신이 그들에게 강력하고 재 작업이 필요하지 않도록하기 위해 더 많은 시간을 소비하고 있다고 말할 수 있습니다. 당신이 그들에게 단위 테스트를 작성하는 것을 제안한다면 당신은 그들이 알지 못하는 것에 대한 승인을 요구합니다.
Yorkshireman

16

나는 이것에 대해 다른 접근법을 취한다.

코드가 올바른지 어떤 보증을합니까? 아니면 팀의 누군가가 func1 ()을 변경할 때 가정 X를 위반하지 않습니까? '정직'을 유지하는 단위 테스트가 없으면 많은 확신이 없습니다.

테스트를 최신 상태로 유지한다는 개념은 흥미 롭습니다. 테스트 자체는 종종 변경 될 필요가 없습니다. 내가 생산 코드에 비해 테스트 코드를 3 배있어, 그리고 테스트 코드가 변경되었습니다 아주 작은. 그러나 밤에 잘자는 것은 물론 고객에게 시스템을 손상시키지 않고 Y 기능을 구현할 수 있다는 확신을 가지고 있습니다.

아마도 학계에서는 증거가있을 수 있지만, 상업 테스트를 한 사람이라면 누구나 그런 시험에 대한 비용을 지불 한 적이 없습니다. 나는 테스트 프레임 워크에 익숙해 질 및 쓰기 시험은 내가 만든, 나를 위해 잘 작동하고있다, 그러나, 당신에게 약간의 시간이 걸렸습니다 수 있습니다 정말 훨씬 더, 내 요구 사항과 디자인에 대해 생각 팀에 작업 할 때 내가 이제까지했던 것보다 그 테스트를 작성하지 않았습니다.

1) 코드에 대한 확신이 있고 2) 그렇지 않은 경우보다 더 일찍 문제를 발견합니다. 당신은 품질 보증 사람이 봐, 당신은 XYZ () 함수를 경계 검사는? 않았다 귀찮게하지 않았다 "말을하지 않아도 그는 때문 버그를 찾을 수 없습니다 당신 이 한 달 전에 발견했다. 그건 좋다 그를 위해, 당신을 위해, 회사를 위해 그리고 고객을 위해.

분명히 이것은 일화이지만, 나를 위해 놀라운 일을했습니다. 스프레드 시트를 제공 할 수 있는지 확실하지 않지만 고객은 행복하며 이것이 최종 목표입니다.


내 QA 담당자는 예리했지만 코드를보고 있지는 않았지만 경계가 확인되지 않았다는 것을 쉽게 알 수있었습니다.
itsmatt

무모하게 코드가 아닌 디자인과 정확성에 대해 더 많이 생각하도록하는 단위 테스트에 대해 완전히 동의했습니다.
chakrit

7
고객은 테스트 작성 비용을 지불하지 않습니다. 그런 다음에도 코드 작성 비용을 지불하지 않습니다. 그들은 우리에게 그들의 문제를 해결하기 위해 돈을 지불하고, 직면했을 때, 그들은 또한 문제가 해결되기를 원한다고 확신합니다. 증거가 주어지면 믿을 수없는 고객은 투자를 확보하기를 원하지 않습니다.
Thomas Eyde

10

단위 테스트 없이도 크 래피 소프트웨어를 작성할 수 있다는 확실한 증거가 있습니다. 단위 테스트를 통해 엉터리 소프트웨어에 대한 증거조차 있다고 생각합니다. 그러나 이것은 요점이 아닙니다.

단위 테스팅 또는 TDD (Test Driven Development)는 테스트 테크닉이 아닌 디자인 테크닉입니다. 테스트로 작성된 코드는 그렇지 않은 코드와 완전히 다르게 보입니다.

이것이 귀하의 질문이 아니지만, 실제로 길을 가고 잘못 질문받을 수있는 질문에 답하고 다른 보고서에서 도전 할 수있는 증거를 가져 오는 가장 쉬운 방법인지 궁금합니다. 사건에 대한 확실한 증거를 찾더라도 다른 사람이 이에 대한 확실한 증거를 찾을 수 있습니다.

기술 담당자의 작업 방식을 결정하는 것이 빈 카운터의 사업입니까? 그들은 더 비싼 도구가 필요하지 않다고 생각하기 때문에 모든 경우에 가장 저렴한 도구를 제공합니까?

이 주장은 신뢰 (애자일 팀의 기본 가치 중 하나)를 기반으로이기거나 승리 한 당사자의 역할을 기반으로 상실됩니다. TDD 지지자들이 역할의 힘으로이기더라도 나는 그것을 잃어버린 것으로 간주합니다.


13
들어 봐, 들어 봐 :) TDD에 대한 많은 어려운 증거는 이미 경험이없는 매우 숙련 된 팀들로부터 나옵니다. TDD는 결과를 얇게 만들지 않고 개선했습니다. 실제 ROI는 적절한 코더를 고용하고 그들이 일을 수행하는 방법을 결정하게합니다.
workmad3

"기술자들이 어떻게 작동해야 하는지를 결정하는 것이 콩 카운터의 사업인가?" -> 모든 사업 결정은 돈으로 귀결됩니다. 아직도, 좋은 대답, +1
jcollum

@jcollum 그러나 업무 수행 방식은 돈과 아무런 관련이 없으며, 돔을 책임지고 자한다면 그들이 요청한 방식을 결정하게 할 것입니다.
Rune FS

TDD는 디자인 기법이 아니라 코딩 기법 일뿐입니다. blog.ploeh.dk/2010/12/22/TheTDDApostate 많은 의견 제시 자들은 TDD에 리팩토링 (디자인 기법)이 포함되지만 리팩토링에 TDD가 포함되어 있지 않다는 의견에 동의하지 않습니다. 하나는 테스트없이 리팩토링 할 수 있고, 대규모의 복잡한 리팩토링은 어쨌든 단위 테스트에 영향을 미칩니다. 즉, 테스트도 리팩토링해야하므로 유효하지 않거나 잘못된 녹색이 될 수 있습니다. 단순한 리팩토링은 테스트에 영향을 미치지 않지만 리팩토링은 간단하기 때문에 오류의 위험이 적습니다.
KolA

@KolA 글쎄,이 답변 후 10.5 년을 반영하여 오늘 조금 더 방어 적이라고 말할 수는 있지만 여전히 TDD가 당신이 필요로 하는 유일한 디자인 기술 이라고 주장하지는 않으며 Mark는 그것과 함께 열립니다. 하나가 아니라는 결론을 내리기 전에 좋은 디자인 기술. 나는 그의 의견을 약화하고 말하고 싶지만 경우에만 설계 기술. 내가 TDD를 작성한 모든 코드는 내가 작성한 코드와 다르게 보입니다. 나는 그것을 디자인의 결과라고 부릅니다. TDD 외에도 화이트 보드, 토론 및 기타 도구를 사용하는 것이 가장 좋습니다. 링크에 감사드립니다
Olaf Kock


6

엄격하게 단위 테스트보다 TDD에 대한 자세한 내용은 Nagappan, E. Michael Maximilien, Thirumalesh Bhat 및 Laurie Williams 의 네 가지 산업 팀 논문 의 결과 및 경험과 같은 테스트 중심 개발을 통한 품질 향상 실현에 대한 링크 입니다. Microsoft Empirical Software Engineering and Measurement (ESM) 그룹이 발간 한 논문은 이미 여기에 언급되어 있습니다.

팀은 TDD 팀이 비 TDD 팀보다 60 % ~ 90 % 더 나은 (결함 밀도 측면에서) 코드를 생성한다는 사실을 발견했습니다. 그러나 TDD 팀은 프로젝트를 완료하는 데 15 ~ 35 % 더 오래 걸렸습니다.


5

여기에 회사를 바꾸는 사람에 대한 대단하고 재미있는 글이 있습니다. TDD에만 국한되지 않습니다. http://jamesshore.com/Change-Diary/ 그는 "콩 카운터"를 꽤 오랫동안 설득하지 않았고 대신 "게릴라 전술"을 수행했습니다.


이 링크는 흥미로워 보입니다 ... 재확인 할 가치가 있습니다 : 조직의 업무 프로세스 변경 ...
불쾌한 생과자

5

이 답변에 더 많은 정보를 추가하기 위해 학술 및 산업 배경에 대한 생산성 및 품질 영향을 파악하는 데 도움이되는 두 가지 메타 분석 리소스가 있습니다.

초청 편집자 소개 : TDD – 두려움없는 프로그래밍의 기술 [ link ]

모든 연구자들은 TDD가 더 나은 작업 초점과 테스트 범위를 장려한다는 데 동의하는 것 같습니다. 테스트가 더 많다고해서 반드시 소프트웨어 품질이 더 좋아지는 것은 아니지만 테스트 설계에 대한 프로그래머의 관심이 높아지는 것은 고무적입니다. 테스트를 통해 잠재적 인 대량의 행동을 샘플링하는 것으로 볼 때 더 많은 테스트는 더 철저한 샘플을 의미합니다. 각 테스트가 다른 테스트에서 찾을 수없는 중요한 문제를 발견 할 수있는 범위 내에서, 특히 저렴하게 실행할 수있는 경우 테스트가 유용합니다.

표 1. 테스트 주도 개발에 대한 선택된 경험적 연구 요약 : 업계 참가자 *

https://www.computer.org/cms/Computer.org/dl/mags/so/2007/03/figures/s3024t1.gif

표 2. TDD : 학술 참가자 *의 선택된 경험적 연구 요약

여기에 이미지 설명을 입력하십시오

테스트 중심 개발이 외부 품질 및 생산성에 미치는 영향 : 메타 분석 [ link ]

요약:

이 논문은 TDD (Test-Driven Development)가 외부 코드 품질 및 생산성에 미치는 영향을 조사하는 27 개 연구의 체계적인 메타 분석을 제공합니다.

결과는 일반적으로 TDD가 품질에 작은 긍정적 영향을 미치지 만 생산성에 별다른 영향을 미치지 않음을 나타냅니다. 그러나 하위 그룹 분석은 학업 연구에 비해 산업 연구에서 품질 개선 및 생산성 저하가 훨씬 더 컸음을 발견했습니다. TDD와 통제 그룹 프로세스 사이의 시험 노력의 차이가 중요한 연구에서 생산성이 크게 떨어졌습니다. 시험 노력의 차이가 상당 할 때 학술 연구에서도 품질이 크게 향상되었습니다. 그러나 데이터 부족으로 인해 산업 연구에 관한 결론을 도출 할 수 없었습니다.

마지막으로, 중재자 변수로서 개발자 경험과 작업 크기의 영향을 조사하고, 작업 크기와 품질 향상의 크기간에 통계적으로 유의 한 양의 상관 관계가 발견되었습니다.


4

글쎄, 당신은 단위 테스트를 사용해야하는 대기업이 있지만 소규모 회사라면 왜 대기업을 모방합니까?

몇 년 전에 단위 테스트를 시작했을 때 저에게 (오늘 우리는 주로 행동을 사용합니다 모델을 합니다) 하나의 응용 프로그램에서 모든 경로를 제어 할 수 없기 때문이었습니다.

나는 첫 번째 프로그래밍과 REPL을 구사하는 데 익숙했기 때문에 단위 테스트 (모든 기능에 대해 하나의 테스트)를 받았을 때 REPL을 컴파일하는 언어로 다시 가져 오는 것과 같았습니다. 그것은 내가 작성한 모든 코드 줄에 재미를 가져 왔습니다. 나는 신을 느꼈다. 나는 그것을 좋아. 더 나은 코드를 더 빨리 작성하기 시작했음을 알리는 보고서가 필요하지 않았습니다. 상사는보고를 할 필요가 없었습니다. 상사는 비생산적인 코드를 작성하는 매우 이상한 일로 인해 "일반"버그 수가 거의 없음에서 거의 없음으로 떨어질 것이라는보고를 할 필요가 없었습니다.

다른 포스터가 이미 작성한 것처럼 TDD를 사용하여 테스트 (확인)하지 않습니다. 스펙, 유닛 (객체, 모듈, 함수, 클래스, 서버, 클러스터)의 작동 방식을 캡처하기 위해 작성합니다.

많은 회사에서 소프트웨어 개발의 다른 모델로 전환 한 것에 대한 많은 실패와 성공 사례가 있습니다.

새로운 것을 쓸 때마다 방금 사용하기 시작했습니다. 영어로 번역하기가 다소 어려워지는 오래된 말이 있습니다.

그렇게하는 것을 눈치 채지 못할 정도로 간단한 것으로 시작하십시오. 마라톤 훈련을 할 때는 9 미터를 걸어 1 미터를 달리면서 시작하십시오.


그냥해야합니까? 작동한다고 보장되며 아무도 나와 함께하지 않더라도 상관 없습니다.
까마귀

실제로, 이것은 Joel Test : joelonsoftware.com/articles/fog0000000043.html 입니다. 단위 테스트에 관한 노벨상 수상 연구의 부족
Jonke

4

단위 / 통합 테스트에서 발견 된 버그를 수정하면 실제 시스템에서 수정하는 것보다 비용이 몇 배나 적게 든다는 통계가 있습니다 (수천 개의 실제 프로젝트 모니터링에 기반 함).

편집 : 예를 들어 " Code Complete "라는 책 은 그러한 연구에 대해보고합니다 (20.3 절. "품질 기법의 상대적 효과 성"). 그러나 컨설팅 분야에서도이를 입증하는 민간 연구도 있습니다.


1
이 내용은 Steve McConnell의 Code Complete 에 설명되어 있으며 다른 이유로 책장에 갖고 싶은 책입니다.
Robert Rossney

이는 테스트 방법과 관련이 없지만 프로세스에서 버그가보고되는 시점과 관련이 있으며 개발시 버그를 발견 할 때 버그를 수정하는 데 드는 비용이 1000 배까지 비싸기 때문에 사양에서 버그를 찾는 데 더 많은 시간이 소요됩니다. 개발 단계 당 10의 요소)
룬 FS

OTOH, 실제 상황에서 사람들이 실제로 겪는 문제 만 고치면 훨씬 적은 버그를 수정하게 될 것입니다. 사양에서 버그를 감지하는 것이 구현시 동일한 버그를 감지하는 것보다 훨씬 더 많은 노력이 필요할 수 있고 버그를 감지하는 것이 버그 수정 비용의 일부이기 때문에 버그를 조기에 수정하는 것이 실제로 더 저렴하다는 것도 명확하지 않습니다. 이것은 자명 한 것처럼 들리기 때문에 모두가 믿는 것 중 하나이지만, 그 효과를 보여주는 건전한 연구를 본 적이 없습니다.
LKM

0

단위 테스트에서 나에게 팔린 경험을 바탕으로 한 가지 데이터 포인트가 있습니다.

많은 달 전에 저는 큰 VB6 프로젝트에서 일하는 신입생이었으며, 많은 저장 프로 시저 코드를 작성할 기회가있었습니다. 하위 시스템 중 전체 코드베이스의 약 1/4을 구성하여 50K 정도에서 약 13,000 LOC를 작성했습니다.

스토어드 프로 시저에 대한 단위 테스트 세트를 작성했지만 Rational Robot과 같은 도구가 없으면 단위 테스트 VB6 UI 코드를 실제로 실행할 수 없습니다. 적어도 그때는 아니 었습니다.

QA의 통계는 전체 서브 시스템에서 약 40 개 또는 50 개의 결함이 발생했으며 그 중 2 개 는 저장 프로 시저에서 시작된 것입니다. 그건 하나의 코드 결함 6,500 당 라인을 전체 당 1,000 개 ~ 1,200 개당 1 . 또한 VB6 코드의 약 2/3는 오류 처리 및 로깅을위한 상용구 코드였으며 모든 절차에서 동일합니다.

손으로 너무 많이 바르지 않으면 단위 테스트에 결함 비율이 적어도 몇 배나 향상 될 수 있습니다.

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