728x90
๐น ๊ธฐ์กด์๋ ๋จ์ ํ ์คํธ๋ ์๊ธฐ ํ๋ก๊ทธ๋จ์ด '๋์๊ฐ๋ค'๋ ์ฌ์ค๋ง ํ์ธํ๋ ์ผํ์ฑ ์ฝ๋์ ๋ถ๊ณผํ๋ค. ํด๋์ค์ ๋ฉ์๋๋ฅผ ๊ณต๋ค์ฌ ๊ตฌํํ ํ ์์ ์ฝ๋๋ฅผ ๊ธ์กฐํด ํ ์คํธ๋ฅผ ์ํํ๋๋ฐ ๋๊ฐ๋ ๊ฐ๋จํ ๋๋ผ์ด๋ฒ ํ๋ก๊ทธ๋จ์ ๊ตฌํํด ์์ ์ด ์ง ํ๋ก๊ทธ๋จ์ ์๋์ผ๋ก ์คํํ๋ค.
๐ป TDD(Test Driven Development)
โฝ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ (์ค์ ์ฝ๋๋ฅผ ์ง๊ธฐ ์ ์ ๋จ์ ํ ์คํธ๋ถํฐ ์ง๋ผ)
โฝ ์ ์์ผ๊ณผ TDD ๋ํ์ ๋จ์ ํ ์คํธ๋ฅผ ์๋ํํ๋ ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ด๋ฏธ ๋ง์์ก์ผ๋ฉฐ ์ ์ ๋์ด๋๋ ์ถ์ธ์ด๋ค.
๊ทธ๋ฌ๋ ๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ ๋๋ก ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ์ข ๋ ์ค์ํ ์ฌ์ค์ ๋์ณ๋ฒ๋ ธ๋ค.
TDD ๋ฒ์น ์ธ ๊ฐ์ง
- ์ฒซ ๋ฒ์งธ ๋ฒ์น
- ์คํจํ๋ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ ๋๊น์ง ์ค์ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋๋ค.
- ๋ ๋ฒ์งธ ๋ฒ์น
- ์ปดํ์ผ์ ์คํํ์ง ์์ผ๋ฉด์ ์คํ์ด ์คํจํ๋ ์ ๋๋ก๋ง ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ค.
- ์ธ ๋ฒ์งธ ๋ฒ์น
- ํ์ฌ ์คํจํ๋ ํ
์คํธ๋ฅผ ํต๊ณผํ ์ ๋๋ก๋ง ์ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- ์ ์ธ ๊ฐ์ง ๊ท์น์ ๋ฐ๋ฅด๋ฉด ๊ฐ๋ฐ๊ณผ ํ ์คํธ๊ฐ ๋๋ต 30์ด ์ฃผ๊ธฐ๋ก ๋ฌถ์ธ๋ค.
- ํ ์คํธ ์ฝ๋์ ์ค์ ์ฝ๋๊ฐ ํจ๊ป ๋์ฌ๋ฟ๋๋ฌ ํ ์คํธ ์ฝ๋๊ฐ ์ค์ ์ฝ๋๋ณด๋ค ๋ถ๊ณผ ๋ช ์ด ์ ์ ๋์จ๋ค.
- ์ด๋ ๊ฒ ์ผํ๋ฉด ๋งค์ผ ์์ญ ๊ฐ, ๋งค๋ฌ ์๋ฐฑ ๊ฐ, ๋งค๋ ์์ฒ ๊ฐ์ ๋ฌํ๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ๋์ค์ง๋ง ์ค์ ์ฝ๋์ ๋ง๋จน์ ์ ๋๋ก ๋ฐฉ๋ํ ํ ์คํธ ์ฝ๋๋ ์ฌ๊ฐํ ๊ด๋ฆฌ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ๊ธฐ๋ ํ๋ค.
- ํ์ฌ ์คํจํ๋ ํ
์คํธ๋ฅผ ํต๊ณผํ ์ ๋๋ก๋ง ์ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๊นจ๋ํ ํ ์คํธ ์ฝ๋ ์ ์งํ๊ธฐ
๐น ํ ์คํธ ์ฝ๋๋ฅผ '์ง์ ๋ถ ํด๋ ๋นจ๋ฆฌ'ํ๊ธฐ ์ํด ๋ณ์ ์ด๋ฆ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ , ํ ์คํธ ํจ์๋ฅผ ๊ฐ๊ฒฐํ๊ฑฐ๋ ์์ ์ ์ด์ง ์๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ์ ์ค๊ณํ๊ฑฐ๋ ์ฃผ์ํด์ ๋ถ๋ฆฌํ์ง ์์ผ๋ฉด ํ ์คํธ๋ฅผ ํ๋ ์ํ๋ ์ค์ญ๋ณด ๋ฐฑ๋ณด ํน์ ์ง์ง ์๋ ๊ฒ๋ณด๋ค ๋ ๋ชปํ๋ค.
- ์ค์ ์ฝ๋๊ฐ ์งํํ๋ฉด ํ
์คํธ ์ฝ๋๋ ๋ณํด์ผ ํ๋ค.
- ๊ทธ๋ฐ๋ฐ ํ ์คํธ ์ฝ๋๊ฐ ์ง์ ๋ถํ๋ฉด ๋ณ๊ฒฝํ๊ธฐ ์ด๋ ต๋ค.
- ํ ์คํธ ์ฝ๋๊ฐ ๋ณต์กํ ์๋ก ์ค์ ์ฝ๋๋ฅผ ์ง๋ ์๊ฐ๋ณด๋ค ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ์๊ฐ์ด ๋ ๊ฑธ๋ฆฐ๋ค.
- ์ค์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด ๊ธฐ์กด ํ ์คํธ ์ผ์ด์ค๊ฐ ์คํจํ๊ธฐ ์์ํ๋ฉด, ์ง์ ๋ถํ ์ฝ๋๋ก ์ธํด ์คํจํ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ์ ๋ ํต๊ณผ์ํค๊ธฐ ์ด๋ ค์์ง๋ค.
- ์ ๋ฒ์ ์ ์ถ์ํ ๋๋ง๋ค ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ์ง๋ณด์ํ๋ ๋น์ฉ๋ ๋์ด๋๊ณ ์ ์ฐจ ๊ฐ๋ฐ์๋ค์ ํฐ ๋ถ๋ง์ผ๋ก ์๋ฆฌ์ก๋๋ค.
- ํ์ง๋ง ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ๊ฐ๋ฐ์๋ ์์ ์ด ์์ ํ ์ฝ๋๊ฐ ์ ๋๋ก ๋๋์ง ํ์ธํ ๋ฐฉ๋ฒ์ด ์๋ค. ์ด์ชฝ์ ์์ ํด๋ ์ ์ชฝ์ด ์์ ํ๋ค๋ ์ฌ์ค์ ๊ฒ์ฆํ์ง ๋ชปํ๋ค. ๊ทธ๋์ ๊ฒฐํจ๋ฅ ์ ๋์์ง๊ธฐ ์์ํ๋ค.
- ์๋ํ์ง ์์ ๊ฒฐํจ ์๊ฐ ๋ง์์ง๋ฉด ๊ฐ๋ฐ์๋ ๋ณ๊ฒฝ์ ์ฃผ์ ํ๋ค.
- ๋ณ๊ฒฝํ๋ฉด ๋๋ณด๋ค ํด๊ฐ ํฌ๋ค ์๊ฐํด ๋ ์ด์ ์ฝ๋๋ฅผ ์ ๋ฆฌํ์ง ์๋๋ค.
- ๊ทธ๋ฌ๋ฉด์ ์ฝ๋๊ฐ ๋ง๊ฐ์ง๊ธฐ ์์ํ๋ค.
- ๊ฒฐ๊ตญ ํ ์คํธ ์ํธ๋ ์๊ณ , ์ผ๊ธฐ์ค๊ธฐ ๋ค์์ธ ์ฝ๋์ ์ข์ ํ ๊ณ ๊ฐ๊ณผ, ํ ์คํธ์ ์์ ๋ถ์ ๋ ธ๋ ฅ์ด ํ์ฌ์๋ค๋ ์ค๋ง๊ฐ๋ง ๋จ๋๋ค.
- ์คํจ๋ฅผ ์ด๋ํ ์์ธ์ ๋ญ๊น? ๋ฐ๋ก ํ ์คํธ ์ฝ๋๋ฅผ ๋ง ์ง๋ ์ข๋ค๊ณ ํ์ฉํ ๊ฒฐ์ ์ด์๋ค.
- ํ ์คํธ ์ฝ๋๋ ์ค์ ์ฝ๋ ๋ชป์ง ์๊ฒ ์ค์ํ๋ค.
- ํ ์คํธ ์ฝ๋๋ ์ฌ๊ณ ์ ์ค๊ณ์ ์ฃผ์๊ฐ ํ์ํ๋ค.
- ์ค์ ์ฝ๋ ๋ชป์ง ์๊ฒ ๊นจ๋ํ๊ฒ ์ง์ผ ํ๋ค.
- ํ
์คํธ๋ ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ์ ๊ณตํ๋ค
- ํ
์คํธ ์ฝ๋๋ฅผ ๊นจ๋ํ๊ฒ ์ ์งํ์ง ์์ผ๋ฉด ๊ฒฐ๊ตญ ์์ด๋ฒ๋ฆฐ๋ค.
- ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ์ค์ ์ฝ๋๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋๋ ๋ฒํ๋ชฉ๋ ์ฌ๋ผ์ง๋ค.
- ์ฝ๋์ ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ์ ๊ณตํ๋ ๋ฒํ๋ชฉ์ด ๋ฐ๋ก ๋จ์ํ
์คํธ๋ค.
- ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ๋ณ๊ฒฝ์ด ๋๋ ต์ง ์๋ค!
- ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋ค๋ฉด ๋ชจ๋ ๋ณ๊ฒฝ์ด ์ ์ ์ ์ธ ๋ฒ๊ทธ๋ค.
- ์ํคํ ์ฒ๊ฐ ์๋ฌด๋ฆฌ ์ ์ฐํ๋๋ผ๋, ์ค๊ณ๋ฅผ ์๋ฌด๋ฆฌ ์ ๋๋ ๋จ๋๋ผ๋, ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ๊ฐ๋ฐ์๋ ๋ฒ๊ทธ๊ฐ ๋๋ ค์ ๋ณ๊ฒฝ์ ์ฃผ์ ํ๋ค.
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์๊ฐ ๋์์๋ก ๊ณตํฌ๋ ์ค์ด๋ ๋ค.
- ์ํคํ ์ฒ๊ฐ ๋ถ์คํ ์ฝ๋๋ ์ค๊ณ๊ฐ ๋ชจํธํ๊ณ ์๋ง์ธ ์ฝ๋๋ผ๋ ๋ณ๋ค๋ฅธ ์ฐ๋ ค ์์ด ๋ณ๊ฒฝํ ์ ์๋ค.
- ์ค์ ์ฝ๋๋ฅผ ์ ๊ฒํ๋ ์๋ํ๋ ๋จ์ ํ ์คํธ๋ ์ค๊ณ์ ์ํคํ ์ฒ๋ฅผ ์ต๋ํ ๊นจ๋ํ๊ฒ ๋ณด์กดํ๋ ์ด์ ๋ค.
- ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ๋ณ๊ฒฝ์ด ์ฌ์์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ํ ์คํธ ์ฝ๋๊ฐ ์ง์ ๋ถํด์ง๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฅ๋ ฅ์ด ๋จ์ด์ง๋ฉฐ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๋ ๋ฅ๋ ฅ๋ ๋จ์ด์ง๋ค.
- ๊ฒฐ๊ตญ ํ
์คํธ ์ฝ๋๋ฅผ ์์ด๋ฒ๋ฆฌ๊ณ ์ค์ ์ฝ๋๋ ๋ง๊ฐ์ง๋ค.
- ํ ์คํธ ์ฝ๋๊ฐ ์ง์ ๋ถํ ์๋ก ์ค์ ์ฝ๋๋ ์ง์ ๋ถํด์ง๋ค.
- ํ
์คํธ ์ฝ๋๋ฅผ ๊นจ๋ํ๊ฒ ์ ์งํ์ง ์์ผ๋ฉด ๊ฒฐ๊ตญ ์์ด๋ฒ๋ฆฐ๋ค.
- ๊นจ๋ํ ํ
์คํธ ์ฝ๋
- ๊นจ๋ํ ํ ์คํธ ์ฝ๋๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ธ ๊ฐ์ง๊ฐ ํ์ํ๋ค. ๊ฐ๋ ์ฑ, ๊ฐ๋ ์ฑ, ๊ฐ๋ ์ฑ ์ด๋ค.
- ํ ์คํธ ์ฝ๋์์ ๊ฐ๋ ์ฑ์ ๋์ด๋ ค๋ฉด ๋ช ๋ฃ์ฑ, ๋จ์์ฑ, ํ๋ถํ ํํ๋ ฅ์ด ํ์ํ๋ค.
- ํ ์คํธ ์ฝ๋๋ ์ต์ํ์ ํํ์ผ๋ก ๋ง์ ๊ฒ์ ๋ํ๋ด์ผ ํ๋ค.
public void testGetPageHieratchyAsXml() throws Exception
{
crawler.addPage(root, PathParser.parse("PageOne"));
crawler.addPage(root, PathParser.parse("PageOne.ChildOne"));
crawler.addPage(root, PathParser.parse("PageTwo"));
request.setResource("root");
request.addInput("type", "pages");
Responder responder = new SerializedPageResponder();
SimpleResponse response = (SimpleResponse) responder.makeResponse(
new FitNesseContext(root), request);
String xml = response.getContext();
assertEquals("test/xml", response.getContextType());
assertSubString("<name>PageOne</name>", xml);
assertSubString("<name>PageTwo</name>", xml);
assertSubString("<name>ChildOne</name>", xml);
}
public void testGetPageHieratchyAsXmlDoesntContainSymbolicLinks() throws Exception {
WikiPage pageOne = crawler.addPage(root, PathParser.parse("PageOne"));
crawler.addPage(root, PathParser.parse("PageOne.ChildOne"));
PageData data = pageOne.getData();
WikiPageProperties properties = data.getProperties();
WikiPageProperty symLinks = properties.set(SymbolicPage.PROPERTY_NAME);
symLinks.set("SymPage", "PageTwo");
pageOne.commit(data);
request.setResource("root");
request.addInput("type", "pages");
Responder responder = new SerializedPageResponder();
SimpleResponse response = (SimpleResponse) responder.makeResponse(new FitNesseContext(root), request);
String xml = response.getContent();
assertEquals("text/xml", response.getContentType());
assertSubString("<name>PageOne</name>", xml);
assertSubString("<name>PageTwo</name>", xml);
assertSubString("<name>ChildOne</name>", xml);
assertNotSubString("SymPage", xml);
}
public void testGetDataAsHtml() throws Exception {
crawler.addPage(root, PathParser.parse("TestPageOne", "test page");
request.setREsource("TestPageOne");
request.addInput("type", "data");
Responder responder = new SerializedPageResponder();
SimpleResponse response = (SimpleResponse) responder.makeResponse(new FitNesseContext(root), request);
String xml = response.getContext();
assertEquals("text/xml", response.getContextType());
assertSubString("test page", xml);
assertSubString("<Test", xml);
}
- PathParser: ๋ฌธ์์ด์ pagePath ์ธ์คํด์ค๋ก ๋ณํ. pagePath๋ ์น ๋ก๋ด(crawler)์ด ์ฌ์ฉํ๋ ๊ฐ์ฒด
- ํ ์คํธ์ ๋ฌด๊ดํ๋ฉฐ ํ ์คํธ ์ฝ๋์ ์๋๋ง ํ๋ฆฐ๋ค.
- responder ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฝ๋์ response๋ฅผ ์์งํด ๋ณํํ๋ ์ฝ๋ ์ญ์ ์ก์์ ๋ถ๊ณผํ๋ค.
- SerializedPageResponderTest.java (๋ฆฌํฉํฐ๋งํ ์ฝ๋)
public void testGetPageHierarchyAsXml() throws Exception {
makePages("PageOne", "PageOne.ChildOne", "PageTwo");
submitRequest("root", "type:pages");
assertResponseIsXml();
assertResponseContains(
"<name>PageOne</name>", "<name>PageTwo</name>", "<name>ChildOne</name>"
);
}
public void testSymbolicLinksAreNotInXmlPageHierarchy() throws Exception {
WikiPage page = makePage("PageOne");
makePages("PageOne.ChildOne", "PageTwo");
addLinkTo(page, "PageTwo", "SymPage");
submitRequest("root", "type:pages");
assertResponseIsXml();
assertResponseContains(
"<name>PageOne</name>", "<name>PageTwo</name>", "<name>ChildOne</name>"
);
assertResponseDoesNotContain("SymPage");
}
public void testGetDataAsXml() throws Exception {
makePageWithContent("TestPageOne", "test page");
submitRequest("TestPageOne", "type:data");
assertResponseIsXml();
assertResponseContains("test page", "<Test");
}
BUILD-OPERATE-CHECK ํจํด์ด ์์ ๊ฐ์ ํ ์คํธ ๊ตฌ์กฐ์ ์ ํฉํ๋ค. ๊ฐ ํ ์คํธ๋ ๋ช ํํ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋ ์ง๋ค.
- ํ ์คํธ ์๋ฃ๋ฅผ ๋ง๋ ๋ค.
- ํ ์คํธ ์๋ฃ๋ฅผ ์กฐ์ํ๋ค.
- ์กฐ์ํ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ๋ค.
ํ ์คํธ ์ฝ๋๋ ๋ณธ๋ก ์ ๋์ ํด ์ง์ง ํ์ํ ์๋ฃ ์ ํ๊ณผ ํจ์๋ง ์ฌ์ฉํ๋ค.
- ๋๋ฉ์ธ์ ํนํ๋ ํ
์คํธ ์ธ์ด(DSL)
- ๋๋ฉ์ธ ํนํ ์ธ์ด (DSL)๋ก ํ
์คํธ ์ฝ๋๋ฅผ ๊ตฌํํ๋ ๊ธฐ๋ฒ
- ์์คํ ์กฐ์ API๋ฅผ ์ฌ์ฉํ๋ ๋์ API ์์๋ค ํจ์์ ์ ํธ๋ฆฌํฐ๋ฅผ ๊ตฌํํ ํ ๊ทธ ํจ์์ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ๋ค.
- ํ ์คํธ ์ฝ๋๋ฅผ ์ง๊ธฐ๋ ์ฝ๊ธฐ๋ ์ฌ์์ง๋ค.
- ๊ตฌํํ ํจ์์ ์ ํธ๋ฆฌํฐ๋ ํ ์คํธ ์ฝ๋์์ ์ฌ์ฉํ๋ ํน์ API๊ฐ ๋๋ค.
- ๋๋ฉ์ธ ํนํ ์ธ์ด (DSL)๋ก ํ
์คํธ ์ฝ๋๋ฅผ ๊ตฌํํ๋ ๊ธฐ๋ฒ
์ด์ค ํ์ค
- ํ
์คํธ API ์ฝ๋์ ์ ์ฉํ๋ ํ์ค์ ์ค์ ์ฝ๋์ ์ ์ฉํ๋ ํ์ค๊ณผ ํ์คํ ๋ค๋ฅด๋ค.
- ๋จ์ํ๊ณ , ๊ฐ๊ฒฐํ๊ณ ํํ๋ ฅ์ด ํ๋ถํด์ผ ํ๋ค.
- ๋ค๋ง ์ค์ ์ฝ๋๋งํผ ํจ์จ์ ์ผ ํ์๋ ์๋ค.
- ์ค์ ํ๊ฒฝ์ด ์๋๋ผ ํ ์คํธ ํ๊ฒฝ์์ ๋์๊ฐ๋ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ค์ ํ๊ฒฝ๊ณผ ํ ์คํธ ํ๊ฒฝ์ ์๊ตฌ์ฌํญ์ด ํ์ดํ๊ฒ ๋ค๋ฅด๋ค.
EnvironmentControllerTest.java
@Test
public void turnOnLoTempAlarmAtThreashold() throws Exception {
hw.setTemp(WAY_TOO_COLD);
controller.tic();
assertTrue(hw.heaterState());
assertTrue(hw.blowerState());
assertFalse(hw.coolerState());
assertFalse(hw.hiTempAlarm());
assertTrue(hw.loTempAlarm());
}
EnvironmentControllerTest.java (๋ฆฌํฉํฐ๋ง)
@Test
public void turnOnLoTempAlarmThreshold() throws Exception {
wayTooCold();
assertEquals("HBchL", hw.getState());
}
public String getState() {
String state = "";
state += heater ? "H" : "h";
state += blower ? "B" : "b";
state += coolear ? "C" : "c";
state += hiTempAlarm ? "H" : "h";
state += loTempAlarm ? "L" : "l";
return state;
}
- ํ
์คํธ ๋น assert ํ๋
ํ ์คํธ ํจ์๋ง๋ค ํ ๊ฐ๋ ๋ง ํ ์คํธํ๋ผ
addMonths() ๋ฉ์๋๋ฅผ ํ ์คํธํ๋ ์ฅํฉํ ์ฝ๋
public void testAddMonths() {
SerialDate d1 = SerialDate.createInstance(31, 5, 2004);
SerialDate d2 = SerialDate.addMonths(1, d1);
assertEquals(30, d2.getDayOfMonth());
assertEquals(6, d2.getMonth());
assertEquals(2004, d2.getYYYY());
SerialDate d3 = SerialDate.addMonths(2, d1);
assertEquals(31, d3.getDayOfMonth());
assertEquals(7, d3.getMonth());
assertEquals(2004, d3.getYYYY());
SerialDate d4 = SerialDate.addMonths(1, SerialDate.addMonths(1, d1));
assertEquals(30, d4.getDayOfMonth());
assertEquals(7, d4.getMonth());
assertEquals(2004, d4.getYYYY());
}
์ ์ผ๋ก ๋ถ๋ฆฌํ ํ ์คํธ ํจ์๋ ๊ฐ๊ฐ ๋ค์ ๊ธฐ๋ฅ์ ์ํํ๋ค.
- (5์์ฒ๋ผ) 31์ผ๋ก ๋๋๋ ๋ง์ง๋ง ๋ ์ง๊ฐ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ
- (6์์ฒ๋ผ) 30์ผ๋ก ๋๋๋ ํ ๋ฌ์ ๋ํ๋ฉด ๋ ์ง๋ 30์ผ์ด ๋์ด์ผ์ง 31์ผ์ด ๋์ด์๋ ์๋๋ค.
- ๋ ๋ฌ์ ๋ํ๋ฉด ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ๋ฌ์ด 31์ผ๋ก ๋๋๋ฉด ๋ ์ง๋ 31์ผ์ด ๋์ด์ผ ํ๋ค.
- (6์์ฒ๋ผ) 30์ผ๋ก ๋๋๋ ๋ฌ์ ๋ง์ง๋ง ๋ ์ง๊ฐ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ
- 31์ผ๋ก ๋๋๋ ํ ๋ฌ์ ๋ํ๋ฉด ๋ ์ง๋ 30์ผ์ด ๋์ด์ผ์ง 31์ผ์ด ๋๋ฉด ์๋๋ค.
์ ํ
์คํธ ์ฝ๋๋ ์ฌ๋ฌ ๊ฐ๋
์ ํ
์คํธํ๊ณ ์๋ค.
๊ฐ๋
๋น assert๋ฌธ ์๋ฅผ ์ต์๋ก ์ค์ฌ๋ผ์ ํ
์คํธ ํจ์ ํ๋๋ ๊ฐ๋
ํ๋๋ง ํ
์คํธํ๋ผ
- ํ ์คํธ ๋น ๊ฐ๋ ํ๋
- F.I.R.S.T.
- Fast (๋น ๋ฅด๊ฒ)
- ํ ์คํธ๋ ๋นจ๋ฆฌ ๋์์ผ ํ๋ค.
- ํ ์คํธ๊ฐ ๋๋ฆฌ๋ฉด ์์ฃผ ๋๋ฆด ์๋๋ฅผ ๋ชป ๋ธ๋ค.
- ์์ฃผ ๋๋ฆฌ์ง ์์ผ๋ฉด ์ด๋ฐ์ ๋ฌธ์ ๋ฅผ ์ฐพ์๋ด ๊ณ ์น์ง ๋ชปํ๋ค.
- ์ฝ๋๋ฅผ ๋ง์๊ป ์ ๋ฆฌํ์ง๋ ๋ชปํ๋ค.
- ๊ฒฐ๊ตญ ์ฝ๋ ํ์ง์ด ๋ง๊ฐ์ง๊ธฐ ์์ํ๋ค.
- Indepenent (๋
๋ฆฝ์ ์ผ๋ก)
- ๊ฐ ํ ์คํธ๋ ์๋ก ์์กดํ๋ฉด ์ ๋๋ค.
- ํ ํ ์คํธ๊ฐ ๋ค์ ํ ์คํธ๊ฐ ์คํ๋ ํ๊ฒฝ์ ์ค๋นํด์๋ ์ ๋๋ค.
- ๊ฐ ํ ์คํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์์๋ก ์คํํด๋ ๊ด์ฐฎ์์ผ ํ๋ค.
- ํ ์คํธ๊ฐ ์๋ก ์์กดํ๋ฉด ํ๋๊ฐ ์คํจํ ๋ ๋๋จธ์ง๋ ์๋ฌ์ ์คํจํ๋ฏ๋ก ์์ธ์ ์ง๋จํ๊ธฐ ์ด๋ ค์์ง๋ฉฐ ํ๋ฐ ํ ์คํธ๊ฐ ์ฐพ์๋ด์ผ ํ ๊ฒฐํจ์ด ์จ๊ฒจ์ง๋ค.
- Repeatable (๋ฐ๋ณต๊ฐ๋ฅํ๊ฒ)
- ํ ์คํธ๋ ์ด๋ค ํ๊ฒฝ์์๋ ๋ฐ๋ณต ๊ฐ๋ฅํด์ผ ํ๋ค.
- ์ค์ ํ๊ฒฝ, QA ํ๊ฒฝ, ๋ฒ์ค๋ฅผ ํ๊ณ ์ง์ผ๋ก ๊ฐ๋ (๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋์ง ์์) ๋ ธํธ๋ถ ํ๊ฒฝ์์๋ ์คํํ ์ ์์ด์ผ ํ๋ค.
- ํ ์คํธ๊ฐ ๋์๊ฐ์ง ์๋ ํ๊ฒฝ์ด ํ๋๋ผ๋ ์๋ค๋ฉด ํ ์คํธ๊ฐ ์คํจํ ์ด์ ๋ฅผ ๋๋ฌ๋ ๋ณ๋ช ์ด ์๊ธด๋ค.
- ๊ฒ๋ค๊ฐ ํ๊ฒฝ์ด ์ง์๋์ง ์๊ธฐ์ ํ ์คํธ๋ฅผ ์ํํ์ง ๋ชปํ๋ ์ํฉ์ ์ง๋ฉดํ๋ค.
- Self-Validating (์๊ฐ ๊ฒ์ฆํ๋)
- ํ ์คํธ๋ ๋ถ์ธ ๊ฐ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผ ํ๋ค. ์ฑ๊ณต ์๋๋ฉด ์คํจ๋ค.
- ํต๊ณผ ์ฌ๋ถ๋ฅผ ์๋ ค๊ณ ๋ก๊ทธ ํ์ผ์ ์ฝ๊ฒ ๋ง๋ค์ด์๋ ์ ๋๋ค.
- ํต๊ณผ ์ฌ๋ถ๋ฅผ ๋ณด๋ ค๊ณ ํ ์คํธ ํ์ผ ๋ ๊ฐ๋ฅผ ์์์ ์ผ๋ก ๋น๊ตํ๊ฒ ๋ง๋ค์ด์๋ ์ ๋๋ค.
- ํ ์คํธ๊ฐ ์ค์ค๋ก ์ฑ๊ณต๊ณผ ์คํจ๋ฅผ ๊ฐ๋ ํ์ง ์๋๋ค๋ฉด ํ๋จ์ด ์ฃผ๊ด์ ์ด ๋๋ฉฐ ์ง๋ฃจํ ์์์ ํ๊ฐ๊ฐ ํ์ํ๊ฒ ๋๋ค.
- Timely (์ ์์)
- ํ ์คํธ๋ ์ ์์ ์์ฑํด์ผ ํ๋ค.
- ๋จ์ ํ ์คํธ๋ ํ ์คํธํ๋ ค๋ ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ ์ง์ ์ ๊ตฌํํ๋ค.
- ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ ๋ค์์ ํ ์คํธ ์ฝ๋๋ฅผ ๋ง๋ค๋ฉด ์ค์ ์ฝ๋๊ฐ ํ ์คํธํ๊ธฐ ์ด๋ ต๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ ์ง๋ ๋ชจ๋ฅธ๋ค.
- ์ด๋ค ์ค์ ์ฝ๋๋ ํ ์คํธํ๊ธฐ ๋๋ฌด ์ด๋ ต๋ค๊ณ ํ๋ช ๋ ์ง ๋ชจ๋ฅธ๋ค.
- ํ ์คํธ๊ฐ ๋ถ๊ฐ๋ฅํ๋๋ก ์ค์ ์ฝ๋๋ฅผ ์ค๊ณํ ์ง๋ ๋ชจ๋ฅธ๋ค.
- Fast (๋น ๋ฅด๊ฒ)
๊ฒฐ๋ก
- ํ ์คํธ ์ฝ๋๋ ์ค์ ์ฝ๋๋งํผ์ด๋ ํ๋ก์ ํธ ๊ฑด๊ฐ์ ์ค์ํ๋ค.
- ํ ์คํธ ์ฝ๋๋ ์ค์ ์ฝ๋์ ์ ์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ๋ณด์กดํ๊ณ ๊ฐํํ๋ค.
- ํ ์คํธ ์ฝ๋๋ ์ง์์ ์ผ๋ก ๊นจ๋ํ๊ฒ ๊ด๋ฆฌํ์. ํํ๋ ฅ์ ๋์ด๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ์.
- ํ
์คํธ API๋ฅผ ๊ตฌํํด ๋๋ฉ์ธ ํนํ ์ธ์ด(Domain Specific Language, DSL)๋ฅผ ๋ง๋ค์.
๊ทธ๋ฌ๋ฉด ํ ์คํธ ์ฝ๋๋ฅผ ์ง๊ธฐ๊ฐ ์ฌ์์ง๋ค. - ํ ์คํธ ์ฝ๋๊ฐ ๋ฐฉ์น๋์ด ๋ง๊ฐ์ง๋ฉด ์ค์ ์ฝ๋๋ ๋ง๊ฐ์ง๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ๊นจ๋ํ๊ฒ ์ ์งํ์!
์ฐธ๊ณ ๋งํฌ
๋ฐ์ํ
'Java > CleanCode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CleanCode] 11์ฅ ์์คํ (0) | 2023.02.25 |
---|---|
[CleanCode] 10์ฅ ํด๋์ค (0) | 2023.02.25 |
[CleanCode] 8์ฅ ๊ฒฝ๊ณ (0) | 2023.02.25 |
[CleanCode] 7์ฅ ์ค๋ฅ ์ฒ๋ฆฌ (1) | 2023.02.25 |
[CleanCode] 6์ฅ ๊ฐ์ฒด์ ์๋ฃ ๊ตฌ์กฐ (0) | 2023.02.25 |