๐ย ์ค๋ ์ฝ์ ๋ฒ์ : 9์ฅ, ๋จ์ ํ ์คํธ
<aside> ๐ ์ฑ ์์ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ์ ์จ๋ณด์ธ์.
</aside>
๊นจ๋ํ ํ ์คํธ ์ฝ๋
*์ด์ ๋ด์ฉ ๋ณต์ต
SerializedPageResponderTest.java
public void testGetPageHieratchyAsXml() throws Exception
{
// PathParser๋ ๋ฌธ์์ด์ pagePath ์ธ์คํด์ค๋ก ๋ณํํ๋.
// pagePathsms ์น ๋ก๋ด(crawler)์ด ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ค.
crawler.addPage(root, PathParser.parse("PageOne") ) ;
crawler.addPage(root, PathParser.parse("PageOne.ChildOne") ) ;
crawler.addPage(root, PathParser.parse("PageTwo") ) ;
request.setResource("root") ;
request.addlnput("type", "pages");
// ์ด ์์ญ๋ PathParser์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ก์์ ๋ถ๊ณผํ๋ค
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) ;
}
public void testGetPageHieratchyAsXmlDoesntContainSymbolicLinks() throws Exception
{
WikiPage pageOne = crawler.addPage(root, PathParser.parse("Pageone") ;
crawler.addPage(root, PathParser.parse("PageOne.ChildOne") ) ;
crawler.addPage(root, PathParser.parse("PageTwo") ) ;
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.getContent();
assertEquals("text/xml" , response.getContentType( ) ) ;
assertSubString( "test page" , xml) ;
assertSubString( "<Test" , xml);
}
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 testSymboliclinksAreNotlnXmlPageHierarchy( ) 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");
}
ํ ์คํธ ์ฝ๋๋ ๋ณธ๋ก ์ ๋์ ํด ์ง์ง ํ์ํ ์๋ฃ ์ ํ๊ณผ ํจ์๋ง ์ฌ์ฉํ๋ค.
๋๋ฉ์ธ์ ํนํ๋ ํ ์คํธ ์ธ์ด
์ด์ค ํ์ค
ํ ์คํธ API์ ์ ์ฉํ๋ ํ์ค์ ์ค์ ์ฝ๋์ ์ ์ฉํ๋ ํ์ค๊ณผ ํ์คํ ๋ค๋ฅด๋ค. ๋จ์ํ๊ณ , ๊ฐ๊ฒฐํ๊ณ , ํํ๋ ฅ์ด ํ๋ถํด์ผ ํ์ง๋ง, ์ค์ ์ฝ๋๋งํผ ํจ์จ์ ์ธ ํ์๋ ์๋ค. ์ค์ ํ๊ฒฝ์ด ์๋๋ผ ํ ์คํธ ํ๊ฒฝ์์ ๋์๊ฐ๋ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ด๋ค.
EnvironmentControllerTest.java
@Test
public void turnOnLoTempAlarmAtThreashold() throws Exception {
hw.setTemp(WAY_TO_COLD);
// ๋ฌธ์ ์ 1. tic() ํจ์๊ฐ ๋ฌด์์ผ๊น? ๊ถ๊ธํ๊ฒ ํจ
controller.tic();
// ๋ฌธ์ ์ 2. ์ฝ๋๋ฅผ ์ ๊ฒํ๋ ์ํ ์ด๋ฆ๊ณผ ์ํ ๊ฐ์ ํ์ธํ๋๋ผ ๋๊ธธ์ด ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ง๋ค.
assertTrue(hw.heaterState());
assertTrue(hw.blowerState());
assertFalse(hw.coolerState());
assertFalse(hw.hiTempAlarm());
assertTrue(hw.loTempAlarm());
}
EnvironmentControllerTest.java (๋ฆฌํํฐ๋ง)
@Test
public void turnOnLoTempAlarmAtThreshold() throws Exception {
wayTooCold();
// ์ค์ ํ๊ฒฝ์์๋ ์๋์ง๋ง, ํ
์คํธ ํ๊ฒฝ์์๋ ๋ฌธ์ ์๋ ์ฝ๋!
// ์ผ๋จ "HBchL"์ด ์๋ฏธํ๋ ๋ฐ๋ง ์๋ค๋ฉด ๋๊ธธ์ด ๋ฌธ์์ด์ ๋ฐ๋ผ ์์ง์ด๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋นจ๋ฆฌ ํ๋จํ๋ค.
assertEquals("HBchL", hw.getState());
}
ํ์ง๋ง ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์คํ ์ค์๊ฐ ์๋ฒ ๋๋ ์์คํ ์ด๋ค. ์ฆ, ์ปดํจํฐ ์์๊ณผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ํ์ง๋ง ํ ์คํธ ํ๊ฒฝ์ ์์์ด ์ ํ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๋ค.
์ค์ ํ๊ฒฝ์์๋ ์ ๋๋ก ์ ๋์ง๋ง ํ ์คํธ ํ๊ฒฝ์์๋ ์ ํ ๋ฌธ์ ์๋ ๋ฐฉ์์ด ์๋ค. ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ CPU ํจ์จ๊ณผ ๊ด๋ จ ์๋ ๊ฒฝ์ฐ๋ค. ์ฝ๋์ ๊นจ๋ํจ๊ณผ๋ ์ฒ ์ ํ ๋ฌด๊ดํ๋ค.
ํ ์คํธ ๋น assert ํ๋
JUnit์ผ๋ก ํ ์คํธ ์ฝ๋๋ฅผ ์งค ๋๋ ํจ์๋ง๋ค assert ๋ฌธ์ ๋จ ํ๋๋ง ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ ํํ๊ฐ ์๋ค.
assert ๋ฌธ์ด ๋จ ํ๋์ธ ํจ์๋ ๊ฒฐ๋ก ์ด ํ๋๋ผ์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ณ ๋น ๋ฅด๋ค.
SerializedPageResponderTest.java
public void testGetPageHierarchyAsXml( ) throws Exception {
givenPages("PageOne", "PageOne.ChildOne", "PageTwo");
whenRequestIsissued("root", "type:pages");
// assert1. ์ถ๋ ฅ์ด XML์ด๋ค.
thenResponseShouldBeXML();
}
public void testGetPageHierarchyHasRightTags( ) throws Exception {
givenPages("PageOne", "PageOne.ChildOne", "PageTwo");
whenRequestIsIssued("root", "type: pages") ;
// assert2. ํน์ ๋ฌธ์์ด์ ํฌํจํ๋ค.
thenResponseShouldContain(
"<name>PageOne</name>", "<name>PageTwo</name>", "<name>ChildOne</name>"
);
}
์ด๊ฒ์ ๊ฒ ๊ฐ์ํด ๋ณด๋ฉด ๊ฒฐ๊ตญ assert ๋ฌธ์ ์ฌ๋ฟ ์ฌ์ฉํ๋ ํธ์ด ์ข๋ค๊ณ ์๊ฐํ๋ค.
๋์ฒด๋ก ๋๋ ๋จ์ผ assert๋ฅผ ์ง์ํ๋ ํด๋น ๋ถ์ผ ํ ์คํธ ์ธ์ด๋ฅผ ๋ง๋ค๋ ค ๋ ธ ๋ ฅํ๋ค. ํ์ง๋ง ๋๋ก๋ ์ฃผ์ ์์ด ํจ์ ํ๋์ ์ฌ๋ฌ assert ๋ฌธ์ ๋ฃ๊ธฐ๋ ํ๋ค. ๋จ์ง assert ๋ฌธ ๊ฐ์๋ ์ต๋ํ ์ค์ฌ์ผ ์ข๋ค๋ ์๊ฐ์ด๋ค.
ํ ์คํธ ๋น ๊ฐ๋ ํ๋
F.I.R.S.T
๊ฒฐ๋ก
<aside> ๐ค ์ค๋ ์ฝ์ ์๊ฐ์? ๋ ์ค๋ฅด๋ ์๊ฐ์ ๊ฐ๋ณ๊ฒ ์ ์ด๋ณด์ธ์
</aside>
<aside> ๐ ๊ถ๊ธํ ๋ด์ฉ์ด ์๊ฑฐ๋, ์ ์ดํด๋์ง ์๋ ๋ด์ฉ์ด ์๋ค๋ฉด ์ ์ด๋ณด์ธ์.
</aside>
๋จ์ ํ ์คํธ ์์ฑ ํจํด
BUILD-OPERATE-CHECK (= Arrange - Act - Assert (AAA))
Usual production patterns applied to Integration tests
JUnit 4 ํ ์คํธ ์์ฑ (2) - ๋จ์ํ ์คํธ ๊ตฌ์ฑ๊ณผ MVC Test
given-when-then
TEMPLATE METHOD ํจํด
API ์์๋ค ํจ์์ ์ ํธ๋ฆฌํฐ๋ฅผ ๊ตฌํํ๋ค(= ํ ์คํธ API๋ฅผ ๊ตฌํํ๋ค) ?
ํด๋ฆฐ์ฝ๋_์ค์ผ์ฅด๋ฌ_TIL ์ถ์ํ (๋ ธ๊ฐ๋ถ1๊ธฐ)
์๊ฐ 3์ค ์์ฝ