디버깅과 테스트의 차이점은 무엇입니까?


11

소프트웨어 테스팅 소개 (Ammann & Offutt)는 p.32에서 5 단계 테스팅 성숙도 모델을 언급합니다.

레벨 0 테스트와 디버깅에는 차이가 없습니다.

레벨 1 테스트의 목적은 소프트웨어가 작동 함을 보여주는 것입니다.

레벨 2 테스트의 목적은 소프트웨어가 작동하지 않음을 보여주는 것입니다.

레벨 3 테스트의 목적은 특정 사항을 입증하는 것이 아니라 소프트웨어 사용의 위험을 줄이는 것입니다.

레벨 4 테스트는 모든 IT 전문가가 고품질 소프트웨어를 개발할 수 있도록 도와주는 정신 훈련입니다.

더 자세히 설명하지는 않지만. 디버깅과 테스트의 차이점은 무엇입니까?


1
wikipedia의 디버깅 페이지 중 어떤 부분이 혼란 스러웠습니까? en.wikipedia.org/wiki/Debugging 혼란스러운 특정 문구 나 인용문을 게시하십시오.
S.Lott

4
프로그래머가 테스트에 소비하는 평균 시간 : 10 분 프로그래머가 테스트해야 할 무언가를 디버깅하는 데 소요되는 평균 시간 : 2.5 시간.
Craige

1
모든 상점의 80 %가 테스트를 전혀 수행하지 않는 경우 테스트를 공식화해야합니까?
Job

@Craige : 테스트에는 일반적으로 10 분 이상이 걸립니다. 디버깅에 소요 된 총 시간보다 오래 걸릴 수도 있습니다. 그러나 테스트에 소요되는 시간은 사전 예방 적이며 (몇 퍼센트의 테스트 만 결함을 발견하더라도 포괄적 인 적용 범위를 달성하지만) 디버깅에 소요되는 시간은 반응하지 않습니다 (결함이 가장 불편한 시간에 프로그래머에게 점프 함). 버그를 제거하고 수정의 일환으로 추가 버그를 도입해야한다는 압력을 받고 있습니다.)
rwong

답변:


21

테스트는 프로그램이해야 할 일을하는 적절한 수준 (100 % 일 수 없음)으로 증명하기 위해 코드의 결함이나 다른 각도에서 결함을 찾기위한 것입니다. 수동 또는 자동화 될 수 있으며 단위, 통합, 시스템 / 수락, 스트레스, 하중, 담금질 등과 같은 다양한 종류가 있습니다.

디버깅은 프로그램에서 특정 버그를 찾아서 제거하는 프로세스입니다. 모든 버그가 다르기 때문에 항상 수동, 일회성 프로세스입니다.

필자는 저자가 레벨 0에서 테스트 계획이나 테스터가 테스트중인 기능을 실제로 철저히 테스트하고 테스트를 수행 할 수있는 방법이없는 임의의 방식으로 수동 테스트 만 수행한다는 것을 의미합니다. 확실하게 반복.


이 맥락에서 버그는 프로그램이 의도 한 것과 실제로하는 것의 차이입니다.

1
"테스트"는 단위 테스트에 대한 나의 이해입니다. 디버깅은, 특히 자신의 코드 인 경우 시행 착오 일뿐입니다.
ott--

4

디버깅은 수동적이고 단계별 프로세스이며, 비정형적이고 신뢰할 수 없습니다. 디버깅을 통한 테스트를 통해 반복 불가능한 회귀 테스트에 사용할 수없는 시나리오를 만들 수 있습니다. 이 정확한 이유 때문에 0 이외의 모든 레벨 (예에서)은 내 견해에서 디버깅을 제외합니다.


사프 스퀴즈 ( Saff Squeeze )는 매우 구조적이고, 신뢰성 이 높으며 , 특별히 관련되지 않고 적어도 부분적으로 자동화 될 수있는 디버깅 기술이다. 실제로 테스트와 디버깅간에 차이가 없음 을 인식하여이를 달성합니다 .
Jörg W Mittag

디버깅이 "구조화되지 않고 신뢰할 수 없으며 수동"인 경우 제대로 수행하지 않은 것입니다! 또는 분명히 우리는이 두 단어를 사용하여 다른 것을 의미합니다.
MemeDeveloper

3

디버깅은 체계적으로 코드를 통해 알려 지거나 알려지지 않은 문제를 해결하려는 시도입니다. 디버깅 할 때 일반적으로 코드 전체에 초점을 맞추지 않고 실제 코드에서 거의 항상 백엔드에서 작업합니다.

테스트는 디버깅 할 수있는 코드를 사용하는 다양한 방법을 통해 문제를 생성하려는 시도입니다. 그것은 거의 항상 사용자 공간에서 이루어지며, 최종 사용자가 코드를 실행하고 실행하려고 할 때 코드를 실행합니다.


1
동의합니다. 사람들이 자동화 된 테스트 및 TDD에 집중하는 경향을 강조하기 위해 "최종 사용자가 코드를 실행할 때 코드를 실행"하는 것에 대한 귀하의 요점을 강조하고 싶습니다. 특히 웹 기반 앱의 경우 더 유용한 정보, 코드 테스트 코드 또는 웹 페이지를 테스트하는 사람들이 무엇입니까?
MemeDeveloper

2

간단히 말해서, "버그"는 프로그램이 실행될 때 정상적으로 동작하지 않을 때 발생했다고합니다. 즉, 예상 출력 또는 결과를 생성하지 않습니다. 이 버그의 원인을 찾고, 동작을 수정하는 방법을 찾고, 코드 또는 구성을 변경하여 문제를 해결하는 방법을 디버깅이라고합니다.

테스트는 다양한 조건에서 프로그램이나 코드가 올 바르고 강력하게 작동하는지 확인하는 곳입니다. 입력, 표준 올바른 입력, 의도적으로 잘못된 입력, 경계 값, 환경 변경 (OS, 구성 파일)을 제공하여 코드를 "테스트" . 기본적으로 테스트 프로세스에서 버그를 발견하고 결국 "디버그"하려고한다고 말할 수 있습니다. 희망이 도움이됩니다.


1

없습니다. 올바르게하면 :

적중률 낮음, 적중률 낮음 :

회귀 테스트 및 사프 스퀴즈

켄트 벡, 쓰리 리버스 인스티튜트

개요 : 결함을 효과적으로 격리하려면 시스템 수준 테스트로 시작하여 결함을 보여주는 가장 작은 테스트가 될 때까지 점진적으로 인라인하고 정리하십시오.


예를 들어 스몰 토크와 같은 일부 시스템에서는 디버거 내에서 쓰기 테스트 / 실행 테스트 / 쓰기 코드주기를 완전히 수행 할 수 있기 때문에 전혀 차이가 없습니다.
Frank Shearar

@ FrankShearar : 위의 논문이 오래된 스몰 토커에 의해 작성된 것은 우연이 아닙니다. (켄트 벡 (Kent Beck)에 의해 물론 또한이다)이 TDD주기는 기본적으로 스몰 토크 코드가 시간의 새벽부터 기록 된 방법에 대한 설명입니다 : 클릭, 작업 공간에 몇 가지 예제 코드를 작성 디버거 캐치에게 어떤 방법 예외를하게 만들 메소드 를 작성하고 코드를 작성하고 실행을 재개하십시오 (다시 시작 가능한 예외의 경우 예)!
Jörg W Mittag

1

테스트는 고객에게 공개하기 전에 누리는 특권입니다.

버그는 고객에게 공개 한 후에 견딜 수있는 악몽입니다.


ㅋ. 가장 현실적인 / 실제적인 반응 ... 만약 내가 x 100까지 투표 할 수 있다면.
MemeDeveloper

1

다른 사람들은 테스트와 디버깅의 차이점 이 무엇인지 언급했습니다 .

나는 공통점 을 강조하고 싶습니다 . 테스터가 결함을 발견하면 격리해야합니다. 디버깅은 문제를 격리하고 런타임시 응용 프로그램 상태와 해당 코드를 분석하여 근본 원인을 찾는 기술 중 하나입니다 . 실제로 디버깅은 Oxford Dictionaries 에서 " 컴퓨터 하드웨어 또는 소프트웨어에서 오류를 식별 하고 제거 하는 프로세스"로 정의됩니다 .

테스터이든 개발자 든 결함을 누가 격리 (또는 특히 디버깅) 할 것인지는 부차적 인 질문입니다.


0

나열된 테스트 성숙도 모델은 개발 팀의 사고 방식에 대한 설명입니다.

명쾌하게 말하지 않고 목록에서 암시하는 것은 사고 방식의 변화가 테스트 수행 방식에 어떤 영향을 미치는지입니다.

개발 팀이 다음 단계로 발전함에 따라 테스트 범위가 넓어집니다.

레벨 0에서는 팀이 필요하지 않다고 생각하기 때문에 테스트가 수행되지 않습니다.

레벨 1에서는 기본 기능에 대한 공칭 범위를 제공하기위한 테스트가 수행됩니다.

레벨 2에서는 테스트가 레벨 1의 모든 것을 포함하도록 확장되고 파괴적인 테스트 (소스 코드 및 바이너리를 포함하여 개발자가 액세스 할 수있는 모든 정보에 액세스 할 수있는 전용 테스트 팀)를 추가하고 버그를 찾으려고합니다. 사용자 역할에서 트리거 됨)

레벨 3에는 레벨 1-2의 모든 기능 외에 비 기능 기반 테스트 / 비 수정 기반 테스트 (예 : 성능 특성)가 추가됩니다.

레벨 4에서는 고객 대면 IT 직원을 포함한 모든 사람이 소프트웨어 테스트의 목표를 잘 이해하고 있습니다. 따라서 IT 직원은 테스트 할 시나리오에 대한 피드백을 제공하여 레벨 4의 위험 범위를 개선 할 수 있습니다.

(면책 조항 : 교과서에 액세스 할 수 없으므로 용어가 잘못되었을 수 있습니다.)


0

버그는 눈에 보이는 오류입니다. 디버깅은 테스트 케이스 디자인 후에 시작된 프로세스입니다. 디버깅 프로세스에서는 오류의 원인을 찾아서 제거해야하므로 디버깅이 사용자를 실망시키기 때문에 테스트보다 어려운 작업입니다.


0

일상적이고 실용적인 용어로 말하면, 나는 그것이 전적으로 상황에 달려 있다고 생각합니다 .

의대 대규모 팀에서 (금융, 군사, 대규모, 높은 예산이나 비즈니스 크리티컬 시스템을 생각) 고 / 매우 높은 표준 작업 후 나는 명확하게 생각한다 "테스트의 결과"해야한다 "디버깅" , 그들은 분명히 있습니다 매우 다른 것들 . 이상적으로 테스트를 수행하면 스테이징 환경에서 디버깅이 이루어지고 프로덕션 환경에서는 0에 가까워 야합니다.

테스트는 광범위하고 규칙적이며 형식이 정교합니다. 디버깅은 특정 오류를 수정해야 할 때 가끔 발생하는 특정 프로세스입니다. 이는 명확하지 않으며 시스템의 기능과 결과 출력에 대한 심층적 인 조사가 필요합니다.

내 마음에는 테스트가 필수적이지만 디버깅은 실패에 대한 해결이 불투명 할 때만 필요한 특정 도구입니다.

나는 단순히 "버기 (burggy)"가 될 수없는 것보다 큰 팀 및 시스템을위한 TDD명백한 유용성을 완전히 이해하고 있다. 또한 복잡한 (종종 "백엔드") 시스템이나 출력과 비교하여 코드에 복잡한 비율이 높은 경우에는 분명히 의미가 있습니다. 그런 다음 "테스트"는 언제, 왜 실패가 발생했는지 알려주는 현실적인 기회를 제공합니다. 많은 복잡한 작업을 수행하고 명확하게 측정 가능한 출력을 생성하는 시스템은 일반적으로 쉽게 테스트 할 수 있으므로 테스트는 디버깅과 다릅니다. 이러한 경우, 테스트는 절차와 기대치 및 실제 결과의 일치를 확인하거나 확인하지 않는 공식화 된 방법을 강하게 암시합니다. 테스트는 항상 수행되며 때때로 디버깅의 필요성을 알려줍니다.

이것이 유비쿼터스 진실이라면 사랑 스러울 것입니다. 제 개발주기가 명확하게 정의 된 이진 출력 (빨간색, 녹색)으로 구분되어 있으면 좋을 것입니다 ...

필자의 경우 (중소 규모, 자금이 부족한 웹 기반, 데이터 중심의 기업 관리 시스템에서 98 % 독주로 일하는 것이 분명합니다) TDD가 어떻게 나를 도울 수 있는지 알 수 없습니다. 또는 오히려 "디버깅"과 "테스트"는 사실상 동일합니다.

주로 "테스트"라는 용어의 사용은 TDD의 방법론을 암시 / 밀접하게 관련시킵니다.

나는 이것이 완전히 완전하지 않은 지위 주의자 인 "믿지 않는자를 피하고, 피하고 피한다", 말도 안되는 것은 냉담한 일이라는 것을 알고있다. 그러나 실제적인 모자를 쓰고 내 맥락에 대해 생각하는 것은 막연하지도 않습니다. 내 상상 속에 TDD가 어떻게 고객에게 더 많은 돈을 제공 할 수 있는지 알아보십시오.

또는 "테스트"가 공식 코드 기반 프로세스라는 일반적인 가정에 동의하지 않습니다.

내 기본 이의 제기 ( 특정 * 컨텍스트 *에 적용 가능 )는 ...

내가 코드를 작성하지 못할 경우 그 안정적으로 작동 - 당시 얼마나 지옥 I가 안정적으로 작동하는 코드를 작성하기로하고 테스트 하위 표준 코드 아마도 말했다.

나에게 난 귀찮게에 충분히 나에게 힘이 (내 특정 상황에서) 어떤 예를도 인수하는 본 적이 없다 생각 에 대해 단일 테스트를 작성 , 내가 지금, 어쩌면 "사용자 저장소 (repository) 반환하지 않습니다 일부 우습게 실체가 테스트 코드를 작성할 수 있습니다 이름이 == X 인 엔터티를 정확히 요청할 때만? "라고 말하지만이 스트리밍을 작성하는 데에는 아마도 더 많은 유틸리티가있을 것입니다. 자만심이 강렬한 야생의 피가 끓어 오르는 무지하고 폐허가 된 쓰레기이지만, 나는 여기서 악마의 옹호자를해야 할 필요성을 느낍니다. (누군가가 나에게 빛을 보여주고 나를 개조하기를 바라고 있기 때문에, 아마도 내 고객에게 돈을 더 가치있게 줄 것입니까?).

논란의 여지없이 "디버깅"은 "테스트"와 동일합니다. 이것으로 나는 매일 일하는 삶에서 적어도 3 분의 1의 시간을 다른 브라우저에서 내 시스템의 로컬 버전으로 놀고, 작업을 중단하고 조사하기 위해 필사적으로 다양한 엉뚱한 것들을 시도한다는 것을 의미합니다. 실패한 이유 및 수정.

나는 100 %가 TDD 만트라 "레드 / 그린 / 리 팩터"의 명백한 효용에 동의하지만, 저 (저예산 예산, 솔로 개발자 RIA 랜드에서 일하는) 나는 누군가가 내가 어떻게 할 수 있는지 보여달라고 정말로 좋아할 것입니다. 아마도 , 논리적으로 그리고 절대적으로는 현실적으로 추가적인 가치를 얻을 이상 (쓰기에서 단지 잠재적 결함이 실제로 본질적으로 진짜 인간의 상호 작용에 바인딩 내 노력의 전체 (그리고 기본적으로 전용) 출력과 상호 작용에서보다 테스트 코드).

개발자가 "테스트"에 대해 이야기 할 때 일반적으로 TDD를 의미합니다.

테스트가있는 것처럼 코딩하려고합니다. 모든 테스트에 초점을 둔 개발이 장려 한 모든 패턴 / 관행과 트렌드는 환상적이고 아름답지만 내 작은 세상에서 "테스트"는 더 많은 코드를 작성하지 않습니다. 실제 세계를 테스트하는 것은 현실적으로 접근하는 방식으로 결과를 출력하며, 이는 사실상 디버깅과 동일합니다. 또는 여기서 능동적 인 변화는 인간의 출력 중심 비 자동 "테스트"의 직접적인 결과 인 "디버깅"입니다. 이것은 "테스트"가 자동화되고 형식적인 것으로, 일반적으로 받아 들여지고 인간적이고 임시적이거나 구조화되지 않은 것으로서 "디버깅"이라는 일반적 견해와는 대조적입니다.

목표가 실제로 돈 / 노력의 가치이고 웹 기반 대화 형 응용 프로그램을 만드는 경우 노력의 결과는 웹 페이지이며 본질적 으로 인간 입력에 반응하는 방식입니다. 따라서 "테스트"는 테스트를 통해 가장 잘 수행됩니다 실제 인간 상호 작용을 통한 웹 페이지 이 상호 작용으로 인해 예기치 않은 출력 또는 원하지 않는 출력이 발생하면 "디버깅"이 발생합니다. 디버깅은 또한 프로그램 상태의 실시간 검사 아이디어와 밀접한 관련이 있습니다. 테스트는 일반적으로 자동화와 관련이 있으며 종종 유감스러운 협회라고 생각합니다.

목표가 실제로 노력에 가치가 있고 자동화 된 테스트가 효율적이고 매우 유익한 경우 디버깅이 해당 테스트의 결과물이거나 자동화 된 테스트를 대체 할 수없는 이유는 세계에서 두 번째로 가장 많이 방문한 웹 사이트 인 이유는 무엇입니까 (Facebook) ) 너무 자주 눈에 띄지 않는 (사용자에게는 분명하지만 테스트 팀과 테스트 코드는 명확하지 않음) 버그로 가득 차 있습니까?

어쩌면 그들은 안심 녹색 조명에 집중하고 실제로 작업 결과를 사용하는 것을 잊어 버렸기 때문일까요?

너무 많은 개발자들은 테스트가 코드를 사용하는 것이라고 생각하고 디버깅은 아이콘이 빨간색으로 변하고 이유를 해결할 수 없기 때문에 IDE에서 가끔 수행하는 것입니다. 나는이 단어들이 그들과 관련된 유감스러운 가치 판단을 가지고 있다고 생각한다. 이것은 일반적으로 기대와 결과 사이의 격차를 좁히기 위해 우리가 집중해야하는 실제 현실을 모호하게한다.


-3

간단히,

테스트는 디버깅하는 동안 소프트웨어가 실패하게하는 입력을 찾는 것이 주어진 장애의 결함을 찾는 프로세스임을 의미합니다.


이것은 이전의 10 가지 답변에서 제시되고 설명 된 포인트를 넘어서는 실질적인 것을 제공하지 않는 것 같습니다
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.