프로덕션에서 버그가 발견되면 의도적으로 빌드를 중단해야합니까?


410

최종 사용자의 프로덕션에서 심각한 버그가 발견되면 해당 버그를 커버하기 위해 실패한 단위 테스트를 추가하여 버그가 수정 될 때까지 의도적으로 빌드를 중단하는 것이 합리적입니다. 이것에 대한 나의 근거는 빌드 가 완전히 실패 했어야 하지만 자동 테스트 범위가 충분하지 않기 때문이 아니라는 것이다.

내 동료 중 일부는 실패한 단위 테스트를 체크인하지 말아야한다는 의견에 동의하지 않았습니다. 일반적인 TDD 관행 측면에서이 견해에 동의하지만 생산 버그를 다르게 처리해야한다고 생각합니다. 알려진 결함으로 성공하기위한 빌드?

다른 사람이이 시나리오를 처리하기위한 전략을 입증 했습니까? 의도적으로 빌드를 중단하면 다른 팀 구성원에게는 지장을 줄 수 있지만 이는 전적으로 지점을 사용하는 방법에 달려 있습니다.


75
+1; 매우 도발적인 질문. 나는 양쪽을 볼 수 있습니다.
Carl Manaster

28
"빌드"라는 용어를 사용하여 "테스트"를 포함합니다. 이는 보편적 인 이해가 아닙니다.
Jay Bazuzi

19
TDD를 수행하는 경우 실패한 테스트를 작성하고 코드를 수정 한 다음 체크인하십시오 . 따라서 깨진 빌드를 피하십시오.
dietbuddha

7
같은 논리로 문제를 해결할 때까지 클라이언트의 라이브 인스턴스를 종료해야합니다. 아니요, 빌드를 중단해서는 안됩니다. 버그를 처리하는 개발자가 단위 테스트를 추가하고 코드가 함께 변경되도록합니다. 전체 프로세스를 종료 할 필요가 없습니다.
Thanos Papathanasiou

답변:


412

우리의 전략은 다음과 같습니다

실패한 테스트를 확인하지만로 주석을 답니다 @Ignore("fails because of Bug #1234").

그렇게하면 테스트가 있지만 빌드가 중단되지 않습니다.

물론 버그 DB에서 무시 된 테스트를 확인 했으므로 @Ignore테스트가 수정되면 제거됩니다. 또한 버그 수정을 쉽게 확인할 수 있습니다.

실패한 테스트에서 빌드를 중단하는 것은 팀에 압력을 가하는 것이 아니라 문제를 경고하는 것입니다. 버그 DB에서 문제가 확인되고 제기되면 모든 빌드에 대해 테스트를 실행할 필요가 없습니다. 실패 할 것입니다.

물론, 버그는 여전히 수정되어야합니다. 그러나 수정 일정을 예약하는 것은 비즈니스 결정이므로 실제로 개발자의 관심사는 아닙니다. 버그 DB에 버그가 제기되면 고객 / 제품 소유자가 수정을 원한다고 말할 때까지 더 이상 내 문제가 아닙니다. .


150
+1 나는 당신이 "수정 계획을 세우는 것은 사업상의 결정"이라는 말로 머리를 깎았다고 생각 한다. 개발자로서 버그가 빌드를 깨뜨 렸는지 결정하는 것은 나의 판단이 아니다.
MattDavey

22
나는 이것이 매우 합리적인 해결책이라고 생각합니다. 특히 다음 사람이 사소한 코드를 체크인하는 경우 갑자기 "실패한 테스트"알림을 받고 자신이 한 일이라고 생각합니다.
Holger

14
"버그 DB에 버그가 제기되면 더 이상 내 문제는 아니다"... +1
Jake Berger

20
도요타에서 @anon Exept. 라인 작업자가 결함을 발견 한 후 andon 코드를 잡아 당기면 전체 플랜트가 중지되고 관리가 종료되고 문제가 해결 될 때까지 라인이 다시 시작되지 않습니다. 구글 안돈 코드. 새로운 개념이 아닙니다. 참조 : startuplessonslearned.com/2008/09/…
Christopher Mahan

4
@AndresJaanTack : 물론 이것은 방법론에 달려 있지만 일반적으로 동의하지 않습니다. 적어도 비즈니스 환경에서는 스케줄링 작업이 비즈니스 결정이며 버그 수정포함됩니다 . 때로는 새로운 기능 (또는 특정 날짜에 릴리스)이 (사소한) 버그를 수정하는 것보다 더 가치가있을 수 있습니다.이 경우 버그 수정을 연기해야합니다. "지금 버그 수정"은 더 중요한 작업을 지연시키기 때문에 이러한 상황에서는 적합하지 않습니다.
sleske

106

알려진 결함으로 빌드가 성공하도록하려는 이유는 무엇입니까?

때로는 시간 제약이 있기 때문입니다. 또는 버그가 너무 작아서 단위 테스트 및 수정에 필요한 며칠 동안 제품 배송을 지연시킬 가치가 없습니다.

또한 버그를 발견 할 때마다 의도적으로 빌드를 중단하는 요점은 무엇입니까? 찾은 경우 전체 팀을 방해하지 말고 수정하십시오 (또는 수정할 담당자에게 지정). 버그 수정을 기억하려면 버그 추적 시스템에서 버그를 매우 중요하게 표시해야합니다.


나는 당신의 요점을보고 일반적으로 동의합니다-그러나이 경우 우리는 프로덕션에 그것을 만들고 최종 사용자가 직면 한 심각한 버그에 대해 이야기하고 있습니다 : s
MattDavey

3
내 대답의 두 번째 단락을 참조하십시오.
Arseni Mourzenko

8
나는 첫 번째 단락에서 요점을 요약했다고 생각합니다. 버그의 심각성을 판단하는 것은 개발자의 책임이 아니거나 버그의 스토퍼인지 여부는 더 넓은 비즈니스에 대한 결정입니다.
MattDavey

4
문제는이 버그의 우선 순위는 무엇입니까? 그것은 지금 OMG FIX IT 일 수 있습니다. Yea 일 수 있습니다. 중간에 무언가 일 수있는 시점에서 수정해야합니다. 그러나 모든 버그가 해당 스펙트럼의 동일한 위치에서 발생하는 것은 아닙니다.
Zachary K

55

문제가 발생하지 않도록 다시 테스트합니다. 실패한 테스트 목록은 버그 추적 시스템을 대체하지 않습니다. POV에는 실패한 테스트가 버그의 표시 일뿐 아니라 개발 프로세스 실패 (부주의에서 잘못 식별 된 종속성까지)의 표시이기도합니다.


20
"실패한 테스트 목록은 버그 추적 시스템을 대체하지 않습니다" +1, 또한 아주 좋은 지적 :)
MattDavey

1
회귀 단위 테스트가 이전이 아닌 버그 수정의 일부로 코드베이스에 입력되도록 제안합니다.
yrk

6
@yarek : 회귀 테스트는 언제든지 코드베이스에 들어갈 수 있습니다. 버그가 수정 될 때까지 무시하면됩니다. 나는 보통 디버깅 보조 도구로 두 배가 될 수 있기 때문에 문제를 진단하면서 개발합니다.
sleske 2012 년

이것이 "빌드 파괴"가 CI가 단순히 "불만 주도 개발"으로 분류되는 작업장의 독성 부분이되는 이유를 보여주는 좋은 예입니다. 나는 PHB가 "부주의"에 대해 울부 짖기 시작하는 많은 회의에 참석했다. 이러한 환경에서는 의도적으로 빌드를 손상시킨 것을 체크인하지 않습니다. 그렇지 않으면 PHB가 화를냅니다. 빌드를 깨고 부끄러운 콘을 착용하십시오. 엉터리 연습이야
Warren P

@ WarrenP, 때로는 다른 문제가 있지만, 부주의가 빌드가 깨지는 첫 번째 이유라는 것을 분명히하십시오. 무언가가 빌드를 망친다는 것을 알고 있다면 왜 체크인합니까?
AProgrammer

23

"빌드 중단"은 빌드가 성공적으로 완료되지 않도록하는 것을 의미 합니다 . 실패한 테스트는 그렇게하지 않습니다. 빌드에 알려진 결함이 있음을 나타내며 이는 정확히 맞습니다.

대부분의 빌드 서버는 시간이 지남에 따라 테스트 상태를 추적하고 추가 된 이후 실패한 테스트에 다른 분류를 할당하고 (통과에 사용되거나 더 이상 사용하지 않는 테스트), 회귀가 발생했습니다.


12
이것은 항상 정확하지는 않지만, 종종 팀은 실패한 테스트를 깨진 빌드로 간주합니다. 실제로 최근에 본 대부분의 팀은 일반적인 애자일 방식입니다. 대부분의 민첩한 팀에서 실패한 테스트는 회선을 중단하는 경우입니다. 팀 전체가 문제를 공격하고 해결합니다. 응답이 귀하의 관행을 기반으로해야한다는 것을 의미하기 위해 귀하의 게시물을 취할 수 있다고 생각합니다.이 경우 완전히 정확합니다.
Bill K

2
나는 항상 테스트 실패를 고려하여 빌드가 실패했음을 의미합니다.
John Saunders

@ JohnSaunders : 그러나 그것은 그것이 의미하는 바가 아닙니다. 내 대답에서 말했듯이 "빌드에 알려진 결함이 있음"을 의미합니다.
Ben Voigt

1
@ 호는 테스트가 없다고 말했습니까? 어디서 구할 수 있습니까? 버그를 찾은 후 첫 번째 단계는 빌드의 성공을 막는 것이 아니라 자세한 버그 보고서를 만드는 것입니다. 버그가 수정되면 먼저 실패한 단위 테스트가 있어야합니다.
John Saunders

1
실패한 테스트를 즉시 생성하는 데는 거의 문제가 없습니다. 빌드시 실행될 테스트 세트에 체크인하고 싶지 않습니다. 또한 버그를 수정 한 개발자가 해당 테스트를 무시할 수 있기를 바랍니다. 내가 일한 대부분의 장소에서 버그 보고서를 만든 사람들은 단위 테스트를 만들지 않을 것입니다.
John Saunders

16

실패한 테스트를 추가해야하지만 "실패한 테스트"라고 명시 적으로 말해서는 안됩니다.

@BenVoigt가 그의 대답 에서 지적했듯이 , 실패한 테스트가 반드시 "빌드를 파괴"하지는 않습니다. 용어는 팀마다 다를 수 있지만 코드는 여전히 컴파일되며 제품은 여전히 ​​실패한 테스트와 함께 제공 될 수 있습니다.

이 상황에서 스스로에게 물어봐야 할 것은

수행해야 할 테스트는 무엇입니까?

테스트가 모든 사람이 코드에 대해 좋은 느낌을 갖도록하기 위해 실패한 테스트를 추가하면 모든 사람이 코드에 대해 나쁜 느낌을 갖도록하는 것이 생산적으로 보이지 않습니다. 그러나 테스트가 처음에 얼마나 생산적인가?

내 주장은 테스트가 비즈니스 요구 사항을 반영해야한다는 것 입니다. 는 "버그"는 요구가 제대로 충족되지 나타냅니다 발견 된 경우에 따라서, 다음은 또한 테스트가 제대로 또는 완전히 비즈니스 요구 사항을 반영하지 않습니다 있다는 표시입니다.

그것은 먼저 수정해야 할 버그입니다. "실패한 테스트 추가"가 아닙니다. 당신이있어 수정 비즈니스 요구 사항을보다 정확하게 반영되어야 할 시험 항목을. 코드가 이러한 테스트를 통과하지 못하면 좋은 것입니다. 테스트가 일을하고 있다는 것을 의미합니다.

코드 수정의 우선 순위는 비즈니스에 의해 결정됩니다. 그러나 테스트가 수정 될 때까지 우선 순위를 결정할 수 있습니까? 비즈니스는 정확히 무엇이 실패하고, 어떻게 실패하고, 왜 우선 순위에 대한 결정을 내리기 위해 실패하는지에 대한 지식으로 무장해야합니다. 테스트에서이를 표시해야합니다.

완전히 통과하지 못한 테스트를받는 것은 나쁘지 않습니다. 알려진 문제의 우선 순위를 정하고 그에 따라 처리 할 수있는 큰 이슈를 만듭니다. 그러나 완전하게 테스트 되지 않는 테스트 는 문제입니다. 테스트 자체의 가치에 의문을 제기합니다.

다른 말로하면 ... 빌드가 이미 고장났습니다. 당신이 결정하는 것은 그 사실에주의를 기울 일지 여부입니다.


1
어설 션이 잘못되었으므로 단위 테스트가 비즈니스 요구 사항에 직접 매핑되는 것은 아니지만 기능 테스트 또는 엔드 투 엔드 테스트와는 달리 OP는 단위 테스트 / TDD에 대해 이야기했습니다.
존 뷰캐넌

@ JohnBuchanan : 소프트웨어가해야 할 일을하고 있지 않다면 검증하기위한 테스트는 무엇입니까? (즉, 요구 사항을 충족한다는 것입니다.) 단위 테스트 외부에 다른 형태의 테스트가 있습니다. 그러나 단위 테스트에서 그 가치가 소프트웨어의 비즈니스 요구를 충족시키는 지 검증하지 못하는 가치를 보지 못했습니다.
David

1
@JohnBuchanan- "테스트는 비즈니스 요구 사항을 반영한 것"이라고 말하지 않았으며 "SHOULD BE"라고 말했습니다. 어느 것이 사실이지만 논쟁의 여지가 있습니다. 당신이 이것이 항상 그런 것은 아니라고 주장하는 것이 옳습니다. 어떤 사람들은 비즈니스 요구 사항에 맞지 않는 단위 테스트를 작성합니다. 다윗의 주장이 잘못되었다고 주장하고 싶다면 왜 그렇게 생각하는지에 대해 말할 수 있습니다.
Dawood ibn Kareem

13

테스트 자동화 팀에서는 테스트 결함이 아닌 제품 결함으로 인해 실패하는 한 실패한 테스트를 체크인합니다. 이런 식으로 우리는 개발자 팀에게 증거를 얻었습니다. 빌드를 깨는 것은 매우 어리석은 일이지만 완벽하게 컴파일 가능하지만 실패한 테스트를 체크인하는 것과는 다릅니다.


4
@MattDavey의 아이디어는 훌륭한 아이디어라고 생각하며 과거에는 논쟁을 벌였습니다. 나는 항상 저항의 돌담을 만났다 – "당신은 절대로 빌드를 깰 수 없다!". 이 상황에서 빌드가 이미 중단 되었다는 생각 은 사람들이 이해하기가 불가능 해 보입니다. 안타깝게도, 이것은 좋은 아이디어 (자동 테스트 및 클린 빌드)가화물 컬트 관행으로 나뉘어 진 또 다른 경우 일뿐입니다.
Tom Anderson

3
내가 생각해 낸 한 가지 아이디어는 QA 팀 (테스트를 작성하기에 충분히 기술적 인 경우)이 실패한 버그에 대한 테스트를 작성하고 체크인해야한다는 것입니다. 그린 바에 대한 개발자의 집착은 절대적으로 이어질 것입니다 기능을 추가하는 것보다 버그를 수정하여 개발하는 올바른 방법입니다.
Tom Anderson

그러나 이는 빌드 중에 실행될 단위 테스트가 아니어야합니다. 사용자 환경에 QA 용 테스트 관리 시스템 (예 : Microsoft Test Manager)이 포함 된 경우 하나 이상의 테스트 사례를 추가하고 버그에 연결해야하지만 빌드가 성공하지 못하도록 막지는 않습니다. 단순히 테스트 일뿐입니다. 버그 전에 통과해야하는 경우는 "완료"로 간주됩니다.
John Saunders

7

버그가 수정 될 때까지 실패 할 것이라는 테스트를 작성하는 것이 좋습니다. 이는 TDD의 기초입니다.

빌드를 깨는 것은 나쁜 생각입니다. 왜? 그것은 고정 될 때까지 아무것도 움직일 수 없다는 것을 의미하기 때문입니다. 본질적으로 개발의 다른 모든 측면을 차단합니다.

예제 1
구성 요소가 많고 응용 프로그램이 큰 경우 어떻게됩니까? 다른 팀에서 자체 릴리스 주기로 해당 구성 요소를 작업하는 경우 어떻게됩니까? 강인한! 그들은 당신의 버그 수정을 기다려야합니다!

예제 2
첫 번째 버그를 수정하기 어려운데 우선 순위가 더 높은 다른 버그 를 찾으면 어떻게합니까? 또한 두 번째 버그에 대한 빌드를 중단합니까? 이제 둘 다 고정 될 때까지 빌드 할 수 없습니다 . 인공적인 의존성을 만들었습니다.

테스트 실패가 빌드를 중지해야하는 논리적 이유는 없습니다. 이것은 개발자 팀이 알려진 버그로 빌드를 릴리스하는 장단점을 평가하기 위해 (관리 토론과 함께) 결정 해야하는 결정입니다. 이것은 소프트웨어 개발에서 매우 일반적이며, 거의 모든 주요 소프트웨어는 최소한으로 출시 몇 가지 알려진 문제.


5

테스트가 수행해야 할 역할과 그 결과가 채택 된 빌드 시스템 / 프로세스에 어떤 영향을 미치는지에 따라 다릅니다. 빌드를 깨는 것에 대한 나의 이해는 Ben과 동일하며 동시에 기존 테스트를 중단하는 코드를 의도적으로 체크인해서는 안됩니다. 이러한 테스트가 "나중에"들어온 경우, 다른 테스트를 불필요하게 방해하지 않도록 무시하는 것이 "좋아"일 수 있지만, 실패한 테스트를 무시하는 (실제로 보이기 위해) 무시하는이 관행은 다소 혼란 스럽습니다 (특히 빨간색 또는 녹색이 아닌 테스트를 나타내는 방법이없는 한 단위 테스트의 경우).


"적색 또는 녹색이 아닌 테스트를 표시 할 수있는 방법이 없다면" 단지 기록 : 대부분의 단위 테스트 프레임 워크는 빨간색, 녹색 및 무시 된 테스트를 구분합니다. 최소한 JUnit과 TestNG는 "xx 테스트, x 실패, x 무시"를보고합니다.
sleske

이상적인 @sleske, 난 그냥 실패를 무시하면 자동으로 성공으로 바뀌지 않도록하고
싶습니다

노란색 빌드가 없습니까? 허드슨 / 젠킨스, 크루즈 컨트롤 및 다른 모든 biggies의 (빨강 / 녹색 / 노랑)?
Warren P

사람들이 제대로 검사를 무시하지만, 일부는 그들을 녹색하여 테스트를 무시할 때 @Warren P는 작동
prusswan

5

물론 버그에 따라 다르지만 일반적으로 수동 또는 자동 테스트 중에 식별되지 않은 문제가 발생하면 적용 범위에 차이가 있음을 의미합니다. 근본적인 원인을 파악하고 문제 위에 단위 테스트 사례를 두드리는 것이 좋습니다.

유지 관리 지점에서 핫픽스를 계획 한 프로덕션 문제인 경우에도 수정 프로그램이 기본에서 작동하는지 확인하고 개발자가 지나치게 열성적인 병합 충돌 해결로 수정 프로그램을 잘못 날릴 수 없도록해야합니다. .

또한 릴리스 정책에 따라 새로 업데이트 된 단위 테스트가 있으면 개발자가 문제를 단순히 [문제 또는 테스트?]로 변경하지 않고 실제로 문제를 해결했는지 확인하는 데 도움이 될 수 있습니다. 새로운 단위 테스트에서 올바른 요구 사항.


5

빌드에 실패 테스트를 추가 할 때의 한 가지 문제점은 팀이 빌드 실패를 예상하기 때문에 실패한 테스트를 무시하는 습관이 생길 수 있다는 것입니다. 빌드 시스템에 따라 다르지만 실패한 테스트가 항상 "무엇이 고장났다"는 의미는 아니라면 실패한 테스트에 덜주의를 기울이는 것이 쉽습니다.

당신은 당신의 팀이 그런 사고 방식을 갖도록 돕고 싶지 않습니다.

따라서 테스트를 추가 해야 하지만 버그가 수정 될 때까지 자동 빌드 목적 으로 '무시'로 표시 해야한다는 썰매에 동의합니다 .


1
테스트 소프트웨어는 이전에 실패한 테스트와 비교하여 새로 고장난시기를 알려줍니다.
Ben Voigt

4

어떤 식 으로든 버그를 테스트로 '체크 인'해야한다고 생각하지만 버그를 수정하면 다시 발생하지 않으며 우선 순위를 매기므로 빌드를 중단하지 않는 것이 가장 좋습니다 (/ 테스트) . 그 이유는 후속 빌드 커밋이 깨진 테스트 뒤에 숨겨지기 때문입니다. 따라서이 버그에 대해 깨진 테스트를 확인하면 팀 전체가이 버그를 해결하기 위해 작업을 정리해야합니다. 이것이 발생하지 않으면 추적 할 수없는 커밋을 중단 할 수 있습니다.

따라서 테스트를 보류 테스트로 커밋하는 것이 좋으며 팀에서 테스트를 보류하지 않는 것을 우선 순위로 둡니다.


4

또 다른 옵션은 실패한 테스트를 소스 제어 시스템의 별도 분기로 검사하는 것입니다. 당신의 관행에 따라, 이것은 가능하거나 그렇지 않을 수 있습니다. 때때로 사소하지 않은 버그 수정과 같은 지속적인 작업을 위해 새로운 지점을 개설합니다.

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