무거운 jquery / backbonejs 웹 응용 프로그램에서 100 % 코드 적용 범위를 기대할 수 있습니까? 실제 코드 적용 범위가 javascript / jquery에서 92 % -95 % 주위를 가리킬 때 100 % 적용 범위가 충족되지 않아 스프린트에 실패하는 것이 합리적입니까?
무거운 jquery / backbonejs 웹 응용 프로그램에서 100 % 코드 적용 범위를 기대할 수 있습니까? 실제 코드 적용 범위가 javascript / jquery에서 92 % -95 % 주위를 가리킬 때 100 % 적용 범위가 충족되지 않아 스프린트에 실패하는 것이 합리적입니까?
답변:
비현실적이므로 똑같이 현실적입니다.
현실적인
전체 코드 기반을 포괄하는 것으로 입증 된 자동화 된 테스트를 수행 한 경우 100 % 적용 범위를 주장하는 것이 합리적입니다.
또한 프로젝트가 얼마나 중요한지에 달려 있습니다. 더 중요할수록 완전한 코드 범위를 기대 / 요구하는 것이 더 합리적입니다.
중소 규모 프로젝트의 경우이 작업을 수행하는 것이 더 쉽습니다.
비현실적
0 % 적용 범위에서 시작하는 중 ...
프로젝트가 재 작성 또는 트리거하기 어려운 많은 오류 경로가있는 괴물입니다.
경영진은 보험 적용 범위를 확실히하기 위해 노력하고 투자하지 않습니다.
나는 커버리지가없는 것에서 알맞은 것까지 다양한 프로젝트를 진행했습니다. 100 %의 프로젝트는 없었지만 100 %에 가까운 범위를 가졌 으면 좋겠다.
궁극적으로 문제는 기존 적용 범위가 팀이 제품 배송에 익숙해지기 위해 필요한 경우를 충분히 충족시키는 지 여부입니다.
우리는 프로젝트에 대한 실패의 영향을 알지 못하므로 92 % 또는 95 %가 충분한 지 또는 100 %가 실제로 필요한지 말할 수 없습니다. 또는 그 문제에 대해 100 %는 기대하는 모든 것을 완벽하게 테스트합니다.
그것은 아주이다 순진 최상의 및 비현실적인 심지어 이론적 이해와 실용적 비즈니스 의미한다.
테스트를 작성하는 것은 매우 비싸고, 작성하고 자체 테스트해야하는 코드이며, 실제로 테스트하려는 내용에 문서화해야하는 코드이며, 비즈니스 로직 변경으로 유지 관리해야하는 코드입니다. 테스트가 오래되어 실패합니다. 자동화 된 테스트와 이에 대한 문서를 유지 관리하는 것은 때때로 코드를 유지 관리하는 것보다 비용이 많이들 수 있습니다.
이것은 단위 테스트와 통합 테스트가 유용하지 않다는 것을 의미하는 것은 아니며, 그들이 이해하는 곳에서만, 그리고 사람들을 죽일 수있는 산업 밖에서는 코드 기반의 모든 코드 줄을 테스트하고 테스트하는 것이 이치에 맞지 않습니다. 많은 사람들이 이러한 코드를 신속하게 코드 기반으로 사용하지 않으면 100 % 코드 적용 범위에 따른 긍정적 인 투자 수익률을 계산할 수 없습니다.
계산 이론에서 정지 문제 는 임의의 컴퓨터 프로그램 및 입력에 대한 설명으로부터 프로그램의 실행이 끝날지 또는 계속 실행되는지를 결정하는 문제입니다.
Alan Turing은 1936 년에 가능한 모든 프로그램 입력 쌍에 대한 정지 문제를 해결하기위한 일반적인 알고리즘이 존재할 수 없음을 증명했습니다. 증거의 핵심 부분은 컴퓨터와 프로그램의 수학적 정의 였는데, 이는 튜링 기계로 알려졌습니다. 정지 문제는 Turing 장비에 비해 결정 불가능합니다. 결정 문제의 첫 번째 예 중 하나입니다.
무언가가 100 % 효과가 있다는 것을 증명할 수 없기 때문에 왜 목표를 달성해야합니까?
getXXX()/setXXX()
값 객체에 대한 간단한 sor 간단한 할당 생성자 를 다루기 위해 테스트 사례를 작성 하는 것은 시간과 자원을 잘 사용한다고 생각합니다. 미안하지만 실제로는 그렇지 않으며 실제 경험이 부족한 매우 순진한 견해로 백업하지 않습니다. 테스트 코드는 여전히 유지 관리해야하는 코드입니다. 문제를 해결하기 위해 작성하는 코드가 적을수록 모든 경우에 더 좋습니다 .
대부분의 경우 100 % 코드 범위는 약간 "속임수"를 의미합니다.
기본적으로 테스트하기 어려운 부품은 반드시 "코드"로 간주되지 않는 영역으로 분류되었습니다. 항상 현실적이지는 않지만 테스트를 돕는 것과 무관하게 이러한 모든 방법을 통해 코드베이스를보다 쉽게 작업 할 수 있습니다.
100 % 지점 적용 범위 의 인상적인 실제 예는 SQLite 테스트 방법을 참조하십시오 .
귀하의 질문에 완전히 다른 유형의 소프트웨어 제품 인 Javascript에 대해 구체적으로 묻는다는 것을 알고 있지만 충분한 동기 부여로 수행 할 수있는 작업에 대해 알고 싶습니다.
특정 응용 프로그램의 모든 부분에 대한 단위 테스트에 대한 100 % 코드 적용 범위는 새로운 프로젝트에서도 파이프 꿈입니다. 나는 그것이 사실이기를 원하지만 때로는 외부 의존성을 추상화하려고 얼마나 열심히 노력하더라도 코드 조각을 덮을 수없는 경우가 있습니다. 예를 들어, 코드가 웹 서비스를 호출해야한다고 가정 해 봅시다. 웹 서비스 호출을 인터페이스 뒤에 숨겨서 해당 부분을 모의하고 웹 서비스 전후에 비즈니스 로직을 테스트 할 수 있습니다. 그러나 웹 서비스를 호출해야하는 실제 부분은 단위 테스트가 불가능합니다. 다른 예는 TCP 서버에 연결해야하는 경우입니다. 인터페이스 뒤의 TCP 서버에 연결되는 코드를 숨길 수 있습니다. 그러나 실제로 TCP 서버에 연결되는 코드는 단위 테스트를 할 수 없습니다. 어떤 이유로 든 작동이 중단되면 단위 테스트가 실패 할 수 있습니다. 그리고 단위 테스트는 호출 할 때 항상 통과해야합니다.
일반적으로 모든 비즈니스 로직에는 100 % 코드 적용 범위가 있어야합니다. 그러나 외부 구성 요소를 호출해야하는 부분은 가능한 한 100 % 코드 범위에 가까워 야합니다. 당신이 도달 할 수 없다면 나는 너무 많이 땀을 흘리지 않을 것입니다.
훨씬 더 중요한 것은 테스트가 맞습니까? 비즈니스와 요구 사항을 정확하게 반영합니까? 코드 적용 범위를 갖기 위해 코드 적용 범위를 갖는다 고해서 잘못 테스트하거나 잘못된 코드를 테스트하는 경우에는 아무 의미가 없습니다. 즉, 테스트가 양호하면 적용 범위가 92-95 %라는 점이 뛰어납니다.
코드가 100 % 테스트 범위를 허용한다는 특정 목표로 설계되지 않으면 100 %를 달성하지 못할 수 있습니다. 그 이유 중 하나는 방어 적으로 코드를 작성하는 경우 (필요한 경우) 시스템에 대한 지식이 있으면 발생하지 않아야하거나 발생하지 않을 수있는 상황을 처리하는 코드를 보유해야하기 때문입니다. 테스트로 그러한 코드를 다루는 것은 정의상 매우 어려울 것입니다. 이러한 코드를 사용하지 않으려면 위험 할 수 있습니다. 틀린 경우이 상황 이 256 회 중 1 회 발생하는 경우? 불가능한 장소에 변화가있어 불가능한 일이 생기면 어떻게해야합니까? 따라서 "자연적인"수단으로는 100 %에 도달하기가 다소 어려울 수 있습니다. 예를 들어, 메모리를 할당하는 코드가 있고 메모리 관리자를 조롱하지 않는 한 메모리가 실패했는지 확인하는 코드가있는 경우 (쉽지 않을 수 있음) "메모리 부족"을 반환하는 테스트를 작성하면 해당 코드를 다루기가 어려울 수 있습니다. JS 응용 프로그램의 경우 다른 브라우저에서 가능한 DOM 문제, 외부 서비스 실패 등을 방어하는 코딩이 될 수 있습니다.
따라서 가능한 한 100 %에 가까워 지려고 노력하고 델타에 대한 합당한 이유가 있다고 말하지만, 반드시 100 %가 반드시 실패하는 것은 아닙니다. 5 %가 무엇인지에 따라 큰 프로젝트에서 95 %가 괜찮을 수 있습니다.
새 프로젝트로 시작하고 테스트 우선 방법론을 엄격하게 사용하는 경우 테스트가 완료된 시점에서 모든 코드가 호출 될 것이라는 점에서 100 % 코드 적용 범위를 갖는 것이 전적으로 합리적입니다. 처형되었다. 그러나 메소드 가시성으로 인해 모든 개별 메소드 또는 알고리즘을 명시 적으로 직접 테스트하지 않았을 수 있으며 경우에 따라 일부 메소드를 간접적으로 테스트하지 않았을 수도 있습니다.
코드를 100 % 테스트하는 것은 잠재적으로 비용이 많이 드는 연습입니다. 특히이 목표를 달성 할 수 있도록 시스템을 설계하지 않은 경우 테스트 노력에 대한 설계 노력에 집중하고 있다면주의를 기울이지 않을 것입니다. 특히 프로젝트가 큰 경우 특정 요구 사항을 충족하도록 응용 프로그램을 설계합니다. 미안하지만 무언가 타협하지 않으면 두 가지 방법을 모두 사용할 수는 없습니다.
테스트가 유지되지 않았거나 이전에 포함되지 않은 기존 프로젝트에 테스트를 도입하는 경우, 운동 비용이 노력보다 중요하지 않으면 100 % 코드 적용 범위를 확보 할 수 없습니다. 가장 바람직한 것은 가장 중요한 코드 섹션에 대한 테스트 범위를 제공하는 것입니다.
실제 코드 적용 범위가 javascript / jquery에서 92 % -95 % 주위를 가리킬 때 100 % 적용 범위가 충족되지 않아 스프린트에 실패하는 것이 합리적입니까?
대부분의 경우 목표를 달성하지 못한 경우 스프린트가 '실패'한 것으로 간주해야한다고 말합니다. 실제로 다음에 스프린트를 정의 할 때 계획을 바로 잡기 위해 기대치를 충족하지 않는 스프린트에서 배울 수 있어야하기 때문에 이러한 경우 스프린트를 실패한 것으로 생각하지 않습니다. 그럼에도 불구하고, 코드 커버리지가 스프린트의 상대적 성공의 요인으로 간주되는 것이 합리적이라고 생각하지 않습니다. 목표는 모든 것이 지정된대로 작동하도록 충분히하는 것이어야하며, 테스트 우선 코딩하는 경우 테스트가이 목표를 지원할 것이라고 확신 할 수 있어야합니다. 추가해야 할 추가 테스트는 사실상 설탕 코팅이며 스프린트를 만족스럽게 완료하는 데 드는 추가 비용입니다.
물론이 작업을 수행하지는 않지만 두 개의 큰 프로젝트 에서이 작업을 수행했습니다. 어쨌든 단위 테스트를위한 프레임 워크가 있다면 정확하게 어렵지는 않지만 많은 테스트를 추가합니다.
마지막 몇 줄을 치는 것을 방해하는 특정 장애물이 있습니까? 그렇지 않은 경우, 적용 범위가 95 %에서 100 %에 이르는 것이 간단하다면 그렇게 할 수도 있습니다. 여기에 요구하고 있기 때문에, 나는 거기에 있다고 가정거야 입니다 무엇인가. 그게 뭐야?
92 %가 괜찮습니다. 실제 질문은 다음과 같습니다.
92 %가 현재 '새로운'표준입니까? 다음 스프린트에 88 %의 테스트가 있다면 괜찮을까요? 이것은 종종 테스트 스위트가 포기되는 시작입니다.
소프트웨어가 작동하고 버그가없는 것이 얼마나 중요합니까? "테스트 목적으로"가 아니라 이러한 이유로 테스트가 있습니다.
돌아가서 누락 된 테스트를 작성할 계획이 있습니까?
왜 테스트하고 있습니까? 초점이 기능이 아닌 라인의 % 인 것 같습니다
Martin Fowler는 자신의 블로그 에서 다음과 같이 썼습니다 .I would be suspicious of anything like 100% - it would smell of someone writing tests to make the coverage numbers happy, but not thinking about what they are doing.
그러나 단위 수준에서 100 % 적용 범위를 의무화하는 표준도 있습니다. 예를 들어, 유럽 우주 비행 커뮤니티 표준 (ECSS, 유럽 공간 표준화 협력)의 요구 사항 중 하나입니다. 여기 에 링크 된 논문 은 이미 완성 된 소프트웨어에서 100 % 테스트 범위에 도달한다는 목표를 가진 흥미로운 프로젝트 이야기를 알려줍니다. 단위 테스트를 개발 한 관련 엔지니어와의 견해를 바탕으로합니다.
수업 중 일부는 다음과 같습니다.
아마도 실현 가능하고 합리적인지 묻는 것이 가장 도움이되는 질문이 아닙니다. 아마도 가장 실용적인 대답은 받아 들여질 것입니다. 나는 이것을보다 철학적 인 수준에서 분석 할 것이다.
100 % 적용 범위는 이상적이지만 이상적으로는 필요하지 않거나 달성하기가 훨씬 쉽습니다. 나는 그것이 실현 가능하거나 합리적인 것보다 자연스럽고 인간적인지 생각하는 것을 선호합니다.
오늘날의 도구로는 올바르게 프로그래밍하는 것이 불가능합니다. 완전히 정확한 코드를 작성하는 것은 매우 어렵고 버그가 없습니다. 자연스럽지 않습니다. 따라서 다른 명백한 옵션이 없으면 TDD 및 추적 코드 적용과 같은 기술을 사용합니다. 그러나 최종 결과가 여전히 부 자연스러운 과정이라면 사람들이 일관되고 행복하게 처리하도록하는 데 어려움을 겪을 것입니다.
100 % 코드 적용을 달성하는 것은 부 자연스러운 행위입니다. 대부분의 사람들에게 그것을 달성하도록 강요하는 것은 고문의 한 형태 일 것입니다.
자연스러운 정신 모델에 매핑되는 프로세스, 도구, 언어 및 코드가 필요합니다. 이를 수행하지 않으면 제품의 품질을 테스트 할 방법이 없습니다.
오늘 모든 소프트웨어를 살펴보십시오. 그것의 대부분은 꽤 정기적으로 엉망입니다. 우리는 이것을 믿고 싶지 않습니다. 우리는 우리의 기술이 마 법적이며 우리를 행복하게 만들고 싶습니다. 그래서 우리는 기술이 엉망이되는 대부분의 시간을 무시하고 변명하고 잊어 버리기로 선택합니다. 그러나 우리가 정직하게 평가한다면, 오늘날 존재하는 대부분의 소프트웨어는 엉터리입니다.
보다 자연스러운 코딩을위한 몇 가지 노력은 다음과 같습니다.
https://github.com/jcoplien/trygve
https://github.com/still-dreaming-1/PurposefulPhp
후자는 극도로 불완전하고 실험적입니다. 실제로 그것은 내가 시작한 프로젝트이지만, 내가 그것을 완성시키기 위해 시간을 할애 할 수 있다면 프로그래밍 기술을위한 큰 진보가 될 것이라고 믿습니다. 기본적으로 계약이 우리가 관심있는 클래스 행동의 유일한 측면을 표현하고 계약을 코드로 표현하고 있다면 클래스와 메소드 정의가 계약과 함께 제공되지 않는 이유는 무엇입니까? 그렇게하면 계약이 코드가되고 모든 방법을 구현할 필요는 없습니다. 도서관이 우리를 위해 계약을 존중하는 방법을 알아 보도록하십시오.
새로운 코드에서 100 %에 도달하는 것은 매우 달성 가능해야하며 TDD를 연습하는 경우 모든 프로덕션 코드 라인에 대해 의도적으로 테스트를 작성함에 따라 기본적으로 그 목표를 달성 할 수 있습니다.
단위 테스트없이 작성된 기존 레거시 코드에서는 레거시 코드가 단위 테스트를 염두에두고 작성되지 않았으며 많은 리팩토링이 필요할 수 있기 때문에 어려울 수 있습니다. 위험 및 일정의 현실을 고려할 때 이러한 리팩토링 수준은 종종 실용적이지 않으므로 트레이드 오프를 수행해야합니다.
우리 팀에서는 100 % 코드 적용 범위를 지정하고 코드 검토에서 이보다 적은 수를 보이면 구성 요소의 기술 소유자가 개발자에게 100 %에 도달하지 못한 이유를 논의하고 개발자의 추론에 동의해야합니다. 100 %에 도달하는 데 문제가있는 경우 개발자는 코드 검토 전에 기술 담당자에게 문의합니다. 우리는 일단 습관에 들어간 후 레거시 코드에 테스트를 추가하여 몇 가지 일반적인 문제를 해결하는 기술을 배우면 처음에 생각했던 것처럼 정기적으로 100 %를 달성하는 것이 어렵지 않다는 것을 알았습니다.
Michael Feather의 저서 " 레거시 코드로 효과적으로 작업하기 "는 레거시 코드 에 테스트를 추가하기위한 전략을 마련한 데있어 매우 중요합니다.
불가능합니다. 절대 불가능합니다. 가능하다면 모든 수학은 초현실주의에 빠질 것입니다. 예를 들어, 두 개의 64 비트 정수를 가져와 곱한 함수를 어떻게 테스트 하시겠습니까? 이것은 항상 테스트와 프로그램의 정확성을 증명하는 데있어 내 문제였습니다. 가장 사소한 프로그램 이외의 경우, 테스트는 소수의 경우에만 적용되므로 기본적으로 쓸모가 없습니다. 그것은 1,000 개의 숫자를 확인하고 당신이 Goldbach 추측을 증명했다고 말하는 것과 같습니다.