2009-07-10 6 views
8

나는 최근에 통합 테스트를 작성하는 기능을 코딩하는 데 약 70 %를 소비했습니다. 한순간에, 나는 생각했다 "젠장,이 모든 노력이 그것을 테스트, 나는 여기에 버그가 없다는 것을 알고, 왜 내가 이렇게 열심히 일합니까? 시험을 치고 이미 끝내자 ... "얼마나 많은 테스트가 충분합니까?

5 분 후에 테스트가 실패합니다. 자세한 검사 결과, 우리가 사용중인 타사 라이브러리에서 알 수없는 중요한 버그임을 알 수 있습니다.

그래서 ... 믿음으로 무엇을 취해야하는지에 대해 무엇을 시험 할 것인지에 대한 선을 그려야합니까? 대부분의 버그를 예상하는 곳에서 모든 것을 테스트하거나 코드를 테스트합니까?

답변

0

나는 모든 것을 테스트합니다. 나는 그것을 싫어하지만 그것은 내 일의 중요한 부분이다.

+2

과거 시제에서 '나는 시험 했어'라고 쓰거나 '현재 시제로'나는 모든 것을 시험해 본다 '는 뜻인지 알 수가 없습니다. – ripper234

+0

영어로 죄송합니다. "나는 모든 것을 시험해보고 싶다. "라고 Lars A. Brekken이 말했듯이 우선 순위를 정하는 것이 매우 중요 함 – Jonathan

15

내 의견으로는, 시험에 관해서는 실용주의하는 것이 중요합니다. 실패 가능성이 가장 높은 항목 및/또는 실패하지 않는 가장 중요한 항목 (예 : 확률 및 결과 고려)에 대한 테스트 노력의 우선 순위를 지정하십시오.

코드 범위와 같은 하나의 메트릭을 맹목적으로 따르는 대신에 생각해보십시오.

테스트 스위트와 코드에 익숙하지 않으면 중지하십시오. 일이 실패하기 시작하면 다시 돌아가서 테스트를 추가하십시오.

+1

+1 ** RiskedBasedTesting ** (실패하지 않는 것이 가장 중요합니다) – k3b

1

메트릭을 추적 한 경우 소프트웨어 수명주기가 진행됨에 따라 모든 테스트에서 발견 된 버그 수를 확인할 수 있습니다. 테스트에 소요 된 시간이 발견 된 버그의 수를 정당화하지 않는 허용 가능한 임계 값을 정의한 경우 THAT는 중지해야하는 시점입니다.

아마도 버그를 100 % 발견하지 못할 것입니다.

+2

"아마도 "를"절대로 "로 변경해야합니다. –

+0

소프트웨어의 결함이 없다고 결코 절대로 말할 수 없다 증거의 부재는 결석의 증거가 아니다 – StuperUser

+0

public static void main (String [] args) { System.out.print ("Hello world!"); } 이 간단한 프로그램과 같은 어리석은 것들을 위해 나는 probabl을 유지합니다. 거기에. 결코 포함되지 않습니다. – AlbertoPL

0

단위 테스트에는 많은 시간이 소요되지만 통합 테스트에는 시간이 많이 걸립니다. 단위 테스트를 통해 구조적 방식으로 피쳐를 빌드 할 수 있습니다. 이제는 모든 빌드에서 실행할 수있는 멋진 문서 및 회귀 테스트가 있습니다.

통합 테스트는 다른 문제입니다. 그것들은 유지 보수하기가 어렵고 정의 상 많은 기능을 통합 할 수 있으며 종종 작업하기 어려운 인프라로 통합됩니다.

3

좋은 질문입니다!

  • 의 경우는 "그린 필드"새로운 프로젝트, 나는 엄격한 단위 테스트를 시행하고자 : -

    첫째로 당신의 광범위한 통합 테스트 내 개인적인 경험에서

    을 :) 지불 한 것 같은데 및 철저한 ( 가능) 통합 테스트 계획 을 설계했습니다.

  • 테스트 커버리지가 불량한 소프트웨어 이있는 경우 I 은 특정/알려진 기능을 테스트하는 테스트 집합 통합 집합 을 설계하는 것을 선호합니다. 그런 다음 코드 기반으로 I 이 더 진행됨에 따라 테스트 (유닛/통합)를 소개합니다.

얼마면 충분합니까? 어려운 질문 - 나는 이제까지 충분할다는 것을 생각하지 않는다!

+3

실제 질문은 "테스트가 더 이상 좋은 비즈니스 감각을 갖지 않게 될 때"라고 생각합니다. 프로그래머는 "충분한 범위가 될 수는 없다"고 생각할 수 있습니다 (그리고 나는 어느 정도 동의합니다). 그러나 확실히 내 보스 & 클라이언트는 다를 것을 간청 할 것입니다. –

+1

동의 - 항상 훌륭한 균형을 유지합니다. 광범위한 테스트 커버리지의 가치를 개발자가 아닌 개발자에게 수량화하는 것은 어려운 일입니다. 누구든지 그 일을하는 방법에 대한 좋은 아이디어가 있습니까? –

3

"너무 많은 것은 충분합니다."

엄격한 TDD 방식을 따르지 않습니다. 필자는 모든 코드 경로를 다루기에 충분한 단위 테스트를 작성하고 중요하다고 생각하는 모든 엣지 사례를 연습하려고 노력합니다. 기본적으로 나는 잘못 될 수있는 것을 예상하려고 노력합니다. 또한 테스트 코드의 양과 테스트 코드가 얼마나 부서지기 쉽고 중요한지 생각해보십시오.

나는 한 영역에서 엄격합니다 : 버그가 발견되면, 먼저 버그를 연습하고 실패하고, 코드를 변경하고, 테스트가 통과하는지 확인하는 테스트를 작성합니다.

+2

버그를 수정하기 전에 테스트를 작성하는 데 +1하십시오. – ripper234

0

인생의 모든 것과 마찬가지로 시간과 자원 및 중요성에 따라 제한됩니다. 이상적으로는 합리적으로 생각할 수있는 모든 것을 테스트 할 것입니다. 당연히 예상치에 잘못 될 수는 있지만, 버그가 얼마나 중요한지, 다음 기능/릴리스/프로젝트로 옮겨 갈 필요성에 따라 가정이 옳았는지에 대한 과다 테스트가 필요합니다.

참고 : 대답은 주로 통합 테스트입니다. TDD는 매우 다릅니다. 그것은 이전에 SO 덮여 있었고, 더 이상 추가 할 기능이 없을 때 테스트를 중단했습니다. TDD는 버그 발견이 아닌 디자인에 관한 것입니다.

4

코드에서 중대한 변화를 두려워하지 않을 때는 충분한 테스트가있을 가능성이 있습니다.

0

개발자가되기 전에 QA에서 1.5 년 동안 일했습니다.

모든 것을 테스트 할 수는 없습니다 (하나의 텍스트 상자에 대한 모든 순열이 알려진 우주보다 오래 걸릴 때 훈련을 받았다고 들었습니다).

개발자는 테스트에 중요한 요소와 테스트하지 않을 사항의 우선 순위를 알고 있거나 명시해야합니다. . 최종 제품의 테스트와 품질은 책임이 있지만 고객에게 명시 적으로이 책임을 부여하지 않는 한 고객 만이 기능의 우선 순위를 의미있게 명시 할 수 있습니다. QA 팀이없고 모를 경우 프로젝트 관리자에게 찾아 우선 순위를 문의하십시오.

검사는 위험 감소 운동이며 클라이언트/사용자는 중요하고 무엇이 아닌지 알게됩니다. 익스트림 프로그래밍의 첫 번째 구동 테스트를 사용하면 도움이되므로 테스트베이스가 좋고 변경 후 회귀 테스트를 수행 할 수 있습니다.

자연 선택 코드는 테스트에서 "면역"이 될 수 있으므로주의해야합니다. 코드 컴플리트 (Code Complete)에 따르면 결함을 수정하여 결함을 테스트 케이스로 작성하고 유사한 결함을 찾는 경우 유사한 결함에 대한 테스트 사례를 작성하는 것이 좋습니다.

+1

품질 보증을받지 못했기 때문에 귀하의 책임이 아니라고 말하십시오. 내가 일하는 곳은 모두 기능 소유자입니다. 우리는 사양에서 설계, 구현 및 테스트를 거쳐 기능을 구현해야합니다. 다른 사람들의 도움을받을 수는 있지만 책임은 사용자에게 있습니다. – ripper234

+0

나는 내가 의미했던 것만 큼 명확하지 않다고 생각한다. 자신의 업무와 제품의 품질을 보증하는 것은 개발자의 책임이며, 책임을지지 않는 것은 기능이 부여되지 않은 경우 기능의 우선 순위에 대해 전화하는 것입니다. – StuperUser

0

가능한 한 단위 테스트를 선호합니다. 가장 큰 부작용 중 하나는 (코드 품질을 높이고 일부 버그를 멀리하는 것 이외에) 제 생각에 높은 단위 테스트 기대 은 코드를 더 잘 작성하는 방식을 변경하려면이 필요합니다. 적어도, 그것은 그것이 나를 위해 잘 된 방법입니다.

내 수업은 테스트 할 수있는 일 수 있도록 설계 되었기 때문에 더 응집력 있고 읽기 쉽고 훨씬 유연합니다.

즉, 저는 junit 및 cobertura (Java의 경우)를 사용하여 90 % (회선 및 분기)의 기본 단위 테스트 적용 범위 요구 사항을 말합니다. 특정 클래스의 특성 (또는 cobertura의 버그)으로 인해 이러한 요구 사항을 충족시킬 수 없다고 생각하면 예외를 만듭니다.

단위 테스트는 범위에서 시작하여 경계 조건을 현실적으로 테스트하는 데 사용할 때 실제로 작동합니다. 목표를 구현하는 방법에 대한 조언을 얻으려면 다른 답변에 모두 맞습니다.

0

This article은 사용자 수에 따른 사용자 테스트의 효율성에 대해 매우 흥미로운 통찰력을 제공합니다. 3 명의 사용자 만 응용 프로그램을 테스트하고 오류의 85 %는 5 명의 사용자만으로는 오류의 약 2/3를 찾을 수 있습니다.

단위 테스트는 불연속 값을 지정하기가 어렵습니다. 단위 테스트는 테스트중인 코드를 개발하는 방법에 대한 생각을 정리하는 데 도움이 될 수 있습니다. 코드 조각에 대한 요구 사항을 작성하고 안정적으로 확인할 수있는 방법을 찾으면보다 빠르고 안정적으로 코드를 작성할 수 있습니다.

2

제럴드 와인버그의 고전적인 책 "The Psychology of Computer Programming" 테스트에 대한 좋은 이야기를 많이 가지고있다. 내가 특히 좋아 하나는 제 4 장에"Programming as a Social Activity "는"빌 "자신의 코드를 검토하는 동료를 요청하고 그들은 단지 열세 문에서 열일곱 개 버그를 발견 코드 리뷰는 버그를 찾는 데 도움이되는 추가 눈을 제공합니다. 눈이 많을수록 너무나 미묘한 버그를 발견 할 가능성이 커집니다. Linus와 마찬가지로 "눈알이 충분하면 모든 버그가 얕습니다."테스트는 기본적으로 로봇 눈입니다. 누구나 주간이나 야간에 원하는 시간에 원하는만큼 여러 번 코드를 살펴보고 모든 것이 정결한지 알려줍니다.

처음부터 개발 중이거나 유지 보수 중인지 여부에 따라 테스트 할 수있는 테스트의 수는 충분합니다. 기존 시스템.

처음부터 테스트를 시작할 때 테스트 작성에 모든 시간을 소비하고 코드 작성 기능의 10 %가 철저한 테스트를 거치기 때문에 제공하지 못하게됩니다. 우선 순위 결정이 어느 정도 될 것입니다. 한 가지 예가 개인적인 방법입니다. 개인적인 방법은 어떤 형태 (공개/패키지/보호)로 볼 수있는 코드에 의해 사용되어야하므로 개인적인 방법은 더 눈에 잘 보이는 방법에 대한 테스트의 적용을받는 것으로 간주 될 수 있습니다. 개인 코드에 중요하거나 모호한 동작이나 엣지 케이스가있는 경우 화이트 박스 테스트를 포함시켜야합니다.

테스트를 통해 1) 요구 사항을 이해하고, 2) 테스트 가능성을 코딩하여 올바른 디자인을 고수하고, 3) 기존 코드가 작동을 멈출 때를 파악하는 데 도움이됩니다. 일부 기능에 대한 테스트를 설명 할 수 없다면 필자는 코드를 완벽하게 코드화 할 수있을 정도로 기능을 잘 이해하지 못했을 것입니다. 단위 테스트 코드를 사용하면 수업 자체를 너무 많이하고 '신'객체로 변모시키는 유혹에 굴하지 않고 데이터베이스 연결이나 인스턴스 팩토리와 같은 중요한 것들을 인수로 전달하는 것과 같은 일을해야합니다. 코드를 카나리아라고하면 더 많은 코드를 자유롭게 작성할 수 있습니다. 이전에 통과 한 테스트가 실패하면 두 가지 중 하나를 의미합니다. 코드가 더 이상 기대하지 않았거나 기능 요구 사항이 변경되어 새로운 요구 사항에 맞게 테스트를 간단하게 업데이트해야합니다.

기존 코드로 작업 할 때 알려진 모든 시나리오가 포함되어 있다는 것을 보여줄 수 있어야 다음 변경 요청 또는 버그 수정이있을 때 해당 모듈이없는 모듈을 자유롭게 파고들 수 있습니다. 잔소리하는 걱정, "만약 내가 뭔가를 깨면"작은 수정을 테스트하는 데 더 많은 시간을 소비하게 만드는 코드가 실제로 변경되었습니다.

우리는 당신에게 어렵고 빠른 테스트를 줄 수는 없지만 일정 수준의 보상 범위로 촬영하면 변경 사항을 유지하거나 기능을 추가하는 능력에 대한 자신감이 높아집니다. 감소 된 수익률.

관련 문제