“충분한”코드 범위는 얼마입니까?


37

우리는 내 직장에서 코드 적용 범위를 넓히기 시작했고, 생각이 들었습니다 .... 코드 적용 범위는 얼마입니까?

코드 적용 범위에서 수익이 감소하는 시점은 언제입니까? 좋은 커버리지와 충분하지 않은 포인트 사이의 장점은 무엇입니까? 작성하는 프로젝트 유형 (예 : WPF, WCF, Mobile, ASP.NET)에 따라 다릅니다 (이는 C # 클래스입니다).


이에 대한 좋은 대답은 없습니다. Artima 개발자 포럼에서 " 얼마나 많은 단위 테스트 범위가 필요합니까? "에 유용한 조언이 있습니다.
RN01

답변:


19

우리 는 적어도 70 %를 목표로합니다 . 보다 쉽게 ​​테스트 할 수있는 것 (예 : 기능적 데이터 구조)에서는 90 %를 목표로하며 대부분의 개인은 가능한 한 100 %에 가깝습니다. 테스트하기 매우 어려운 WPF 관련 항목 및 기타 프레임 워크에서는 적용 범위가 훨씬 낮습니다 (거의 70 %).


WPF는 본질적으로 테스트하기 어렵습니까? 아니면 더 나은 범위를 확보하기위한 최선의 전략을 세우는 데 노력하지 않았습니까?
JBR 윌킨슨

많은 것이 WPF 입력이 위조되기 어렵다는 사실에서 비롯됩니다. 우리의 테스트는 가능한 한 unity 또는 APIy입니다. WPF (최소한 입력)의 "맨 위에"있는 레이어를 쉽게 위조 할 수 없기 때문에 테스트하기가 어렵습니다. API의 비 GUI 부분이 테스트하기 쉽기 때문에 큰 문제는 아니지만 모델 (또는 뷰 모델)에서 도전적인 WPF 로의 마지막 확장입니다.
노아 리차드

1
네, WPF는 테스트 할 나쁜 년입니다. 그리고 뷰에서 바인딩을 확인하는 컴파일 시간이 있다면 그걸로 살 수 있습니다. 따라서 뷰가 바인딩되는 속성을 변경하면 최소한 빌드가 중단됩니다. 그러나 그렇지 않습니다. 이로 인해 승인 테스트에서 GUI 자동화를 사용하게되었으며, 이는 또한 작성하기 어려운 일입니다. 그러나 적어도 시스템이 작동한다는 확신을줍니다.
Pete

나는 숫자 (70 %)를 좋아한다. 팀이 높아지면 가치보다는 커버리지 테스트를 시작하는 경향이 있습니다. WPF 의견에서 우리는 시작일에 불과합니다. 즉, 우리는 쉽게 테스트 할 수 있도록 WPF 코드를 작성 / 구조화하지 않습니다. 모의 모델이 도움이됩니다. 코드를 디자인 할 때 테스트 할 수 있도록 디자인하십시오. 그리고 그렇습니다.이 시점에서 제한된 예가 있으므로 생각해보아야합니다. 업계 경험이 적은 TDD가 처음 소개되었을 때 대부분의 개발자가 있었던 곳과 다르지 않습니다.
Jim Rush

좀 더 구체적으로 WPF는 단위 테스트에 나쁜 역할을 합니다. 어떤 이유로 더 많은 범위를 커버해야하는 경우 WPF 클래스를 커버하는 가장 쉬운 방법은 코딩 된 UI 테스트 / 통합 테스트
jk입니다.

55

코드 범위만으로는 메트릭이 좋지 않다는 의견이 있습니다. 코드 를 포괄 하는 수많은 쓸모없는 테스트를 쉽게 생성 할 수 있지만, 예를 들어 출력을 적절하게 확인하지 않거나 엣지 케이스를 테스트하지는 않습니다. 코드를 다루는 것은 예외가 아니라 올바른 것이 아니라는 것을 의미합니다. 품질 테스트가 필요합니다. 수량은 그다지 중요하지 않습니다.


8
코드 범위는 자동화 된 빌드 시스템에서 수행되는 자동화 된 테스트의 출력 중 하나 여야합니다. 출력을 확인하지 않는 테스트는 거의 가치가 없습니다. 임계 값 미만 범위는 테스트가 없거나 불충분 한 새로운 기능을 나타냅니다. 사람들을 이길 수는 없지만 테스트되지 않은 코드를 표시 할 수 있습니다.
JBR 윌킨슨

3
나는 JBRWilkinson을 두 번째로 보았습니다. 좋은 코드의 지표는 아니지만 코드 범위는 테스트 부족의 지표 일 수 있습니다. 또한 단위 테스트는 성능 측정과 같은 방식으로 다른 메트릭을 제공 할 수 있으므로 예기치 않은 워크로드에서 서버가 다운 될 때 새 릴리스가 갑자기 놀라지 않도록합니다.
Matthieu M.

4
나는 이것이 잘못된 선택이라고 생각합니다. 적은 양의 코드에만 적용되는 고품질 테스트는 많은 양의 코드에 영향을 주지만 실제로 결과를 확인하지 않는 "테스트"와 같이 전반적인 품질 측정은 좋지 않습니다. 달리 말하면, 앞 운전자의 사이드 휠을 테스트하는 데 매우 철저한 자동차의 품질 보증 프로세스를 상상해보십시오. 차 전체를 눈으로보고 "예, 좋아 보인다"고 말하는 QA 프로세스와 같은 방식으로 나쁘다.
Noah Richards

37

"충분히"는 아무 것도 위반하지 않는다는 확신을 가지고 코드를 변경할 수있는 시점입니다. 일부 프로젝트에서는 10 %, 다른 프로젝트에서는 95 % 일 수 있습니다.

거의 100 % 나되지 않습니다. 그러나 때로는 100 % 코드 적용 범위를 얻으려고 시도하는 것이 코드 기반에서 부스러기를 제거하는 좋은 방법 일 수 있습니다. 더 많은 테스트를 작성하거나 코드를 작성하는 두 가지 방법으로 코드 적용 범위를 늘릴 수 있습니다. 테스트하기 어렵 기 때문에 코드를 다루지 않으면 쉽게 테스트 할 수 있도록 단순화하거나 리팩토링 할 수 있습니다. 테스트를 귀찮게하는 것이 너무 모호한 경우 일반적으로 코드에서 다른 코드를 사용하지 않을 가능성이 높습니다.


23
"두려움이 권태가 될 때까지 테스트"
Brad Mace

2
코드 제거에 대한 의견을지지합니다. VS 코드에서는 항상 적용되지 않는 행을 강조 표시하는 코드 범위 메트릭을 사용합니다.
노아 리차드

큰 따옴표 @bemace
jayraynet

14

코드 범위는 100 % 무증상으로 접근합니다. 결과적으로 노력에 대한 소액의 수익을 달성하기 시작하면서 마지막 5 %는 아마도 가치보다 더 많은 노력 일 것입니다.


7

적용 범위는 계속 지켜 볼 수 있는 지표이지만 궁극적 인 목표가되어서는 안됩니다. 나는 높은 커버리지 코드-100 % 커버리지 (물론 TDD)를 많이 보았습니다.

  • 버그는 여전히 나옵니다
  • 디자인은 여전히 ​​가난 할 수 있습니다
  • 당신은 정말로 임의의 커버리지 대상을 위해 총을 쏴 죽일 수 있습니다-전투를 선택하십시오 : p

여기에 언급하기에 적절하다고 생각되는 "Testivus의 길" 항목 이 있습니다.


5

대부분의 코드 중 20 %시간의 80 %를 실행합니다 . 코드 커버리지 분석은 콜 그래프 와 쌍을 이루어 가장 테스트해야 할 사항을 결정 하지 않는 한 유용하지 않습니다 . 그것은 당신의 엣지 케이스가 어디에 있는지를 알려줍니다. 실제 코드의 5 % 미만을 구성하는 엣지 케이스에 대해서만 100 개의 테스트가 제공 될 수 있습니다.

따라서 중요한 경로를 정의하는 20 %의 100 %, 나머지 그래프의 50 % 이상을 호출 그래프에 따라 포함해야합니다. 총 보장 범위는 대략 70 %-75 %입니다.

점검없이 중요한 엣지 케이스를 남기면서 전체 적용 범위를 70 % 이상 달성하는 데 시간을 소모하지 마십시오.


Code Coverage 도구가 정의에 따라 호출 그래프를 생성하지 않습니까?
JBR 윌킨슨

4

테스트되지 않은 영역을 나타내는 가이드로 적용 범위를 사용하십시오. 적용 범위에 대한 의무를 갖지 않고 코드가 포함되지 않은 이유를 이해하는 것이 현명합니다. 부족한 이유를 기록하는 것은 위험의 균형을 잡을 수있는 좋은 훈련입니다.

때때로 그 이유는 바람직한 '시간 부족'보다 적지 만 초기 릴리스에서는 괜찮을 수도 있습니다. 커버리지를 향상시키기 위해 다시 영역을 표시하는 것이 좋습니다.

100 % 명세서 적용 범위가 중요하지 않은 시스템에 적합한 것으로 간주되는 중요 비행 소프트웨어를 작업하고 있습니다. 보다 중요한 시스템의 경우 분기 / 의사 범위를 확인하고 때로는 엄격하지 않은 기술 호출 MC / DC를 사용합니다.

또한 객체 코드도 다루 었는지 확인해야합니다.

그것은 우리의 경우 가치 / 비용에 대한 위험 사이의 균형입니다. 버그가 빠질 위험에 따라 정보에 입각 한 선택이 필요합니다.


3

더 많은 코드 범위를 허용하기 위해 런타임 성능, 보안, 유연성 또는 유지 관리성에 영향을 미치는 변경 사항을 고려하기 시작하면 더 많은 코드 범위에 대한 탐구를 끝내야합니다.

디자인과 92 %의 높은 프로젝트에 영향을주지 않으면 서 적용 범위를 계산할 수 없기 때문에 그 점이 0 % 인 프로젝트가 있습니다.

코드 범위 메트릭은 일부 테스트를 놓친 것일 수 있음을 지적하는 데 유용합니다. 시험 품질에 대해서는 아무 것도 말하지 않습니다.


2

공간이 중요한 소프트웨어는 100 % 진술 범위가 필요합니다.

처음에는 말이되지 않습니다. 전체 테스트 적용 범위가 코드가 완전히 테스트되었다는 것을 의미하지는 않으며 실제로 애플리케이션을 테스트하지 않고 100 % 적용 범위를 얻는 것이 어렵지 않다는 것을 모두 알고 있습니다.

그럼에도 불구하고 100 % 적용 범위는 하한입니다. 100 % 적용 범위는 버그가없는 소프트웨어의 증거는 아니지만, 더 작은 적용 범위를 사용하면 코드가 완전히 테스트되지 않았으며 공간이 중요한 소프트웨어에는 적용 할 수없는 것입니다.


2

@RevBingo의 대답은 100 %에 대한 투쟁으로 인해 사용하지 않는 코드를 정리하거나 삭제할 수 있다고 제안하기 때문에 정말 좋아합니다. 다른 답변에서 보지 못한 것은 높은 커버리지가 필요한 시점과 그렇지 않은 시점에 대한 감각입니다. 나는 이것을 시작할 때 찔렀다. 이와 같은 차트에 세부 정보를 추가하는 것이 모든 코드에 맞는 하나의 테스트 적용 범위 번호를 찾는 것보다 더 유용한 추구라고 생각합니다.

100 %

java.util Collections와 같은 공용 API의 경우 데이터베이스에 연결되지 않고 HTML을 반환하지 않습니다. 시간 또는 기타 이유로 90-95 %에 정착하더라도 100 % 적용 범위가 고귀한 시작 목표라고 생각합니다. 제약. 기능이 완성 된 후에 테스트 범위를 늘리면 다른 종류의 코드 검토보다 더 자세한 검사 수준이 적용됩니다. API가 널리 사용된다면 사람들은 예상치 못한 방식으로 API를 사용하고 서브 클래스 화하고 역 직렬화하는 등의 작업을 수행합니다. 그들의 첫 경험이 버그를 찾거나 감독하는 것을 원하지 않습니다!

90 %

데이터 구조를 가져오고 데이터 구조를 반환하는 비즈니스 인프라 코드의 경우 100 %가 여전히 좋은 시작 목표이지만이 코드가 많은 오용을 유발할 정도로 공개되지 않은 경우 85 %가 여전히 허용됩니까?

75 %

문자열을 가져오고 반환하는 코드의 경우 단위 테스트가 훨씬 취하기 쉽지만 많은 상황에서 여전히 유용 할 수 있다고 생각합니다.

50 % 이하

너무 취하기 때문에 HTML을 반환하는 함수에 대한 테스트를 작성하는 것이 싫습니다. 누군가가 CSS, JavaScript 또는 HTML 및 영어의 전체 블로 브를 변경하면 인간 최종 사용자에게 의미가없는 것은 무엇입니까? 많은 비즈니스 로직을 사용하여 약간의 HTML을 생성하는 기능을 찾을 수 있다면 테스트 할 가치가 있습니다. 그러나 반대 상황은 전혀 테스트 할 가치가 없습니다.

거의 0 %

일부 코드의 경우 "정확한"의 정의는 "최종 사용자에게 의미가 있습니다." 자동화 된 문법 검사 또는 출력의 HTML 유효성 검사와 같이이 코드에 대해 비 전통적인 테스트를 수행 할 수 있습니다. 나는 시스템의 나머지 부분에서 "로그인"이라고 할 때 "로그인"이라고 말하는 것과 같이, 우리가 일반적으로 직장에서 자주 접하는 불일치에 대해 grep 문을 설정했습니다. 이 사람은 단위 테스트가 아니라 특정 결과를 기대하지 않고 문제를 잡는 데 도움이되는 방법입니다.

그러나 궁극적으로 오직 인간 만이 인간에게 합리적인 것을 판단 할 수 있습니다. 단위 테스트는 당신을 도울 수 없습니다. 때로는 여러 사람이 그것을 정확하게 판단하는 데 필요합니다.

절대 0 %

이것은 슬픈 카테고리이며 글을 쓰는 사람이 적습니다. 그러나 충분히 큰 프로젝트에는 사업상의 이점을 제공하지 않고도 일주일의 시간을 낭비 할 수있는 토끼 구멍이 있습니다.

Hibernate 테스트를 위해 자동으로 데이터를 모의하는 방법을 보여주기 때문에 책을 구입했습니다. 그러나 Hibernate HQL 및 SQL 쿼리 만 테스트했습니다. 많은 HQL 및 SQL을 수행해야하는 경우 실제로 최대 절전 모드를 이용할 수 없습니다. Hibernate 인 메모리 데이터베이스의 형태가 있지만 테스트에서 효과적으로 사용하는 방법을 알아내는 데 시간을 투자하지 않았습니다. 실행 중이라면 Hibernate가 일부 쿼리를 실행하게하는 객체 그래프를 탐색하여 물건을 계산하는 비즈니스 로직에 대해 높은 (50 % -100 %) 테스트 범위를 원합니다. 이 코드를 테스트하는 능력은 현재 0 %에 가깝고 문제가 있습니다. 따라서 프로젝트의 다른 영역에서 테스트 범위를 향상시키고 데이터베이스에 액세스하는 기능보다 순수한 기능을 선호합니다. 주로 이러한 기능에 대한 테스트를 작성하기가 쉽기 때문입니다. 아직도,


1

테스트하는 응용 프로그램의 일부에 달려 있다고 생각합니다. 예를 들어 비즈니스 로직이나 복잡한 데이터 변환과 관련된 구성 요소의 경우 90 % (가능한 한 높은) 범위를 목표로합니다. 가능한 한 많은 코드를 테스트하여 작지만 위험한 버그를 발견했습니다. 테스트하는 동안 1 년 후에 고객 사이트에서 버그를 발견하는 것보다는 오히려 버그를 발견하고 싶습니다. 또한 높은 코드 적용 범위의 이점은 테스트를 적절히 조정해야하므로 사람들이 작업 코드를 너무 쉽게 변경하지 못하도록한다는 것입니다.

반면에 코드 범위가 덜 적합한 구성 요소가 있다고 생각합니다. 예를 들어, GUI를 테스트 할 때 버튼을 클릭 할 때 실행되는 모든 코드를 포함하는 테스트를 작성하려면 이벤트를 올바른 구성 요소에 전달하는 데 많은 시간이 소요됩니다. 이 경우 버튼을 클릭하고 프로그램의 동작을 관찰하는 수동 테스트를 수행하는 전통적인 방법을 사용하는 것이 훨씬 더 효과적이라고 생각합니다 (오른쪽 대화 상자 창이 열리나요?) 올바른 도구가 선택됩니까? ?).


0

테스트 스위트에 충분한 커버리지가 있는지 알기위한 척도로 코드 커버리지를 사용하는 것에 대한 높은 의견이 없습니다.

주된 이유는 먼저 코드를 작성한 다음 테스트를 한 다음 코드 적용 범위를 살펴보고 테스트를 놓친 부분을 발견 한 경우 개선이 필요한 프로세스이기 때문입니다. 당신이 진정한 TDD를한다면, 당신은 100 % 코드 커버리지를 가지고 있습니다 (물론, 테스트하지 않은 사소한 것이 있습니다). 그러나 테스트 대상을 찾기 위해 코드 범위를 살펴보면 잘못된 테스트를 작성할 수 있습니다.

따라서 코드 범위에서 결론을 내릴 수있는 유일한 것은 코드가 너무 낮 으면 테스트가 충분하지 않다는 것입니다. 그러나이 값이 높으면 올바른 테스트를 모두 받았다는 보장이 없습니다.

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