오래된 / 레거시 단위 테스트 고장


13

저는 대기업에서 일하고 있으며 수천 개의 junit 테스트로 대규모 Java 응용 프로그램을 담당하고 있습니다. 이 직책으로 이사 한 이후 200-300 건의 테스트가 중단되었습니다 (수년 동안 중단 된 것 같습니다). 테스트는 오래되고 깨지기 쉬우 며 일반적으로 라이브 샌드 박스 데이터로 끝나는 스파게티 종속성의 혼란입니다.

내 목표는 100 % 테스트 통과이므로 단위 테스트 실패에 대한 빌드를 중단 할 수는 있지만 깨진 테스트를 처리 할 때까지는 할 수 없습니다. 유지 관리 예산이 주로 지원을위한 예산으로 인해 예산이 매우 적지 만 팀에서 낮은 결실 테스트 (주로 구성 / 로컬 리소스 문제)를 식별하고 수정했으며 실제로 30 ~ 40 개 정도의 추악한 테스트를 거쳤습니다.

모범 사례에 대한 의견은 무엇입니까? 나는 테스트가 가치가 있다고 생각하지 않지만 테스트하고있는 것이 무엇인지, 파지 않고 작동하지 않는 이유를 알지 못합니다. 아마도 시간과 돈이 없을 것입니다.

깨진 테스트의 상태를 우리가 아는 것으로 문서화 한 다음 깨진 테스트를 완전히 삭제하거나 무시하고 우선 순위가 낮은 버그 / 작업 항목을 입력하여 조사하고 수정해야한다고 생각합니다. 그런 다음 100 %에 도달하고 다른 테스트에서 실질적인 가치를 얻습니다. 유지 보수 / 리팩토링이 발생하는 경우 다시 선택할 수 있습니다.

가장 좋은 방법은 무엇입니까?

편집 : 나는 우리가 앞으로 작성해야 할 테스트에 대한 명확한 지시가 있기 때문에 이것이이 질문 과 다른 질문이라고 생각 하지만, 큰 현재 테스트 세트가 의미를 갖기 전에 해결해야 할 레거시 실패 테스트를 상속했습니다.


1
확실히 당신은 30-40 추한 테스트를 제거해야한다는 것에 동의합니다. 그러나 "유지 보수 / 리팩토링 바람이 불면 다시 찾아 낼 수있을 것"이라는 소망이 들린다. 나는 그런 항목이 결코 행동하지 않는 습관을 가지고 있기 때문에 우선 순위가 낮은 항목으로 문서화하면 실제로 이점이 있는지 확실하지 않습니다.
David Arno

1
이 책을 확인하는 것이 좋습니다 : 레거시 코드로 효과적으로 작업하기 . 책 추천은 귀하의 질문에 대한 답변이 아니지만 단위 테스트와 관련하여 많은 조언이 있습니다.

4
이것은 중복 된 것일 수도 있지만 그 질문 은 아닙니다 . 이것은 취약한 단위 테스트 작성을 피하는 방법이 아니라 이미 작성된 단위 테스트로 실패한 상속 된 코드베이스를 관리하는 방법을 묻습니다 .

1
이미 솔루션을 찾은 것 같습니다.
Doc Brown

2
@gnat 동의하지 않습니다. 개인적인 경험에서, "어제 밤에 많은 단위 테스트를 중단 한 것"과 "아무도 이유를 모르는 단위 테스트로 오랫동안 실패한 많은 오래된 코드를 물려 받았습니다"사이에는 큰 차이가 있습니다. 하나는 현재 개발의 문제이고, 하나는 레거시 소프트웨어의 문제입니다. 여기에는 두 가지 접근 방식이 필요합니다. 링크 된 질문에 대한 최상위 답변은 레거시 측면을 다루지 않습니다.

답변:


17

내가 할 일은 먼저 실패하고 항상 실패한 테스트를 비활성화하는 것입니다.

테스트 실패 문제를 해결하십시오.

조사 할 때 회사에있는 사람들에게 더 오래 질문 할 수있을 것이므로 문서화 / 캡처 할 수있는 많은 부족 지식이있을 수 있습니다. 아마도 VCS 로그에서 찾을 수 있습니다. "아, 우리가 X로 업그레이드 한 이후로 그 테스트는 항상 실패했습니다"또는 다른 정보가 유용 할 수 있습니다.

테스트중인 기능이 무엇인지 알면 다음을 결정할 수 있습니다.

  • 우리는 이것을 테스트하는 것에 관심이 있습니까?
  • 테스트하는 것이 얼마나 중요합니까

그런 다음 우선 순위 목록을 작성하십시오.

이미이 목록에 몇 년 동안 무시 된 이후 더 많은 시간을 확보 할만큼 중요한 것은 없을 것입니다. 그래서 나는 모든 깨진 테스트를 문서화하고 분석하는 데 너무 많은 시간과 자원을 소비하지 않을 것 입니다.


1
테스트를 미리 비활성화한다는 생각이 마음에 들지만 보수적 인 환경에서는 더 작은 증분 이동을 선호 할 수 있습니다. 나는 그것이 당신의 회사에 달려 있다고 생각합니까?
Aaron Hall

1
@AaronHall-즉각적인 코드 변경 요구 사항 (수정 및 개선 사항)을보고 이와 관련된 깨진 테스트를 식별하면 이러한 모든 기능을 켜고 테스트를 평가하고 수정하며 이해를 통해 코딩을 변경할 수 있습니다. 테스트는 통과, 수정 또는 삭제됩니다.
JeffO

6

나는 다음을 할 것이다 :

  1. 실패한 테스트가 무엇을 검증하려고하는지 정확하게 판단하십시오.

  2. 심사-일부 테스트에서 (오래된) 세계 상태와 같은 중요하지 않은 것을 테스트하려는 경우 삭제하십시오. 그들 중 일부가 중요한 것을 검증하려고한다는 것을 알고 있다면, 그러한 테스트가 올바르게 수행되고 있는지 확인하십시오. 테스트가 잘못되면 올바르게 테스트하십시오.

  3. 테스트가 잘되었으므로 프로덕션 코드에 문제가있는 것을 수정하십시오.

회계를 명심하십시오. 모든 코드는 책임이지만 자산으로 잘못 평가 될 수 있습니다. delete키는 기업 가치를 많이 만들 수 있습니다.


팀 스타일 심사 아이디어는 매우 좋습니다!

좋은 아이디어이지만 OP는 이미 무거운 분석을 수행 할 리소스가 없기 때문에 불행히도이를 사용할 수는 없다고 말했다.
TMN

심사는 제한된 리소스를 최대한 가치를 창출 할 수있는 곳에 배분하는 것입니다. 심사 및 소프트웨어 주제에 관한 관련 블로그 게시물은 다음과 같습니다. softwaretestingclub.com/profiles/blogs/…
Aaron Hall

5

200-300 개의 깨진 테스트

아야! 나는 비슷한 상황에 한 번 직면했지만 "항상 위기"정신으로 인해 몇 달 동안 실패했다는 사실을 무시하기 시작한 7 가지 테스트가 실패했습니다.

내 목표는 100 % 테스트 통과이므로 단위 테스트 실패에 대한 빌드를 중단 할 수는 있지만 깨진 테스트를 처리 할 때까지는 할 수 없습니다.

몇 달 동안 더 많은 테스트가 실패한 파일을 알아 차렸 기 때문에 팀의 주니어 개발자 일지라도 비슷한 목표에 집착했습니다. 나는 우리가 그 사람들을 "경고"에서 빌드 오류 (아마도 다른 팀에게 명백하게)로 바꾸고 싶었다.

깨진 테스트의 상태를 우리가 아는 것으로 문서화 한 다음 깨진 테스트를 완전히 삭제하거나 무시하고 우선 순위가 낮은 버그 / 작업 항목을 입력하여 조사하고 수정해야한다고 생각합니다. 그런 다음 100 %에 도달하고 다른 테스트에서 실질적인 가치를 얻습니다. 유지 보수 / 리팩토링이 발생하는 경우 다시 선택할 수 있습니다.

이것들도 저의 생각입니다. 이러한 모든 잘못된 테스트를 일시적으로 비활성화하고 천천히 방문하여 시간이 지남에 따라 수정하십시오. 우선 순위가 낮은 경우에도 수정 사항을 쉽게 고칠 수 없기 때문에 수정 사항을 예약하는 것이 중요합니다. 저에게 우선 순위는 새로운 테스트가 실패하지 않도록하는 것입니다.

어떤 종류의 경고와 마찬가지로 빌드를 중단하지 않으면 빠르게 쌓이는 경향이 있습니다. 이것은 경고를 무시하는 습관 (이 경우 테스트 실패)이 더 많은 경고를 발생시키고 경고를 0으로 유지하려는 유혹을 줄일 수있는 팀의 역 동성을 가정합니다.

매우 양심적 인 팀은 이러한 문제를 겪지 않고 새로운 경고 (테스트의 새로운 실패)를 피할 수는 있지만 조금 더 무거운 손을 잡고 예방 전략을 실행하는 것이 더 안전 합니다 . 합병 과정.

따라서 제 제안은 귀하의 의견과 동일합니다 (강력한 의견 일지라도-다소 통계와 더 과학적인 답변으로 이것을 뒷받침 할 수 있습니다). 이러한 이전 테스트를 비활성화하고 일정에 맞춰 결국 수정하십시오. 첫 번째 우선 순위는 현재 성공한 테스트가 실패하기 시작하면 무시되지 않도록함으로써이 문제가 누적되지 않고 악화되기 시작하는 것입니다.


4

운이 좋은 방법으로. 테스트에 실패하고 실패하면 안되는 테스트를하는 것이 낫습니다 (최소한 무언가 잘못되었다는 경고를 표시 함).
물론 전자를 가지고 있다면 후자를 가지고있을 가능성이 높습니다 (따라서 통과하지만 실패해야하는 테스트).

이미 언급했듯이, 지금은 실패한 테스트를 비활성화하지만 테스트 로그에 메시지를 지속적으로 상기시켜주는 메시지를 인쇄하도록합니다.
그러나 통과하고하지 말아야 할 테스트를 찾아서 제거하기 위해 전체 테스트 스위트를 살펴볼 수있는 리소스를 반드시 찾아야합니다. 각 테스트는 현재 코드에서 감지하지 못하는 버그가 있음을 의미하기 때문입니다. 테스트주기.

코드베이스에 매달려있는 어두운 구름을 사용하면 테스트를 제대로 검토하고 예산을 확보 할 수 있습니다. 테스트를 제대로 수행하고 테스트하지 않으면 테스트를보아야한다고 생각하지 않는 경우 실패하면 안되지만 테스트에서 코드의 오류를 올바르게 감지하고 테스트 세트를 신뢰할 수 없다고 믿지 않습니다.
내가 이전 회사에서 그렇게했을 때 나는 그런 검토를 위해 노력하고 있었는데 코드가 해야하는 것에 대한 잘못된 가정으로 수백 개의 테스트가 작성되어 코드 (동일한 잘못된 가정을 사용하여 작성된)가 테스트를 통과했을 때 정말 없어야합니다. 이 문제를 해결하면 중요하지 않은 많은 불쾌한 코너 케이스 버그가 해결되어 일부 중요한 시스템이 다운 될 수있었습니다.


3

실패한 단위 테스트로 인해 빌드가 손상됩니다. 그것을 실현하고 그 목표를 설정해 주셔서 감사합니다. 인간의 마음은 지속적인 허위 경보 의 원천보다 더 완전한 것을 무시할 수는 없습니다 .

이 테스트를 버리고 뒤돌아 보지 마십시오. 그들이 몇 년 동안 실패했지만 지금까지 해결되지 않았다면 그들은 우선 순위가 아닙니다.

부족 지식에 관해서는, 부족 지식을 가진 사람들이 여전히 주변에 있다면 그들은 지금까지 실패한 시험을 고쳐야했습니다. 그렇지 않다면, 이것들은 우선 순위가 아닙니다.

부족의 지식이 없다면, 당신과 당신의 팀은 논리의 소유권을 가져야합니다. 실패한 테스트는 도움이되는 것보다 잘못 될 수 있습니다.

관련성이 높은 새로운 테스트를 작성하고 훌륭한 코드 작성을 시작하십시오.

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