이 질문에 대한 짧은 소개. 나는 지금 TDD와 요즘 BDD를 1 년 이상 사용했다. 테스트를보다 효율적으로 작성하기 위해 조롱과 같은 기술을 사용합니다. 최근에 나는 작은 돈 관리 프로그램을 작성하기위한 개인 프로젝트를 시작했다. 레거시 코드가 없었기 때문에 TDD로 시작하기에 완벽한 프로젝트였습니다. 불행히도 나는 TDD의 기쁨을 그다지 경험하지 못했습니다. 그것은 심지어 프로젝트를 포기했을 정도로 재미를 망쳐 버렸습니다.
문제는 무엇 이었습니까? 글쎄, 나는 테스트 / 요구 사항이 프로그램의 디자인을 발전 시키도록 TDD와 같은 접근법을 사용했다. 문제는 쓰기 / 리 팩터 테스트와 관련하여 개발 시간의 절반 이상이 문제였습니다. 결국 많은 테스트에 리팩토링하고 작성해야하므로 더 이상 기능을 구현하고 싶지 않았습니다.
직장에서 많은 레거시 코드가 있습니다. 여기에서는 점점 더 많은 통합 및 승인 테스트와 더 적은 단위 테스트를 작성합니다. 버그는 대부분 승인 및 통합 테스트에 의해 감지되므로 이는 나쁜 접근 방법이 아닙니다.
내 생각은 결국 단위 테스트보다 더 많은 통합 및 승인 테스트를 작성할 수 있다는 것입니다. 내가 버그를 감지했다고 말했듯이 단위 테스트는 통합 / 수락 테스트보다 낫지 않습니다. 단위 테스트도 설계에 좋습니다. 나는 그것들을 많이 쓰는 데 사용 되었기 때문에 내 수업은 항상 테스트 할 수 있도록 설계되었습니다. 또한 테스트 / 요구 사항이 설계를 안내하도록하는 접근 방식은 대부분의 경우 더 나은 설계로 이어집니다. 단위 테스트의 마지막 장점은 더 빠릅니다. 나는 단위 테스트만큼 빠르다는 것을 알기에 충분한 통합 테스트를 작성했습니다.
내가 알아 낸 웹을 통해보고 된 후 언급 한 광산과 매우 유사한 아이디어가 있다는 것을 여기 와 거기는 . 이 아이디어에 대해 어떻게 생각하십니까?
편집하다
디자인이 좋은 예에 대한 질문에 대답했지만 다음 요구 사항에 대해 큰 리팩터링이 필요했습니다.
처음에는 특정 명령을 실행하기위한 몇 가지 요구 사항이있었습니다. 확장 가능한 명령 파서를 작성했습니다.이 명령은 일종의 명령 프롬프트에서 명령을 구문 분석하고 모델에서 올바른 명령 프롬프트를 호출했습니다. 결과는 뷰 모델 클래스로 표시되었습니다.
여기에는 아무런 문제가 없었습니다. 모든 클래스는 서로 독립적이었고 새 명령을 쉽게 추가하고 새 데이터를 표시 할 수있었습니다.
다음 요구 사항은 모든 명령에 자체 뷰 표현이 있어야한다는 것입니다. 명령 결과의 미리보기입니다. 새로운 요구 사항에 맞는 더 나은 디자인을 달성하기 위해 프로그램을 재 설계했습니다.
이제는 모든 명령에 자체 뷰 모델이 있으므로 자체 미리보기가 있기 때문에 좋았습니다.
문제는 명령 구문 분석기가 명령의 토큰 기반 구문 분석을 사용하도록 변경되었으며 명령 실행 기능에서 제거되었다는 것입니다. 모든 명령에는 자체 뷰 모델이 있으며 데이터 뷰 모델은 표시해야 할 데이터를 알고있는 것보다 현재 명령 뷰 모델 만 알고 있습니다.
이 시점에서 내가 알고 싶은 것은 새로운 디자인이 기존 요구 사항을 위반하지 않는 경우입니다. 합격 시험을 변경할 필요가 없었습니다. 거의 모든 단위 테스트를 리팩토링하거나 삭제해야했는데, 이는 엄청난 작업이었습니다.
여기서 보여 드리고 싶은 것은 개발 과정에서 자주 발생하는 일반적인 상황입니다. 기존 디자인이나 새로운 디자인에는 아무런 문제가 없었으며 요구 사항에 따라 자연스럽게 바뀌 었습니다. 어떻게 이해했는지, 이것이 TDD의 장점 중 하나는 디자인이 발전한다는 것입니다.
결론
모든 답변과 토론에 감사드립니다. 이 토론을 요약하면 다음 프로젝트에서 테스트 할 접근법을 생각했습니다.
- 우선 항상 항상했던 것처럼 구현하기 전에 모든 테스트를 작성합니다.
- 요구 사항에 대해서는 처음에 전체 프로그램을 테스트하는 승인 테스트를 작성합니다. 그런 다음 요구 사항을 구현해야하는 구성 요소에 대한 통합 테스트를 작성합니다. 이 요구 사항을 구현하기 위해 다른 구성 요소와 밀접하게 작동하는 구성 요소가 있으면 두 구성 요소를 함께 테스트하는 통합 테스트도 작성합니다. 마지막으로 알고리즘이나 순열이 높은 다른 클래스 (예 : 직렬 변환기)를 작성 해야하는 경우이 특정 클래스에 대한 단위 테스트를 작성합니다. 다른 모든 클래스는 테스트되지 않고 단위 테스트가 수행됩니다.
- 버그의 경우 프로세스를 단순화 할 수 있습니다. 일반적으로 버그는 하나 또는 두 개의 구성 요소로 인해 발생합니다. 이 경우 버그를 테스트하는 구성 요소에 대해 하나의 통합 테스트를 작성합니다. 알고리즘과 관련이 있다면 단위 테스트 만 작성합니다. 버그가 발생하는 구성 요소를 찾기가 쉽지 않으면 버그를 찾기 위해 승인 테스트를 작성합니다. 이는 예외입니다.