{"id":22868457,"url":"https://github.com/xpdojo/docs","last_synced_at":"2026-02-12T02:36:39.509Z","repository":{"id":138406359,"uuid":"351135308","full_name":"xpdojo/docs","owner":"xpdojo","description":"Extreme Programming","archived":false,"fork":false,"pushed_at":"2021-11-29T15:11:58.000Z","size":3562,"stargazers_count":12,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-06T15:53:28.569Z","etag":null,"topics":["agile","extreme-programming","tdd","tdd-kata"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xpdojo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-03-24T15:42:17.000Z","updated_at":"2023-11-29T06:00:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"a345b1f7-eb10-4133-b776-5d77426159be","html_url":"https://github.com/xpdojo/docs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xpdojo%2Fdocs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xpdojo%2Fdocs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xpdojo%2Fdocs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xpdojo%2Fdocs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xpdojo","download_url":"https://codeload.github.com/xpdojo/docs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246458022,"owners_count":20780675,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agile","extreme-programming","tdd","tdd-kata"],"created_at":"2024-12-13T12:34:59.598Z","updated_at":"2026-02-12T02:36:34.484Z","avatar_url":"https://github.com/xpdojo.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# TDD\n\n- [TDD](#tdd)\n  - [참고 자료](#참고-자료)\n    - [Book](#book)\n    - [Article](#article)\n    - [Video](#video)\n    - [Language](#language)\n      - [Java](#java)\n      - [Go](#go)\n      - [Javascript](#javascript)\n      - [Python](#python)\n    - [같이 보기](#같이-보기)\n  - [개념](#개념)\n    - [TDD 리듬(Rhythm)](#tdd-리듬rhythm)\n  - [관련 용어](#관련-용어)\n    - [간접 입력 (Indirect Input)](#간접-입력-indirect-input)\n    - [간접 출력 (Indirect Output)](#간접-출력-indirect-output)\n    - [`SUT`](#sut)\n    - [`DOC`](#doc)\n    - [Test Fixture (Test Context)](#test-fixture-test-context)\n    - [Test Suite](#test-suite)\n    - [테스트 유형](#테스트-유형)\n      - [Unit Test](#unit-test)\n      - [Integration Test](#integration-test)\n      - [Functional Test](#functional-test)\n      - [End to End Test](#end-to-end-test)\n      - [Acceptance Test](#acceptance-test)\n      - [Customer Test](#customer-test)\n    - [테스트 더블 test double](#테스트-더블-test-double)\n      - [Dummy](#dummy)\n      - [Fake](#fake)\n      - [Stub](#stub)\n      - [Spy](#spy)\n      - [Mock](#mock)\n\n## 참고 자료\n\n### Book\n\n| 제목                                                                                                  | 저자                       | 링크                                                                              |\n| ----------------------------------------------------------------------------------------------------- | -------------------------- | --------------------------------------------------------------------------------- |\n| [소프트웨어 장인](books/the-software-craftsman.md)                                                    | 산드로 만쿠소              | [9791186659489](https://www.gilbut.co.kr/book/view?bookcode=BN001288)             |\n| 테스트 주도 개발 - [Money 예제](https://github.com/tdd-kata/java/blob/main/money-kent-beck/README.md) | 켄트 벡                    | [9788966261024](https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=9788966261024)   |\n| xUnit 테스트 패턴                                                                                     | 제라드 메스자로스          | [Website for Book](http://xunitpatterns.com/index.html)                           |\n| [리팩터링 2판](books/refactoring-2.md)                                                                | 마틴 파울러                | [9791162242742](https://www.hanbit.co.kr/store/books/look.php?p_code=B6952616555) |\n| 패턴을 활용한 리팩터링                                                                                | 조슈아 케리에브스키        | [9788991268920](https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=9788991268920)   |\n| 코드 컴플리트 2                                                                                       | 스티브 맥코넬              | [9791158390600](https://wikibook.co.kr/code-complete-2/)                          |\n| 테스트 주도 개발로 배우는 객체 지향 설계와 실천                                                       | 스티브 프리먼, 냇 프라이스 | [9788966260843](http://ebook.insightbook.co.kr/book/19)                           |\n| 클린 코드                                                                                             | 로버트 C. 마틴             | [9788966262724](http://ebook.insightbook.co.kr/book/79)                           |\n| 클린 코더                                                                                             | 로버트 C. 마틴             | [9788960778818](http://www.acornpub.co.kr/book/clean-coder)                       |\n| 클린 소프트웨어                                                                                       | 로버트 C. 마틴             | [9791185890852](https://jpub.tistory.com/682)                                     |\n\n### Article\n\n- [Mocks, Fakes, Stubs and Dummies](http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html) - xUnit Patterns\n- [The different types of software testing](https://www.atlassian.com/continuous-delivery/software-testing/types-of-software-testing) - Atlassian CI/CD\n- [Test 관련 용어 정리](https://johngrib.github.io/wiki/test-terms/) - 이종립 (기계인간 John Grib)\n- [정말로 테스트 대역이 필요한가](https://gyuwon.github.io/blog/2020/05/10/do-you-really-need-test-doubles.html) - 이규원\n- [TestDouble](https://www.martinfowler.com/bliki/TestDouble.html) - Martin Fowler\n- [Mocks Aren't Stubs](https://www.martinfowler.com/articles/mocksArentStubs.html) - Martin Fowler ([번역](https://sites.google.com/a/jabberstory.net/testing/mocksArentStubs))\n\n### Video\n\n| 제목                                       | 저자                                                 | 링크                                                                                                   |\n| ------------------------------------------ | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |\n| TDD 리팩토링                               | 자바지기 박재성                                      | [Youtube](https://youtu.be/bIeqAlmNRrA)                                                                |\n| 현실 세상의 TDD                            | 이규원                                               | [fastcampus](https://www.fastcampus.co.kr/dev_red_ygw), [GitHub](https://github.com/gyuwon/TDDHandsOn) |\n| 자바와 JUnit을 활용한 실용주의 단위 테스트 | 제프 랭어, 앤디 헌트, 데이브 토마스                  | [9791160508383](https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=9791160508383)                        |\n| JUnit in Action (3rd)                      | 피터 타치브, 펠리페 레미, 빈센트 마솔, 게리 그레고리 | [9781617297045](https://www.manning.com/books/junit-in-action-third-edition)                           |\n\n### Language\n\n#### Java\n\n| 제목                                     | 저자                            | 링크                                                                                |\n| ---------------------------------------- | ------------------------------- | ----------------------------------------------------------------------------------- |\n| 테스트 주도 개발 시작하기                | 최범균                          | [9788980783052](https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=9788980783052)     |\n| Test Driven Development with Spring Boot | Sannidhi Jalukar, Madhura Bhave | [Youtube](https://youtu.be/s9vt6UJiHg4)                                             |\n| Java TDD 실습                            | 아샬                            | [Youtube](https://www.youtube.com/playlist?list=PLbdtsbZUwdeRirBYnWrMSvKYS4CcmXCeU) |\n\n#### Go\n\n| 제목                | 저자        | 링크                                                              |\n| ------------------- | ----------- | ----------------------------------------------------------------- |\n| Learn Go with Tests | Chris James | [Git Book](https://github.com/MiryangJung/learn-go-with-tests-ko) |\n\n#### Javascript\n\n| 제목                                              | 저자   | 링크                                    |\n| ------------------------------------------------- | ------ | --------------------------------------- |\n| 프론트엔드에서 TDD가 가능하다는 것을 보여드립니다 | 최수형 | [Youtube](https://youtu.be/L1dtkLeIz-M) |\n\n#### Python\n\n| 제목                                | 저자             | 링크                                                                            |\n| ----------------------------------- | ---------------- | ------------------------------------------------------------------------------- |\n| 우아하게 준비하는 테스트와 리팩토링 | 한성민           | [Youtube](https://youtu.be/S5SY2pkmOy0)                                         |\n| 클린 코드를 위한 테스트 주도 개발   | 해리 J.W. 퍼시벌 | [9788994774916](https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=9788994774916) |\n\n### 같이 보기\n\n| 제목                           | 저자                           | 링크                                                                                                                |\n| ------------------------------ | ------------------------------ | ------------------------------------------------------------------------------------------------------------------- |\n| 함께 자라기                    | 김창준                         | [9788966262373](http://ebook.insightbook.co.kr/book/65)                                                             |\n| 실용주의 프로그래머            | 데이비드 토머스, 앤드류 헌트   | [9788966261031](https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=9788966261031)                                     |\n| 실용주의 사고와 학습           | 앤디 헌트                      | [9788992939362](https://wikibook.co.kr/pragmatic-thinking-and-learning/)                                            |\n| 프로그래머의 길, 멘토에게 묻다 | 데이브 후버, 애디웨일 오시나이 | [8991268803](https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8991268803)                                           |\n| 클린 아키텍처                  | 로버트 C. 마틴                 | [9788966262472](https://blog.insightbook.co.kr/2019/08/08/%ED%81%B4%EB%A6%B0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98/) |\n| Clean Architecture and Design  | 로버트 C. 마틴                 | [amara (한글 자막)](https://amara.org/ko/videos/0AtjY87egE3m/ko/796487/)                                            |\n| 객체 지향의 사실과 오해        | 조영호                         | [9788998139766](https://wikibook.co.kr/object-orientation/)                                                         |\n| 오브젝트                       | 조영호                         | [9791158391409](https://wikibook.co.kr/object/)                                                                     |\n\n## 개념\n\n\u003e \"TDD의 이름 자체에 '테스트'가 들어 있기는 하지만 사실 **TDD는 설계에 대한 실행 관례다.**\" - \u003c소프트웨어 장인\u003e\n\n![tdd-global-lifecycle](image/tdd-global-lifecycle.png)\n\n_출처: [위키피디아](https://en.wikipedia.org/wiki/Test-driven_development)_\n\n### TDD 리듬(Rhythm)\n\n\u003c테스트 주도 개발\u003e, 켄트 벡\n\n1. 재빨리 **작은** 테스트를 하나 추가합니다.\n2. 🔴 모든 테스트를 실행하고, 실패하는 것을 확인합니다.\n3. 코드에 변화를 줍니다.\n4. 🟢 모든 테스트를 실행하고, 성공하는 것을 확인합니다.\n   - 가짜로 구현하기: 상수로 반환하게 만들고 진짜 코드를 얻을 때까지 단계적으로 상수를 변수로 바꾸어 갑니다.\n   - 명백한 구현 사용하기: 실제 구현을 입력합니다.\n   - 삼각측량(triangulation): 두 개 이상의 예제를 통해 코드를 일반화합니다. 어떻게 리팩토링해야 하는지 전혀 감이 안 올 때만 삼각측량을 사용합니다.\n5. 🔵 중복을 제거하기 위해 리팩토링합니다.\n\n## 관련 용어\n\n### 간접 입력 (Indirect Input)\n\n입력된 의존성 인터페이스를 통한 입력을 말합니다(의존성 관점에서는 출력).\nSUT의 동작이 SUT에서 사용하는 다른 서비스 컴포넌트에서 리턴하는 값에 영향을 받을 때\n이런 값들을 SUT의 간접 입력이라 합니다.\n\n### 간접 출력 (Indirect Output)\n\n입력된 의존성 인터페이스를 통한 출력을 말합니다(의존성 관점에서는 입력).\nSUT의 동작에 따른 효과를 public 애플리케이션 인터페이스(API)에서는 볼 수 없고\n다른 시스템이나 애플리케이션 컴포넌트에서만 볼 수 있을 때 이런 효과를 SUT의 간접 출력이라 합니다.\n\n### `SUT`\n\n[System Under Test](http://xunitpatterns.com/SUT.html).\n\"테스트하려는 대상\"을 의미합니다.\nSUT는 항상 테스트를 기준으로 정의됩니다.\n단위 테스트를 작성할 때 SUT는 테스트하려는 클래스(CUT), 오브젝트(OUT) 또는 메서드(MUT)가 됩니다.\n[고객 테스트](https://explainagile.com/agile/xp-extreme-programming/practices/customer-tests/)를 작성할 때\nSUT는 아마도 애플리케이션 전체(AUT)이거나 적어도 주요 서브 시스템일 것입니다.\n애플리케이션에서 특정 테스트의 검증 대상이 아닌 부분도 여전히\n의존 컴포넌트(`DOC`)로서 테스트와 연관돼 있을 수 있습니다.\n\n### `DOC`\n\n[depended-on component](http://xunitpatterns.com/DOC.html).\nSUT가 의존하는 개별 클래스나 느슨한 컴포넌트(large-grained component)를 말합니다.\n의존은 보통 메소드 호출을 통해 위임하는 방식 중 하나입니다.\n테스트 자동화에서 완벽한 테스트 커버리지를 얻으려면 주로 DOC와 SUT 간의 상호작용을 보고 제어할 수 있어야 합니다.\n\n### Test Fixture (Test Context)\n\n테스트 픽처란 SUT의 동작을 검증하기 위해 테스트를 실행하려 할 때 갖춰야 하는 모든 것을 말합니다.\n\n### Test Suite\n\n테스트 스위트란 같이 실행하고 싶은 테스트들의 모음(composite)에 이름을 붙여주는 방법을 말합니다.\n\n### [테스트 유형](https://www.atlassian.com/continuous-delivery/software-testing/types-of-software-testing)\n\n| -                                     | Unit Test                  | Acceptance Test                        |\n| ------------------------------------- | -------------------------- | -------------------------------------- |\n| 관점                                  | 최종 클라이언트            | 프로그래머                             |\n| 검증 대상                             | 시스템의 일부(하위 시스템) | 배치된 시스템                          |\n| 안정감 (전체 시스템 이상 여부 신뢰도) | 상대적으로 낮음            | 높음                                   |\n| 비용 (작성/관리/실행)                 | 낮음                       | 높음                                   |\n| 피드백 품질                           | 높음                       | 낮음 (현상은 드러나지만 원인은 숨겨짐) |\n\n_출처: 현실 세상의 TDD - 이규원_\n\n#### Unit Test\n\n단위 테스트는 애플리케이션 내부의 한 부분이 의도한 대로 동작하는지 검증합니다.\n\n#### Integration Test\n\n통합 테스트는 애플리케이션에서 사용하는 여러 모듈 또는 서비스가 함께 잘 작동하는지 확인합니다.\n여기서 모듈은 모든 모듈이 아닌 해당 테스트가 의존하는 모듈만을 일컫습니다.\n통합 테스트는 단순히 데이터베이스를 쿼리 할 수 ​​있는지 확인합니다.\n\n#### Functional Test\n\n기능 테스트는 애플리케이션 최종 사용자의 기능에 대한 블랙박스 테스트를 말합니다.\n\n#### End to End Test\n\n통합 테스트가 몇 가지 애플리케이션 간 동작을 테스트한다면\nE2E 테스트는 소프트웨어가 사용자의 단계별 행동을 그대로 시뮬레이션하고 테스트합니다.\n\n#### Acceptance Test\n\n인수 테스트(승인 테스트)는 시스템이 비즈니스 요구 사항을 충족하는지 확인하기 위해 수행되는 테스트입니다.\n애플리케이션이 프로그래머가 생각한 대로가 아닌 고객이 의도한 대로 동작하는 것을 증명하는 것이 목적입니다.\n\n#### Customer Test\n\n고객 테스트는 전체 시스템 중에서 눈에 보이는 기능의 일부분에 대한 동작을 검증하는 테스트입니다.\n\n### [테스트 더블](http://xunitpatterns.com/Test%20Double.html) test double\n\n- 테스트 코드를 작성할 때 실제 DOC를 사용할 수 없다면, DOC 대신 테스트 더블로 대체할 수 있습니다.\n- 테스트 더블은 실제 DOC와 똑같이 행동하지 않아도 되며, 똑같은 API만 제공하면 됩니다.\n- 테스트 더블은 테스트 목적을 위해 프로덕션 객체를 다른 무언가로 교체하는 모든 경우를 표현하는 용어입니다.\n\n#### Dummy\n\nSUT 메서드 인자에 구현이 전혀 안 돼 있는 객체를 전달합니다.\nSUT 준비를 위해 해결되어야 하는 의존성이 테스트 대상 논리에 의해 사용되지 않는 경우에 의존 요소를 대신하는 테스트 대역입니다.\n\n#### Fake\n\n실제로 작동하는 구현이지만 일반적으로 프로덕션에는 적합하지 않은 꼼수(shortcut)를 사용합니다.\n([InMemoryTestDatabase](https://www.martinfowler.com/bliki/InMemoryTestDatabase.html)가 좋은 예)\n실행할 수 없는 테스트를 빠르게 실행하기 위해 사용됩니다.\n\n#### Stub\n\n테스트 중에 호출되면 미리 준비된 결과를 제공합니다.\n즉, 실제 객체를 테스트용 객체로 교체해 SUT에 원하는 **간접 입력**을 보냅니다.\n\n#### Spy\n\nSUT로부터 다른 컴포넌트로의 **간접 출력**을 갈무리했다가 뒤에 테스트에서 검증합니다.\n\n#### Mock\n\n호출했을 때 사전에 정의된 명세대로의 결과를 돌려주도록 미리 프로그램 되어 있습니다.\n예상치 못한 호출이 있을 경우 예외를 던질 수 있으며, 모든 호출이 예상된 것이었는지 확인할 수 있습니다.\nSUT 내부의 행위를 검증합니다.\nSUT의 **간접 출력**을 검증하기 위해 사용됩니다.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxpdojo%2Fdocs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxpdojo%2Fdocs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxpdojo%2Fdocs/lists"}