TDD : 첫 번째 단위 테스트 전에 어떤 일이 발생합니까?


17

나는 주로 TDD 이론을 이해하지만 시작하는 방법을 알 수 없습니다. 나는 개인 프로젝트에 대한 단위 테스트를 작성하고 깨달았습니다. . . 나는 무엇을 테스트하고 있는지 전혀 모른다. 어떤 대상, 어떤 기능 등

예를 들어, 가족이 집안일을 관리하는 데 도움이되는 앱을 만들고 싶다고 가정 해 봅시다. 다음은 제 생각에 몇 가지 질문입니다.이 아이디어에서 첫 번째 시험으로 어떻게 이동합니까? 시작하기 전에 얼마를 결정해야합니까, 테스트를 시작한 후에는 얼마를 결정해야합니까? 텍스트 파일 또는 데이터베이스에 데이터를 저장할지 여부는 언제 결정합니까? 시작하기 전에 사용자 승인 테스트를 받아야합니까? UI를 설계해야합니까? 사양이 있어야합니까? (이 예제 질문 중 적어도 일부는 아마도 "회색 영역"에 있음을 알고 있습니다.

첫 번째 단위 테스트를 얻는 것에 대한 제목 질문 외에도 샘플 프로젝트와 같은 프로젝트의 첫 번째 단위 테스트가 어떻게 표시되는지 예를 들어 줄 수 있습니까?


5
Nat Pryce와 Steve Freeman의 GOOS 책을 읽는 것이 좋습니다. 기능의 '얇은 조각'으로 엔드 투 엔드 테스트를 통과하는 방법에 대한 훌륭한 정보가 있습니다.
공란

답변:


6

기능 목록으로 시작하고 각 기능에 대해 사용자 스토리를 작성한 다음 각 스토리에 대해 테스트 설명을 작성합니다.

약간의 디자인에 대해 생각한 다음 테스트 설명을 선택하고 코딩을 시작하십시오.

모든 테스트가 통과 될 때까지 반복하십시오.

그렇습니다. 합격 시험은 이것의 일부로 적절한 이야기에 첨부되어야합니다.


나는 이것을 좋아한다. 기능을 나열하고 각 기능에 대한 사용자 스토리의 하위 목록을 만들고 각 사용자 스토리에 대한 테스트의 하위 목록을 만듭니다. 이 과정을 시도해 보겠습니다.
Ethel Evans

나는 개인적으로 알고 싶었던 것을 다루기 때문에 이것을 받아들이고 있지만 사람들이 Carl의 (더 많이 찬성 한) 응답을 읽을 것을 권장합니다.
Ethel Evans

18

처음부터 TDD가 디자인 에 관한 방법을 발견했습니다 . 첫 번째 테스트를 작성하기 전에 첫 번째 기능의 기능과 해당 기능이 작동하는 경우 프로그램의 모양을 고려해야합니다.

TDD를 사용하지 않는 개발자도 그것에 대해 생각해야합니다. 그러나 "그냥 뛰어 들어"무언가를 쓰기 시작할 수 있습니다. 그러나 "무언가, 무엇인가"가 항상 당신이 작성하려고 생각한 프로그램을 전달하는 길에있는 것은 아닙니다. 뭐가? 프로그램이 작동하면 어떻게 보일까요? 어떤 테스트를 통과합니까?

가족이 집안일을 관리하는 데 도움이되는 앱을 만들고 싶습니다.

멋있는. 해당 앱이 작동했다면 어떻게해야합니까? 글쎄, 아마도 사람에게 집안일을 할당 할 수있을 것입니다.

Person fred = new Person("fred")
Chore mow = new Chore("mow the lawn");
mow.assignTo(fred);
assertEquals(fred, mow.whoIsAssigned());

시작이 있습니다. 시작해야 할 곳이 아니라 시작하기에 가장 좋은 장소는 아니지만 그 장소입니다. 코드에서 지원하고자하는 것입니다 (더 나은 이름을 얻을 수는 있지만). 거기서 시작해 실패를 지켜보십시오. 통과 시키십시오. 청소해라. 오히려 헹구고 반복하십시오.


나는 모범을 사랑하지 않지만 전제에 동의합니다. 당신이 적어도 할 수 기꺼이있을 때 테스트 첫 번째 방법은 의미를 몇 가지 선행 디자인. 실제로는 스켈레톤 도메인 모델 또는 최소한 상당한 크기의 청크가 필요한 경향이 있습니다.
Aaronaught

5
여기에 선 디자인이 없습니다. 테스트의 클래스는 아직 존재하지 않아도됩니다. 디자인은 테스트에서 이루어지며 테스트를 통과하기 위해 만들어집니다.
Torbjørn 2016 년

"첫 번째 테스트를 작성하기 전에 첫 번째 기능의 기능과 해당 기능이 작동하는 경우 프로그램의 모양에 대해 생각해야합니다." 시작하기 전에 얼마를 운동해야합니까? 어떤 시점에서 단위 테스트를 통해 설계를 수행 할 수있는 이점을 과도하게 설계하고 잃어 버리고 있습니까? 나는 리팩토링에 의해 주도되어야하는 클래스 다이어그램을 원하지 않는다고 가정합니다. 그러나이 예제는 "아이디어가 있고 15 초 동안 투자 한 다음 테스트를 작성하십시오."와 같습니다. 정말 내가하고 싶은 전부입니까?
Ethel Evans

2
@Ethel 예, 그것은 여기에 넣는 것이 좋습니다 (여기 예제와 일반적으로). 테스트 할 수있는 것을 찾아 원하는 제품으로 이끈 다음 테스트를 작성하십시오.
Carl Manaster 2016 년

1
팀에서 작동하는 방식은 더 크고 다른 질문입니다. 그리고 TDD 자체는 팀 작업 조정에 대해 할 말이 없습니다. 페어 프로그래밍과 계획 게임이 도움이 될 수 있습니다. 계획 한 내용 내에서 TDD는 여전히 적용됩니다. jamesshore.com/Agile-Book/the_planning_game.html 스크럼도 팀의 작업 계획 방법에 대해 할 말이 있습니다.
Carl Manaster

5

예, TDD에이 문제가 있습니다. 이것이 제가 행동 주도 개발을 권장하는 이유입니다.

수동으로 시작하십시오. 사용자 스토리와 비슷한 것을 작성하십시오.

  • 사용자 로서
  • 나는이 때 , 쇼핑 추가를 선택 나는 제품이 배경을 투명하게 추가되고 싶지 쇼핑 카트에 담기
  • 쇼핑 경험을 중단없이 계속할 수 있도록

이제 그 목표를 지원하는 기능은 무엇입니까 ( 'So that'부분)?

  • 장바구니에 품목이 추가 된 경우
    • 사용자의 장바구니에는 새 항목이 포함됩니다
    • 장바구니의 총 아이템이 1 씩 증가합니다
    • 사용자를 리디렉션해서는 안됩니다
    • 지금 체크 아웃 옵션을 사용할 수 있습니다
  • 장바구니에 두 개의 품목이 있고 사용자가 체크 아웃하기로 선택한 경우
    • 사용자가 결제 페이지로 리디렉션됩니다
    • 두 항목 모두 표시됩니다

이것들은 모두 가능하며 수동으로 확인해야합니다.

잠시 동안이 작업을 수행하십시오. 그런 다음 훌륭한 개발자처럼 중복 부품을 자동화하는 방법을 찾아보십시오. 플랫폼에 따라 다르지만 대부분 적절한 프레임 워크를 사용할 수 있습니다.

.Net에는 웹 페이지 자동화를위한 WatiN이 있거나 API를 테스트하려면 xUnit 또는 MSpec에 Subspec을 추가하는 것이 좋습니다 (어떤 테스트 프레임 워크 에서도이 작업을 수행 할 수 있습니다) 이러한 사고 방식을 지원합니다).

Ruby에는 자동화 테스트를위한 오이와 하위 레벨 API 테스트를위한 rspec이 있습니다.

Javascript에는 jasmine 및 qUnit이 있습니다.

도트 도트 도트


오이 클론 / 또한 .NET에 대한 대안이있다 : 볼 이 StackOverflow의 질문
Carson63000

예, 있지만 개인적으로 많은 부분을 보지 못합니다. Ruby는 IronRuby의 .Net 언어입니다. IronRuby 프로젝트를 만들고 실제 오이를 사용하십시오.
George Mauer 2016 년

나는 BDD를 좋아하고 StoryQ를 사용합니다. Given / When / Then을 통해 스토리를 시나리오로 확장 할 수 있다는 점을 잊지 마십시오. 주어진 일이 생겼을 때 내가 이것을 할 때 그리고 이것 그러면 나는 이것과 이것을 기대합니다. TechEd channel9.msdn.com/Events/TechEd/NorthAmerica/2010/DPR302 에서 David Starr의 강연을 확인하고 .net storyq.codeplex.com을
Bronumski

3

이 아이디어에서 첫 번째 테스트로 어떻게 이동합니까? 시작하기 전에 얼마를 결정해야합니까, 테스트를 시작한 후에는 얼마를 결정해야합니까?

응용 프로그램을 한 입 크기의 이야기로 분류하십시오. ( "사용자는 아이콘을 두 번 클릭하고 프로그램을 시작하려고합니다."또는 "사용자는 브라우저를 열고 프로그램으로 이동하고 싶습니다."

그런 다음 이야기를 몇 가지 작업으로 분류하십시오. (예 : Eclipse에서 프로젝트 생성, 코드 리포지토리 설정) 코딩 작업을 받으면 첫 번째 테스트를 작성하십시오.

텍스트 파일 또는 데이터베이스에 데이터를 저장할지 여부는 언제 결정합니까?

확실하지 않은 경우 어느 것이 더 간단 해 보이는지 선택하십시오. (아마 텍스트 파일 일 것입니다.) 실수를했다면 리팩토링하십시오. 테스트가 제대로 구성된 경우 백엔드를 변경하고 의도하지 않은 부작용을 포착 할 수 있어야합니다.


3

나는 대답 중 어느 것도 실제의 언급이 포함 없다는 것을 놀랍군요 것은 당신이 것을 할을 오른쪽에있는 첫 번째 시험, 쓰기 전에 테스트 목록을 만듭니다 . 테스트 목록은 다른 답변에서 언급 한 스토리 작성 및 디자인 단계에 의해 제공되며 찾고있는 테스트 작성의 직접적인 전조입니다.

TDD에 대한 자세한 내용은 Kent Beck의 테스트 기반 개발을 권장 합니다. 또한 프로세스의 모든 단계에서 Kent의 설명과 함께 순수한 TDD 스타일의 중요하지 않은 라이브러리를 개발 한 TDD 스크린 캐스트 를 보유 하고 있습니다. 나는 그것이 (필요로) 고려 된 환경에서 이루어 지더라도 실제로 TDD의 훌륭한 예라고 생각합니다.


0

첫 번째 단위 테스트 전에 어떤 일이 일어나고 싶은지 생각한 다음 어떻게 테스트 할 것인지 생각합니다. 그런 다음 해당 테스트를 작성하고 실패한 것을 확인하고 통과시키는 코드를 구현하십시오.

헹굼, 반복 등

나를 위해, 그것은 당신이 그것을 테스트하는 방법이 중요하다는 것을 생각하고 그것이 디자인을 이끌 수있는 것입니다.

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