단위 테스트를 위해 프로젝트가 얼마나 커야합니까? [닫은]


86

내 프로젝트가 단위 테스트를 수행 할 수있을만큼 분리 된 것으로 가정합니다. 그러나 단위 테스트의 가치를 높이려면 클래스와 함수 측면에서 프로젝트가 얼마나 커야합니까?

우리 모두는 실수를 저지르고 완벽하지는 않지만 작은 프로젝트의 오류를 단계별로 처리하는 적절한 프로그래머라고 생각합니다. 아니면 프로젝트 규모에 관계없이 단위 테스트가 어려운가요?


26
당신이하고있는 큰 잘못된 가정은 프로젝트가 당신만을위한 것이고 지금만 한다는 것 입니다. 몇 달 동안 방치하고 다른 일을 한 다음 다시 돌아 오면 어떻게됩니까? "괜찮은 프로그래머"(테스트 여부와는 무관)에 대해 동일한 확신을 가지고 있습니까? 다른 사람이 프로젝트를 인수하면 어떻게 되나요? 위대한 블로거 (슬프게도 더 이상 활동하지 않음) 항상 "코드 작성기가 아니라 코드 판독기를 수용해야한다" 고 썼습니다 .
Amos M. Carpenter

6
어떻습니까 (C # .NET의 의미) : int x = 3 * (1/3); 작업이 완료된 후 x에 저장된 값은 무엇입니까? 내 요점은 하나의 라인 코드조차도 알지 못하거나 잘못된 코드를 알고 있기 때문에 버그로 이어질 수 있기 때문에 테스트가 필요할 수 있다는 것입니다.
NoChance

2
@aaamos, 내 요점을 놓친 것 같아. 이 질문만으로도 코드 리더를위한 음식 제공을 고려하고 있음을 알 수 있습니다.
Lamin Sanneh

13
두 가지 방법으로 작업을 수행 한 후에는 프로젝트가 임의의 " "지금 테스트를 작성해야합니다"라는 조건입니다.
Sane Wonko

1
당신은 잘못된 질문을하고 있습니다. 프로젝트의 규모는 중요하지 않습니다. 문제는, 그것이 정확하다면 얼마나 신경 쓰는가하는 것입니다. 정확성이 중요하면 단위 테스트보다 정확성을 향상시키는 효과적인 방법입니다.
Mark E. Haase

답변:


206

프로젝트가 이미 충분히 큽니다.

내 경험상 하나의 클래스와 하나의 함수로 단위 테스트의 필요성을 고려했습니다.

    class Simple {
        boolean reallySimple() {
            return true; // how do we make sure it doesn't change to false?
        }
    }


    class SimpleTest {
        void assertReallySimple() {
            // ensure reallySimple return value isn't changed unexpectedly
            UnitTestFramework.assertTrue(new Simple().reallySimple());
        }
    }

24
TDD를 따르고 있다면 : 0 class / 0 기능 포인트에서 더 일찍 시작해야합니다 :)
Kaz Dragon

115
+1. 프로그램이 버그를 가질 정도로 크면 단위 테스트를하기에 충분히 큽니다.
Jason Orendorff

9
@JasonOrendorff : 나는 그것을 포스터에 조롱하여 내 사무실에 넣었습니다. 훌륭한.
저스틴 ᚅᚔᚈᚄᚒᚔ

또한 "안전한"리팩토링이 가능합니다.
Timo

7
필자는 감정에 동의하지 않을 수도 있지만, 코드가 실제로 그렇게 단순하다면 완전한 단위 테스트 대신 단언만으로 도망 칠 수 있습니다.
Chuu

109

한 거기 사람들 확실히 있기는하지만 나는 "당신이해야 단위 테스트 다"아이디어로 구입 한 적이 없다 (참조 모기의 대답은 !).

내가 아는 한 단위 테스트의 주요 이점은 다음과 같습니다.

  1. 변경으로 인해 문제가 발생하지 않도록합니다.
  2. 클래스에 대한 합리적인 인터페이스를 디자인하는 데 도움을줍니다 (강제로 자신의 코드에 대한 클라이언트가되므로).
  3. 코드 사용 방법을 문서화합니다.

기본적으로 이러한 요소에 대한 테스트를 작성하고 유지하는 데 걸리는 시간을 측정해야합니다.

숫자 1은 일반적으로 테스트를 작성하는 데 가치가 있습니다. 내 경험상, 코드의> 95 %가 조만간 수정됩니다.


8
이것에 동의하십시오-단일 개발자 상점에서 일할 때 소프트웨어 품질과 모든 테스트 사이의 균형을 유지해야합니다 (많은 시간이 걸릴 수 있음). 변경을 할 때마다 단위 테스트를 수정해야 할 수도 있습니다.
Matt Wilko

1
모든 것을 테스트해서는 안되지만 외부 세계에 노출 된 행동을 테스트해야합니다. 테스트에는 유지 보수 비용이 들며, Kent Beck이 SO 답변 (SO라고 생각합니다)에서 말했듯이 코드가 올바른지 확신 할 수 있도록 테스트하십시오.
Wayne Werner

10
최소한의 자동화 테스트 만 수행하는 경우 단위 테스트가 잘못된 수준을 목표로합니다. 대신 앱을 통해 몇 가지 데이터 세트를 조롱하지 않고 끝까지 밀어주는 고급 통합 / 연기 테스트를 진행하십시오. 이러한 테스트가 가능한 많은 코드베이스를 실행하고 모든 일반적인 사용 사례와 실행 경로를 다루기를 원합니다. 앱에서 변경 사항을 알 수있는 확률이 75 % 인 경우 응용 프로그램에서 SomeClass.OneOfTheHandfulOfTestedFunctions ()를 중단 한 것을 알 수있는 것보다 5 % 확률이 더 유리합니다.
Dan Neely

3
어, 나는 당신이 한 가지를 놓쳤다 고 생각합니다. "코드가 예상대로 작동하는지 확인하십시오!"
BlueRaja-대니 Pflughoeft

3
@ BlueRaja-DannyPflughoeft : 사실, "코드를 작성하면 단위 테스트를 통과했는지 확인하는 것이 더 정확합니다!"
vaughandroid

34

간단합니다. 프로그램을 한 번 실행 한 후 폐기하면 유닛 테스트가 필요하지 않습니다.

이것이 당신에게 과도하게 보인다면, 대안이 무엇을 의미하는지 고려하십시오. 단위 테스트가 지불하지 않는 크기보다 작은 크기가 있다면 "마법 크기에 도달 했습니까? 테스트를 작성해야합니까?" 이제 프로그래머는 미래를 예측하는 데 악명이 높으며 자신의 기술을 판단하는 데 악명이 높습니다. 지금 당신에게 명백하게 보이는 코드는 심지어 한 달을 기다려도 이해할 수 없게 될 것입니다. 당신이 절대적으로있는 프로젝트는, 긍정적으로 특정 다시 사용되지 않습니다, 당신은 단지 당신이 전에 뭔가 해결 방법을 찾아 볼 수도 있습니다 원격 기회에 주위를 유지하는 것이 됩니다 다시 요청을하고, 변경 요청을 받게됩니다.

따라서 테스트가 도움이되는지 여부를 잘못 판단 할 가능성이 높으며 테스트가 필요할 때 테스트 할 정확한 의미가 실제로 100 % 확실하지 않습니다. 사소한 일회성 프로그램을 제외한 모든 프로그램이 단위 테스트를 통해 이익을 얻는다고 믿기 때문에 다시는 실행되지 않는 테스트에 소요되는 노력 비용이 테스트되지 않았고 이해하기 어려운 코드를 확장하는 위험에 대해 무시할 수 있다고 생각합니다.


22
프로그래머는 자신의 미래 예측 기술을 판단하는 데 악명이 높습니다
superM

3
@superM 동의합니다. 짧은 경력 동안 이미 썼던 "한 번만 실행"프로그램은 며칠마다 실행되어 비즈니스 크리티컬이되었습니다. 나는 "일시적인"일명 일시적인 영구 효과
라고 부릅니다

@Jalayn이 실현이 시작 되 자마자 다시 돌아가서 단위 테스트를 추가해야한다는 대답이 아닌가?
Cornel Masson

@CornelMasson 당신은 절대적으로 맞습니다. 테스트가 누락 되었기 때문에 관리자가 "아직 끝나지 않았다"고 설득하기가 종종 어렵다고 생각합니다. :-)
Jalayn

@Jalayn : 너무 사실입니다!
Cornel Masson

22

얼마 전에 저는 단위 테스트가 개발 속도를 높이는 좋은 게시물을 발견했습니다 . 질문에 대답하는 데 도움이 될 수 있습니다.

... 코드베이스에 실질적인 단위 테스트가 제공된다면 어떻게 될까요? "모든 테스트에 성공하면 코드가 여전히 수행해야하는 작업을 보장합니다" 라고 말하고 테스트에 실패하면 일부 동작이 중단 된 위치를 정확하게 보여줍니다. 이것은 훌륭합니다. 코드가 여전히 수행해야 할 작업을 수행하면 방황하지 않고 원하는 것을 추가하도록 코드를 변경할 수 있습니다. 테스트를 실행하면 믿음이 있습니다. 이것은 소프트웨어 엔지니어가되기에 좋은 세상입니다. 나는 더 빨리 나아갈 수 있음을 알았습니다 ...

나는“믿음”이 있습니다.

이것이 아마도 단위 테스트가 엔터프라이즈 컨텍스트에서 개발 속도를 높이는 가장 중요한 이유 일 것입니다.

모든 테스트를 통과해도 모든 것이 여전히 작동한다고 믿을 수 있습니다. 테스트에 실패하면 문제가 발생한 위치를 정확하게 지적합니다 ...

... 높은 단위 테스트 범위우수한 단위 테스트 를 가져야합니다 . 이러한 조건을 준수하면 새로운 기능을 추가하려는 노력이 응용 프로그램의 크기와 거의 독립적이며 장기적으로 개발 속도가 빨라지 는 상황에 처하게 됩니다 .

Michael Feathers는 그의 책 중 하나에서 코드 변경 작업을하는 두 가지 방법을 소개했습니다.

  • 편집하고기도하세요
  • 덮고 수정하십시오.

코드베이스가 얼마나 큰지는 중요하지 않습니다.


18

Kent Beck 에 따르면 Stack Overflow 질문에 대한 답변에서 단위 테스트는 얼마나 깊습니까? , 잘못되기 쉬운 코드를 테스트해야합니다.

일반적으로 생성자에서 잘못된 변수를 설정하는 것과 같은 실수를하지 않으면 테스트하지 않습니다.


4
좋은 지적이며 이는 OP의 질문이 잘못되었음을 의미합니다. 테스트 여부는 프로젝트 크기와 관련이 없습니다. 5 줄 코드베이스에는 테스트가 필요할 수 있으며 큰 코드베이스의 1 줄 메서드는 그렇지 않을 수 있습니다 (해당 코드베이스의 다른 기능은 그렇지 않음).
Nathan Long

이것은 혼자서 작업하는 작은 프로젝트에 효과적 일 수 있지만 작업을 위해 수행되는 프로젝트 (나중에 누가 작업 할 사람을 제어하지 않는 프로젝트) 또는 오픈 소스 일 수있는 모든 프로젝트에는 필요합니다. 모든 것을 테스트합니다. 그리고 나중에 "이미 작성된 모든 코드를 백업하기가 너무 어려울 것"이기 때문에 즉시 시작해야합니다.
xaxxon

@xaxxon : Kent는 실제로 Mansuro가 링크 한 것과 같은 대답으로 "팀을 코딩 할 때 우리가 공동으로 잘못하는 경향이있는 코드를 신중하게 테스트하도록 전략을 수정합니다."라고 말합니다.
henko

아뇨, 여전히 눈에 띄지 않습니다. 앞으로 누가 코드 작업을할지 알 수 없습니다. 이것은 후배 개발자를 괴롭히는 사고 방식입니다.
xaxxon

5

시간을 절약하고 개선하기 위해 단위 테스트가 구현됩니다.

  • 버그 추적
  • 코드 리팩토링 및 / 또는 재 작성
  • 통합 테스트
  • 회귀 테스트 등

프로그램의 비교적 복잡한 부분에 대한 단위 테스트를 작성해야합니다.

지금 단위 테스트를 작성해도 나중에 시간을 절약 할 수 없다면이를 건너 뛸 수 있습니다. 그러나 당신은 결코 알지 못합니다. 개인적으로 단위 테스트를 작성하지 않고 수동으로 모든 테스트를 수행하는 것이 더 저렴한 (시간, 돈 및 신경의 의미) 경우를 생각할 수 없습니다.


일반적으로 좋은 대답이므로 +1입니다. 그러나 최종 목표는 여전히 단위 테스트를 수동으로 테스트하고 싶을 것입니다.
vaughandroid

@Baqueta, 어쩌면 단위 테스트가 완전히 수동 테스트를 대체 할 말을 나는 분명 소리하지 못했지만, 내 말은하지 않았다
가게되는

4

"이것을 단위 테스트해야합니까?"는 일반적으로 다음과 같은 질문에 대답하여 대답 할 수 있습니다.

물론, 그것보다 훨씬 더 복잡하지만 시작하기에 좋은 방법입니다. 결국 다른 함수에서 사용되어 코드가 이미 테스트되고 있는지 또는 다른 함수에서 시간을 더 잘 소비하는지 등을 계량합니다.


4

테스트하지 않고 코드를 작성하지 않는 한 항상 테스트 비용이 발생합니다.

단위 테스트와 그렇지 않은 것의 차이점은 테스트 작성 비용과 테스트 비용과 직접 테스트 비용의 차이입니다.

단위 테스트 작성 비용이 2 분이고 단위 테스트 실행 비용이 실제로 0이지만 코드를 수동으로 테스트하는 비용이 1 분인 경우 테스트를 두 번 실행해도 중단됩니다.


몇 년 동안 나는 코드에 대한 단위 테스트를 작성하기에 충분한 시간이 없다는 오해를 받고 있었다. 테스트를했을 때, 그들은 부풀어 오르고 무거운 것들이 필요하다는 것을 알았을 때 단위 테스트를 작성해야한다고 생각하게 만들었 습니다 .

최근에 저는 테스트 주도 개발 을 사용하도록 권장 받았으며 완전한 계시라고 생각했습니다. 나는 이제 단위 테스트를 쓰지 않을 시간이 없다고 확신한다 .

내 경험상 테스트를 염두에두고 개발하면 더 깨끗한 인터페이스, 더 집중된 클래스 및 모듈 및 일반적으로 더 많은 테스트 가능한 SOLID 코드가 생깁니다.

단위 테스트가없는 레거시 코드로 작업하고 수동으로 무언가를 테스트해야 할 때마다 "이 코드에 이미 단위 테스트가있는 경우 훨씬 빠를 것"이라고 계속 생각합니다. 높은 커플 링으로 코드에 단위 테스트 기능을 추가하려고 할 때마다 "이것이 분리 된 방식으로 작성된 경우 훨씬 쉬울 것"이라고 계속 생각합니다.


TL; DR 버전 :

테스트 작성 비용과 테스트 실행 비용이 필요한 횟수만큼 수동 테스트 비용보다 적을 경우 테스트를 작성하십시오.

TDD를 사용하면 테스트 작성 비용이 나아질수록 테스트 작성 비용이 낮아질 가능성이 있으며 코드가 절대적으로 사소하지 않으면 테스트를 더 자주 실행하게 될 수 있습니다.


3

회귀가 발생하거나 편집 한 내용이 눈에 띄지 않게되는 것을 두려워하는 즉시 테스트 하십시오.

두려워하는 킨들, 적절한 크기로 자라게하십시오. 테스트할수록 빠를수록 좋습니다.

참고 : 프로젝트에서의 역할에 따라 단위 테스트 만 작성하려는 테스트가 아닐 수도 있습니다.

과거의 잘못된 주류 테스트 관행으로 인해 모든 사람들은 단위 테스트에 합당하게 집착 합니다. 그러나 이전에 테스트 한 적이 없다면 일반적 으로 테스트에 중점을 두어야합니다 . 단위 테스트만으로는 세계의 문제를 해결할 수 없습니다.


1
나는 당신이 지적하지만 시작 프로그래머의 기본 시작점을 단위 테스트하지는 않습니다. 또한 "일반적인 테스트"를 통해 의미하는 바를 더 자세히 설명 할 수 있습니다. 감사.
Lamin Sanneh

1
통합 테스트와 승인 테스트라는 두 가지 다른 유형의 테스트가 있습니다. 단위 테스트는 특정 단위를 포함합니다 (예 :이 클래스의이 기능은 Fizz를 골라야합니다). 해당 클래스가 상호 작용하는 다른 모든 장소를 조롱 / 스텁하여 가짜 데이터를 전달합니다. 통합 테스트를 수행 할 때 두 개 이상의 클래스를 결합하여 클래스가 원하는 방식으로 함께 진행되도록합니다. 결국 전체 시스템에 대한 엔드 투 엔드 테스트 ( "연기 테스트"라고도 함)를 수행하기에 충분한 테스트를 구축합니다.
Wayne Werner

법원에 회귀 테스트 가 있습니다 . 회귀 테스트는 일반적으로 단위 테스트보다 크며 빌드하는 데 하루가 걸릴 수 있으며 테스트 데이터 및 특수 테스트 환경에 액세스 할 수 있습니다. 실제로 단위 테스트는 더 작고, 더 매끄럽고, 유지하기 쉬운 (구식) 회귀 테스트 버전입니다.
ZJR

1

프로젝트의 크기가 아니라 테스트를 사용해야하는지 여부를 결정하는 프로젝트 유형이라고 생각합니다.

개념 증명 또는 코딩에서 배우는 것이 목표 인 다른 프로젝트에서 작업하는 경우 테스트가 필요하지 않습니다. 프로젝트가 사용되어야하고 생산으로 보내질 예정이라면 테스트를 거쳐야합니다.

Robert C. Martin의 "Clean Code"의 인용문 : "쓰기가 쉽지 않다면 테스트하기가 쉽지 않습니다."짧고 사소한 프로그램에 대한 테스트를 건너 뛸 이유가 없습니다.


0

그것은 실제로 크기의 문제가 아닙니다. 그것은 당신이하는 일 (그리고 오래된 것)입니다. 기술이 어떻게 작동하는지 배우고 문제를 버릴 계획이라면 (우리는 이것을 스크럼에서 스파이크라고 부릅니다), 많은 테스트를 수행하지 않고 코드를 작성합니다. 더 개발하려고 계획하고 있다면 (여전히 신경 쓰지 않아도) 코드에 대한 테스트를 작성해야합니다. TDD는 테스트 기술이되기 전에도 설계 기술입니다. 실행의 세부 사항에 묶이기 전에 코드가 무엇을 원하는지 명확하게 파악하려고합니다. 나는 또한 하지 않을 것이다대량의 레거시 코드에 대해 광범위한 단위 테스트를 작성하는 것이 좋습니다. 복잡한 부품 (사이클로 매틱 복잡성 / 스파게티 코드 느낌이 높음)과 자주 실패하는 부품 (주로 동일 함)을 식별하십시오. 다른 사람들이 제안했듯이, 나는 TDD에 관한 Kent Beck의 책을 읽고 Michael Feather의 책을 확실히 읽을 것입니다. 그들이 다루지 않은 것은 코드에 대한 단위 테스트를 작성 하는 정치적 측면입니다. 많은 개발자들이 코드를 테스트 가능하게 만들기 위해 코드를 변경하는 것을 싫어하고 많은 개발자들은 코드를 전혀 테스트 할 필요가 없다고 생각합니다. 직업으로서 우리가해야 할 일입니다. 다른 모든 공학 분야는 해당 작업이 사양을 충족했음을 증명해야합니다. 우리도 똑같이해야합니다.


-1

클래스 또는 기능의 한계에서 프로젝트를 바인딩 한 다음 이것이 유닛 테스트에 적합한 지 판단하는 것은 잘못되었을 수 있습니다. 응용 프로그램을 단위 테스트하면 많은 이점이 있지만 응용 프로그램을 유지 관리하거나 분산 환경에서 작업해야 할 때 진정한 아름다움이 시작됩니다. 선택이 여기에 온다. 코드를 조금만 변경해도 재해가 발생할 수 있습니다.
나는 'Unit Testing'을 제안 할뿐만 아니라 코드 범위를 확인하여 최대 코드가 단위 테스트로 적용되도록 권장합니다. 코드 적용 범위의 임계 값은 95 % 이상 이어야하며 목표는 약 100 % 여야합니다 . 코드 범위를 추적하고 보고서를 생성하는 도구를 사용할 수 있습니다.
범위 데이터를 제공하는 Visual Studio-http://msdn.microsoft.com/en-us/library/ms182496(v=vs.80).aspx
또한 NCover 또는 dotCover를 사용할 수 있습니다.

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