단위 테스트를 추가하는 것이 잘 알려진 레거시 코드에 적합합니까?


21
  • TDD 의미에서 단위 테스트 에 대해 이야기하고 있습니다. (자동화 된 "통합"또는 테스트라고하는 것은 아닙니다.)
  • 테스트가없는 (C ++) 코드와 같은 레거시 코드 (Michael Feathers의 레거시 코드로 효과적으로 작업하기 참조 )
  • 또한 레거시 코드는 다음과 같습니다. 지난 10-5 년 동안 우리 팀이 협력해온 코드이므로 변경해야 할 사항을 어디에 두어야하는지에 대한 좋은 아이디어가 있습니다.
  • 우리 는 나중에 나왔거나 단위 테스트 (일반적인 응용 프로그램 특정 컨테이너, 문자열, 네트워크 도우미 등)에 "자연스럽게"적합했던 일부 모듈에 대해 단위 테스트를 실시했습니다 (부스트 테스트를 통해 ).
  • 아직 적절한 자동 수락 테스트가 없습니다.

최근에는 3 가지 새로운 사용자 대면 기능을 구현할 수있는 "즐거움"이있었습니다.

그 각각은 내가 변경 해야하는 코드 부분, 1-2 시간 동안 변경 해야하는 (작은) 코드를 구현하는 데 1-2 시간, 앱을 확인하는 데 1-2 시간이 걸리는 데 약 1-2 시간이 걸렸습니다. 그 후에 올바르게 달려서해야했습니다.

이제 작은 코드를 추가했습니다. (각 기능마다 하나의 방법과 몇 개의 전화 회선이 있다고 생각합니다.)

(에 제안 된 방법 중 하나를 통해이 코드 밖으로 인수 분해 WEwLC을 했을 단위 테스트는 메이크업 감각을 텐데 그래서 () 및 완전한 동의어 반복하지) 쉽게 하지 많은 경우, 다른 2-4시간을 촬영. 이것은 각 기능에 50 % -100 %의 시간을 추가했을 것입니다.

  1. 코드에 대해 이해하기 위해 단위 테스트가 필요하지 않았습니다.
  2. 수동 테스트는 코드가 앱의 나머지 부분에 올바르게 통합되어 있는지 테스트해야하기 때문에 동일한 양의 작업입니다.

, 부여 하면 나중에, "누군가가"함께 와서 코드, 그는 감동을, 이론적으로 그 단위 테스트에서 몇 가지 이점을 가질 수있다. (이론적으로 테스트 된 코드 아일랜드는 테스트되지 않은 코드의 바다에 살 것입니다.)

따라서 이번에는 단위 테스트를 추가하는 데 어려움을 겪지 않기로 결정했습니다. 테스트중인 항목을 얻기위한 코드 변경은 기능을 올바르게 ( 정확하게 ) 구현 하기위한 코드 변경보다 훨씬 더 복잡했을 것 입니다.

이것이 강력하게 결합 된 레거시 코드에 일반적인 것입니까? 나는 게 으르거나 팀으로서 잘못된 우선 순위를 설정합니까? 아니면 오버 헤드가 너무 높지 않은 물건 만 테스트하는 것이 신중합니까?


다른 부서에서 "잘 알려진 레거시 코드"를 인수하면 어떻게됩니까? 거기에있는 사람들은 어떻게할까요?
Alex Theodoridis

답변:


18

이러한 상황에 대해 실용적이어야합니다. 모든 것이 비즈니스 가치를 가져야하지만, 비즈니스는 기술 작업의 가치가 무엇인지 판단해야합니다. 그렇습니다. 단위 테스트를하면 항상 이점이 있지만 그 시간이 시간을 정당화하기에 충분할까요?

나는 항상 새로운 코드를 주장 하지만 레거시 코드에서는 판단을해야합니다.

이 코드 영역에 자주 있습니까? 그런 다음 지속적인 개선이 필요한 경우가 있습니다. 당신은 중대한 변화를하고 있습니까? 그런 다음 이미 새로운 코드 인 경우가 있습니다. 그러나 복잡한 지역에서 1 년 동안 다시는 손대지 않는 한 줄짜리 코드를 작성하는 경우 물론 리엔지니어링 비용 (위험은 말할 것도없고)이 너무 큽니다. 한 줄의 코드를 넣고 샤워를 빨리하십시오.

경험의 규칙 : 항상 " 내가 생각하는 업무보다 결과적으로 지연 될이 기술 업무의 이점이 비즈니스에 더 도움이된다고 생각합니까? "


좋은 코드는 무엇입니까? 잘 설계되고, 테스트되고, 문서화되고, 미래의 증거가됩니까? 언제나처럼 : 당신은 그것을 가질 수 있습니다 . 당신은 그것을 싸게 가질 수 있습니다 ; 당신은 그것을 빨리 가질 수 있습니다 . 두 가지 중 하나를 선택하십시오. 세 번째는 비용입니다.
Sardathrion-복원 Monica Monica

2
"레거시 코드베이스에서"새 코드 "또는"새 코드 "를 항상 논할 것인가? :-)
Martin Ba

pdr은 올바른 아이디어를 가지고 있습니다. 엔지니어링 결정입니다 (단점). 일반적으로 검증 된 코드가 큰 경우에는 그대로 두는 것이 좋습니다. 레거시 코드에 대한 TDD 노력 (1 년 만에 충분하지만)으로 인해 비용이 몇 개월이 걸리고 TDD 리 팩터가 도입 된 버그가 수정 될 때까지 몇 달 동안 돈을 소비하고 레거시 앱을 깨는 결과를 얻었습니다. 코드 / 기능이 수행 및 테스트 된 경우 이미 알고있는 (작동하는) 것을 알려주기 위해 계측 (TDD)을 추가하기 위해 코드 / 기능을 중단하지 마십시오.
anon

10

TDD 의미에서 단위 테스트의 이점은 안정적인 팀이 수년에 걸쳐 구축 한 구전 전통을 필요로하지 않고 자체적으로 뛰어난 것을 얻는 것입니다.

같은 팀이 오랫동안 같은 프로젝트에 참여한 것은 큰 행운입니다. 그러나 이것은 결국 변할 것입니다. 사람들은 아프거나 지루하거나 승진합니다. 그들은 움직이거나 은퇴하거나 죽습니다. 새로운 아이디어는 새로운 아이디어와 함께 학교에서 배운 방식대로 모든 것을 리팩토링하려는 욕구를 가지고 있습니다. 회사는 팔리고 삽니다. 관리 정책이 변경되었습니다.

프로젝트를 생존 시키려면 변경을 위해 프로젝트를 준비해야합니다.


3

단위 테스트 작성은 나중에 코드를 교정하는 것입니다. 코드베이스에 테스트가없는 경우 모든 새로운 기능에 대해 새로운 테스트를 추가해야합니다. 왜냐하면 코드의 비트가 조금 더 강력 해지기 때문입니다.

레거시 코드에서도 테스트를 추가하는 것이 중장기 적으로 유리하다는 것을 알았습니다. 귀사가 중장기 적으로 신경 쓰지 않는다면 다른 회사를 찾겠습니다. 또한 세트 단위 테스트를 작성하는 것보다 수동으로 테스트하는 데 시간이 오래 걸리지 않습니다. 그렇다면 테스트 작성에 중점을 둔 코드 카타를 연습해야합니다.


1
그러나 그러나! :-) 적은 것은 새로운 기능을 구현하는 데 필요한 시간이 100 % 증가 한다는 것을 의미합니다. 그것은 않습니다 하지 이후의 기능을 구현하는 데 필요한 시간을 감소시킵니다. 그것은 물건을 변경할 때 필요한 시간을 감소시킵니다.
Martin Ba

3
코드의 해당 영역을 변경해도 새로운 버그가 발생하지 않고, 새로운 경험이 적은 사용자가 코드를 명확하게 이해할 수 있으며, 해당 영역에 영향을 미치는 부작용이 릴리스 시점이 아니라 테스트 시간에 기침이되는지 확인합니다. 시각. 테스트는 코드가 나중에 기능을 쉽게 추가 할 수없는 기능을 수행하는지 확인하는 데 도움이됩니다. 레거시 코드에서도 테스트를 추가하는 것이 중장기 적으로 유리하다는 것을 알았습니다 . 귀사가 중장기 적으로 신경 쓰지 않는다면 다른 회사를 찾겠습니다.
Sardathrion-복원 모니카

1
@Martin은 분명히 기능이 있어야한다고 생각하는 코드를 작성하고 제공하기 때문입니다. 어떤 단계에서도 테스트가 전혀 수행되지 않습니다. 개발자는 모두 코드를 완성하기 전에 최소한 손으로 테스트합니다. "자동 테스트 작성"으로 "손으로"를 교체하는 것은 시간이 100 % 증가하지 않습니다. 종종 나는 거의 같은 시간이 걸린다는 것을 알았습니다.
Kaz Dragon

1
@Kaz- "자동 테스트 작성"으로 "손으로"를 바꾸는 것은 시간이 100 % 증가하지 않습니다. -YMMV,하지만 내 코드베이스의 경우 분명히 문제가 있습니다 (질문에 나와 있음).
Martin Ba

3
@Kaz : 내가 :-) 의미하는 것은 : 단위 테스트는 내 코드를 따로 테스트합니다. 단위 테스트를 작성하지 않으면 코드를 개별적으로 테스트하지 않지만 코드가 올바르게 호출되고 앱에서 원하는 결과가 생성되는 경우에만 테스트합니다. 어쨌든 (수동으로) 테스트해야하며 단위 테스트에 포함되지 않습니다. 그리고 단위 테스트는이 두 가지 사항을 다루지 않지만 내 기능을 "단지"테스트합니다. (그리고이 단위 테스트는 추가적인 것이며 내가 볼 수있는 한 상쇄되지 않을 것입니다.)
Martin Ba

2

확실히 모범 사례는 변경 한 코드를 단위 테스트해야한다는 것을 나타냅니다. 그러나 실제 코딩에는 많은 타협이 필요하며 시간과 자료는 제한적입니다.

실제로 버그를 수정하고 단위 테스트없이 수정하는 비용을 평가해야합니다. 그런 다음 해당 테스트 작성에 대한 투자에 대해 평가할 수 있습니다. 단위 테스트는 향후 작업 비용을 크게 줄이지 만 지금은 가격이 책정됩니다.

결론은 시스템이 거의 변경되지 않으면 단위 테스트를 작성할 가치가 없지만 정기적으로 변경되는 경우 가치가 있습니다.


1

테스트를하지 않기위한이 합리적 결정은 모두 누군가를 떠날 때와 새로운 직원이 와서 속도를 낼 때 당신을 괴롭히는 심각한 기술적 부채를 만들어 내고 있습니다.

예, 단위 테스트를 작성하는 데 2-3 시간이 더 소요될 수 있지만 테스트에서 코드를 다시 보내면 모든 것을 수동으로 다시 테스트하고 테스트를 다시 문서화해야합니다. 그렇지 않습니까? 그렇지 않으면 테스트 한 내용과 사용한 값을 어떻게 아는 사람이 있습니까?

단위 테스트는 기능을 확인하기 위해 테스트 데이터가 사용한 코드의 예상 동작을 문서화하고 새로운 코더가 변경 작업을 수행 할 때 어떤 문제가 발생하지 않았다는 확신을줍니다.

오늘날 수동 테스트보다 몇 시간이 걸리지 만 코드 수명 동안 변경 시간을 절약 할 때마다 테스트하고 있습니다.

그러나 코드가 2 년 안에 폐기 될 것이라는 것을 알고 있다면 코드에 테스트를 완료하지 않고 결코 갚지 않을 것이기 때문에 변경 사항을 언급했습니다.


"테스트를 다시 문서화하십시오. 그렇지 않습니까?" -{냉소적 인 모자를 쓰고 :} 물론 아닙니다. 우리는 개발자 동화 나라에 없습니다. 물건이 구현되고 테스트되어 배송됩니다. 나중에 고장 나고 고정되어 테스트 및 배송됩니다.
Martin Ba

단위 테스트 수에 관계없이 모든 것이 수동으로 테스트되기를 바랍니다. 자동 수락 테스트는 전적으로 또 다른 문제입니다. 그러나 코드베이스가 레거시이기 때문에 승인 테스트가 더 어려워지지 않으므로 여기에서 범위를 벗어납니다.
pdr

2
mcottle- 중요한 포인트 가 없습니다 . 단위 테스트 완성 된 기능의 "수동 기능 테스트"를 수행하는 데 걸리는 시간을 줄이지 않습니다 . 나는 여전히 클릭을 통해 할 수 입력의 신중한 부분 집합에 포함 된 모든 대화 상자가하기로되어 있잖아 내장으로 확인 실제 완성 된 응용 프로그램을 확인해야합니다. ( 단, 수동 테스트 중에 눈에 띄는 문제가 없는지 단위 테스트를 통해 확인 하면 이론적으로 단위 테스트가이 수동 테스트주기를 하나의 루프로 제한하는 데 도움이 될 수 있습니다 .)
Martin Ba

0

단위 테스트의 가치는 새로운 기능이 개발 될 때 테스트하는 것만이 아닙니다. 단위 테스트의 이점은 대부분 미래에 얻을 수 있습니다.

예, 당신은 무엇을 지출 할 수 있습니다 보인다 기존 코드를 검증 할 시간의 과도한 양처럼.

그러나 그렇지 않은 경우 기능을 테스트하는 데 많은 시간, 더 많은 시간을 소비 해야 합니다. 초기 개발뿐만 아니라 모든 새 버전의 소프트웨어와 함께 제공됩니다. 단위 테스트없이 다른 형태의 자동 테스트를 수행하지 않으면 다른 옵션이 없지만 해당 기능 자체가 변경되지 않은 경우에도 기능이 실수로 손상되지 않았는지 확인하기 위해 많은 시간의 수동 테스트를 수행해야합니다.


1
"단위 테스트 없이는 기능 자체가 변경되지 않은 경우에도 기능이 실수로 손상되지 않았는지 확인할 수있는 다른 방법이 없습니다." -단위 테스트는 도움이되지 않습니다. 정말로 확실하게 하기 위해서는 자동화 된 통합 / 수락 테스트가 필요했습니다.
Martin Ba

예, 단위 테스트는 첫 단계 일뿐입니다. 명확히하기 위해 수정 된 답변
Marjan Venema
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.