bluesky / prototype 프로젝트에서 단위 테스트 또는 통합 테스트를 먼저 작성할지 평가


11

내가 최근에 발견 한 것은 다음 유형의 프로젝트를 수행 할 때입니다.

  • 프로젝트를 시작할 때
  • MVP / 프로토 타입 작업
  • 완전히 정의되지 않은 기능 추가
  • 소규모 프로젝트에서 작업

참고로, 현재 주석과 모든 공백을 포함하여 ~ 1k 줄의 코드가있는 Python 프로젝트를 작성 중입니다.

먼저 통합 테스트를 작성하고 코드 작업 다음 API가 다소 강화되면 실제로 단위 테스트를 추가하는 작업이 훨씬 쉬워졌습니다 . 내 main기능에서 실행할 수있는 테스트 유형으로 말하면, 다른 것보다 "종료"입니다.

이는 API가 상당히 빠르게 변할 때 단위 테스트가 실제로 성가시기 때문에 위의 기준 중 하나 이상과 일치하는 프로젝트에서 작업하는 경우가 종종 있습니다.

이러한 접근 방식이 좋은 접근 방식입니까? 이러한 유형의 프로젝트에 대해 단위 테스트 또는 통합 테스트로 시작할지 여부를 결정할 때 고려해야 할 기준은 무엇입니까? API가 더 견고 해지기 전에 이러한 종류의 프로젝트를 테스트하는 단위의 가치를 놓치고 있습니까?


6
자신에게 가장 잘 맞는 것을하십시오. 효율성을 높이기 위해 특정 방식으로 일해야한다고 말하는 사람들의 말을 듣지 마십시오. 먼저 통합 테스트를 작성하든 단위 테스트를 먼저 작성하든 상관 없습니다. 일부 프로젝트의 경우 한 가지 방법이 더 쉽고 다른 프로젝트의 경우 다른 방법이 더 쉽습니다. 설명은 하향식 디자인과 상향식 디자인의 차이 일 수 있습니다. 둘 다 유용하지만 하향식은 일반적으로 더 나은 디자인을 생성합니다.
Frank Hileman

@FrankHileman은 실제로 저의 접근 방식입니다. 그러나 궁금하기 때문에 뭔가 빠진 경우 올바른 접근 방식을 취하고 싶습니다.
enderland

비 코드 부분 : 먼저 사양에 중점을 둡니다. 시스템의 불변은 무엇입니까? 이를 수행 할 때 먼저 하위 레벨 또는 상위 레벨을 먼저 알아야합니다. 가장 중요하거나 위험한 알고리즘의 위치에 따라 다릅니다. 먼저 방해가되지 않도록하십시오. 이것이 기본적인 위험 관리입니다.
Frank Hileman

1
프로토 타입 작업의 경우 전혀 테스트를 작성하지 않아도됩니다. 프로토 타입의 목표는 작업 아이디어를 확인하는 것입니다. 프로토 타입을 구현하면 응용 프로그램의 예상 디자인을 인식하는 데 도움이됩니다.
Fabio

이를 외부 개발이라고합니다. amazon.com/dp/0321503627
Eternal21

답변:


7

API가 더 견고 해지기 전에 이러한 종류의 프로젝트를 테스트하는 단위의 가치를 놓치고 있습니까?

아뇨 , 잘 지내요

TDD의 두 가지 큰 목표는 다음과 같습니다.

  • 내부 구현이 아닌 실제 사용에 의한 인터페이스 정의 1
  • 테스트 범위 최대화

어느 쪽이든 시험 범위를 극대화 할 수 있습니다. 즉, 소규모 , 분리 된 단위 또는 대규모 의 "통합 된"단위 를 먼저 테스트하는지 여부에 관계없이 구현 전에 테스트를 작성할 수있는 옵션이 있습니다.

당신이 ( "통합")보다 높은 수준을 서면으로 얻을 것은 당신이하고있는대로, 당신의 높은 수준의 인터페이스와 상호 작용하고 있다는 확신이다, 첫번째 테스트 오히려 내부 구현보다는, 자신의 용도에 따라 기본적으로 정의했다.

동일한 효과가 될 수 크게 좋은 "의 아키텍처"와 다이어그램을 달성. 그러나 이러한 높은 수준의 테스트는 종종 다이어그램에서 놓친 부분을 드러내거나 "아키텍처"작업에서 잘못되었음을 나타 냅니다.


실제로 TDD (또는 이와 유사한 것)를 수행하지 않으면 테스트 작성 순서는 중요하지 않습니다. 인터페이스는 테스트 시점에 이미 존재하므로 테스트가 변경 될 가능성은 훨씬 적습니다 . 특정 변경 사항을 방지하는 데만 사용됩니다.

그러나 구현 하향식과 Buttom-Up 을 구축 하는 데 관심이 있다면 첫 번째 글 머리 기호는 여전히 대부분 적용됩니다. 높은 수준의 코드는 낮은 수준의 인터페이스를 정의하는 데 도움이됩니다. 반면, 저수준 인터페이스가 먼저 작성되거나 이미 존재하는 경우, 고수준 코드는 자비에 있습니다 ...


1. 이것은 완전한 TDD를 수행하지 않더라도 적용됩니다. 구현 하기 전에 1 또는 2 개의 테스트 작성하더라도 1 또는 2 개의 테스트는 인터페이스가 너무 늦기 전에 인터페이스를 정의하거나 세분화하는 데 도움이 될 수 있습니다!


1

나는 당신이 일하는 방식으로 일했습니다. 그리고 나는 당신에게 할 수 없다고 말하지 않을 것입니다. 당신이 뛸 수있는 것에 대해 경고 할 것입니다.

모든 단위 테스트가 단순히 개조 일 때 융통성있게 만드는 방법을 배우기가 어렵습니다. 그것들은 회귀 테스트에 지나지 않습니다. 리팩토링을 돕기 위해 사용한 적이 없기 때문에 실제로 리팩토링을 어렵게 만드는 테스트를 작성하는 것은 매우 쉽습니다. 이것은 TDD에 대한 모든 믿음을 잃을 때까지 통제 불능 상태가됩니다.

그러나 이미 작업 중입니다. 그만하라고 말하지 않겠습니다. 나는 처음부터 빨간색 녹색 리 팩터 사이클을 탐색하고 따를 시간이있는 다른 것을 시작하는 것이 가치가 있다고 말할 것입니다. 리팩토링을 돕기 위해 실제로 테스트를 수행해야합니다. 이 작업 방식을 숙달 할 때까지 중요한 것을 조금만 사용하십시오. 이것은 코딩하는 데 매우 다른 방법이며 익숙해집니다. 반쯤하는 것은 아무 소용이 없습니다.

그건 말했다

먼저 통합 테스트를 작성하고 코드 작업을 한 다음 API가 다소 강화되면 실제로 단위 테스트를 추가하는 작업이 훨씬 쉬워졌습니다. 주요 기능으로 실행할 수있는 테스트 유형으로 말하면 다른 것보다 "종료"됩니다.

단위 테스트는 단순히 한 클래스에서 수행되는 테스트가 아니라는 것을 이해하십시오. 작업중인 API를 다음 중 아무 것도 수행하지 않고 테스트 할 수있는 한 단위 테스트 만 수행하면됩니다.

  • 데이터베이스와 대화합니다
  • 네트워크를 통해 통신
  • 파일 시스템을 건 드리다
  • 다른 단위 테스트와 동시에 실행할 수 없습니다
  • 환경 설정 파일을 편집하는 등 환경에 특별한 작업을 수행해야합니다.

Michael Feathers : 일련의 단위 테스트 규칙

따라서 엔드 투 엔드 테스트에 둘 이상의 개체가 관련되어 있다면 괜찮습니다. 이것은 개체 테스트가 아닌 단위 테스트입니다.

전용 메소드를 더 이상 테스트 할 필요가없는 것처럼, 메소드를 사용하는 공용 메소드를 테스트하여 테스트를받는 것처럼 오브젝트는 처음에 자체 테스트 하네스에서 개발할 필요가 없습니다. 엔드-투-엔드 스토리와 무관하게 사용되는 것으로 간주 될 때만 객체를 확인하기위한 고유 한 인터페이스와 동작이있는 것처럼 취급해야합니다. 당신이 그것에 대해 조심한다면 이것은 당신이 그 객체를 공개 할 때입니다. 이렇게하면 테스트하지 않은 약속을하지 않습니다.

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