<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>octopus_puffer.log</title>
        <link>https://velog.io/</link>
        <description>반갑습니다</description>
        <lastBuildDate>Wed, 06 Jan 2021 05:17:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>octopus_puffer.log</title>
            <url>https://images.velog.io/images/octopus_puffer/profile/38b26b92-0cdb-482d-91a0-19b195ed3766/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. octopus_puffer.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/octopus_puffer" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[test]]></title>
            <link>https://velog.io/@octopus_puffer/test</link>
            <guid>https://velog.io/@octopus_puffer/test</guid>
            <pubDate>Wed, 06 Jan 2021 05:17:57 GMT</pubDate>
            <description><![CDATA[<p>:heart: ❤❤❤</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[음....]]></title>
            <link>https://velog.io/@octopus_puffer/umm</link>
            <guid>https://velog.io/@octopus_puffer/umm</guid>
            <pubDate>Wed, 06 Jan 2021 05:17:31 GMT</pubDate>
            <description><![CDATA[<p>:heart:</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Test-Driven Development]]></title>
            <link>https://velog.io/@octopus_puffer/Test-Driven-Development</link>
            <guid>https://velog.io/@octopus_puffer/Test-Driven-Development</guid>
            <pubDate>Wed, 06 Jan 2021 04:46:54 GMT</pubDate>
            <description><![CDATA[<h1 id="test-driven-development">Test-Driven Development</h1>
<h3 id="tdd">TDD</h3>
<ul>
<li>미국의 소프트웨어 엔지니어인 켄트 벡이 제작</li>
<li>익스트림 프로그래밍 창시자</li>
</ul>
<p><img src="./img/20201224_105214.png" alt="img"></p>
<h3 id="익스트림-프로그래밍">익스트림 프로그래밍?</h3>
<ul>
<li><strong>요구사항이 급변하는 분야에 적합한 개발 방법론</strong></li>
<li>기존의 waterfall 방식의 방법론이 대세를 이뤘지만,<ul>
<li>시장 상황이 복잡해지고, 비즈니스가 다양해진 방식에 <strong>waterfall 방식으로 다루기 어려운 것들이 생겼다</strong></li>
<li>이런 상황에선 어떤 방식을 사용하는 것이 효율적일까? 의 생각에서 나온 방식</li>
</ul>
</li>
</ul>
<h4 id="익스트림-프로그래밍을-실천하기-위한-여러-가지-방법">익스트림 프로그래밍을 실천하기 위한 여러 가지 방법</h4>
<ul>
<li>여러가지가 있음<ul>
<li>Customer Tests</li>
<li>Code Review</li>
<li>Simple Design</li>
<li>Small Releases</li>
<li><strong>Test-Driven Development</strong></li>
<li>Pair Programming</li>
<li>.....</li>
</ul>
</li>
<li>여러가지 다 좋았지만, TDD가 가지고 있는 장점 및 함의가 좋아서 여러 분야에서 이것만 떼서 사용하고 있을 정도로 대중적이고 중요한 방법론이 <strong>TDD.</strong></li>
</ul>
<h2 id="whattdd가-무엇인가">WHAT(TDD가 무엇인가)</h2>
<ul>
<li><p><strong>테스트 코드를 먼저 짜고 그 이후에 코드를 짜는 방법</strong></p>
</li>
<li><p>지금까지의 방식</p>
<ol>
<li>디자인</li>
<li>코드 개발</li>
<li>테스트</li>
<li>이후 설계(디자인)수정<ul>
<li>재사용이 어렵고, 관리가 어려워져 유지보수를 어렵게 만듬.</li>
<li>작은 기능의 부분 수정에도 모든 부분을 테스트해야 하므로 전체적인 버그를 검출하기 어려워짐.</li>
</ul>
</li>
</ol>
</li>
</ul>
<ul>
<li><p>TDD의 방식</p>
<ol>
<li>요구사항 파악</li>
<li>테스트 코드 작성</li>
<li>테스트 코드가 돌아가도록 실제 코드 작성</li>
<li>리팩토링</li>
<li>다시 1번부터</li>
</ol>
</li>
</ul>
<p>이런 방식은 <strong>Cycle</strong>로 표현된다.</p>
<p><img src="./img/20201224_110318.png" alt="img"></p>
<ul>
<li><strong>RED</strong> :arrow_forward: test를 작성함. 대신, 그 test는 아직 구현이 없기 때문에 실패할 것.</li>
<li><strong>GREEN</strong> :arrow_forward: 이를 위해 test를 통과하는 최소한의 구현(실제 코드)을 만듬.</li>
<li><strong>REFACTOR</strong> :arrow_forward: test를 통과하는 보장된 코드가 있기 때문에, 심리적으로 안정된 상태에서 리팩토링을 함.</li>
</ul>
<h4 id="간단한-diagram이지만-테스트-코드를-작성하는-능력이-없다면-어렵고-복잡하다">간단한 Diagram이지만, 테스트 코드를 작성하는 능력이 없다면 어렵고 복잡하다.</h4>
<h2 id="why왜-tdd를-해야-할까">WHY(왜 TDD를 해야 할까)</h2>
<ul>
<li>굳이 왜 많은 테스트 케이스를 작성하고 그거에 따른 테스트 코드부터 작성해야 할까?</li>
<li>그냥 기존의 방식처럼 만들고, 테스트를 해보면 되는거 아닐까? 시간이 더 드는거 아닌가?<ul>
<li><strong>기존의 방식</strong> :arrow_forward: 처음부터 모든것을 다 예측해야 하는 문제점이 생김. <ul>
<li>이 프로그램을 어떻게 발전 시켜야 할지, 어떤 요구사항이 생길지를 다 예측해서 이를 다 수용할 수 있는 프로그램을 제작해야 함.</li>
</ul>
</li>
<li><strong>현재의 방식</strong> :arrow_forward: 시장상황도 너무 복잡해지고, 이에 따라 바뀌어야 할 것도 많음.<ul>
<li><strong>Over Engineering</strong> :arrow_forward: 시스템이 무거워지고, 유지보수가 어려워짐.</li>
<li>이를 해결하고자 Simple하고, 최소한의 것들로 만들어야 하는 것이 중요해짐.</li>
</ul>
</li>
<li><strong>해외의 방식</strong> :arrow_forward: <strong>TDD를 하지 못하면 해외 취업이 어려움!</strong></li>
<li><strong>개발자의 방식</strong> :arrow_forward: 오픈소스에 Contribute를 하기 위해서는 안에 돌아가는 Test Code가 있고, 이를 이해한 뒤 코드를 짤 수 있기 때문에 Test Code에 대해 아는 것도 중요해짐.</li>
</ul>
</li>
<li><strong>TDD의 장점</strong><ol>
<li>동작하는 코드에 대한 자신감 (Clean Code that works)<ul>
<li>옛날에는 이 코드가 돌아갈지 안 돌아갈 지 몰랐다. 일단 작성하고 난 뒤 테스트를 했음.</li>
<li>일단 작동이 되는걸 보고, 어떤 테스트 케이스를 넣더라도 실행이 된다는 보장.<ul>
<li>그만큼 test case를 많이 만들어야 함.</li>
<li>어떤 test case가 있을 지 미리 생각해야 함.</li>
</ul>
</li>
</ul>
</li>
<li>과도한 설계를 피하고, 간결성 증대</li>
<li>실행 가능한 문서를 가짐<ul>
<li>software에서 문서화는 정말 중요(다른 사람과 협업을 하기 위한 중요 요소)</li>
<li>이를 계속 작성하기란 어려운데, test code 자체가 문서로써 작용할 수 있음.</li>
</ul>
</li>
<li>디자인적 유연함, 의존성 관리 편함<ul>
<li>test code는 독립되어 있고, 분리되어 있는 것.<ul>
<li>이를 위해서 자연스럽게 독립적이게 됨.</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><strong>TDD의 단점</strong><ol>
<li>생산성의 저하<ul>
<li>개발 속도가 느려지기 때문.</li>
<li>처음부터 2개의 코드를 짜야 하고, 중간 중간 테스트를 하면서 고쳐나가야 함.</li>
</ul>
</li>
</ol>
</li>
</ul>
<h2 id="note">Note</h2>
<h3 id="tdd가-어려운-이유">TDD가 어려운 이유</h3>
<ol>
<li>이제까지 개발하던 방식을 많이 바꿔야 함.</li>
<li>TDD는 이렇게 해야 한다는 선입견이 있음.<ul>
<li>반드시 툴을 써서 개발해야 한다는 선입견(이런 규칙에 얽매이는 것은 애자일 방식이 X)</li>
</ul>
</li>
</ol>
<h3 id="tdd를-잘-하는-방법">TDD를 잘 하는 방법</h3>
<ol>
<li>Unit Test부터 연습하고 TDD를 숙련해야 함.</li>
<li>어떻게 하면 테스트 비용을 낮출 수 있을까를 고민해야 함.</li>
</ol>
<p>java 단위 테스트 프레임워크 :arrow_forward: JUnit</p>
<h4 id="출처">출처</h4>
<hr>
<p><a href="https://wooaoe.tistory.com/33">https://wooaoe.tistory.com/33</a></p>
<p><a href="https://youtu.be/meTnd09Pf_M">https://youtu.be/meTnd09Pf_M</a></p>
<p><a href="https://youtu.be/xs-yhBlkbbQ">https://youtu.be/xs-yhBlkbbQ</a></p>
]]></description>
        </item>
    </channel>
</rss>