๐ญ Chapter 4: ์ฃผ์
๋์ ์ฝ๋์ ์ฃผ์์ ๋ฌ์ง ๋ง๋ผ. ์๋ก ์ง๋ผ.
์ ๋ฌ๋ฆฐ ์ฃผ์์ ๊ทธ ์ด๋ค ์ ๋ณด๋ณด๋ค ์ ์ฉํ๋ค. ๊ฒฝ์ํ๊ณ ๊ทผ๊ฑฐ ์๋ ์ฃผ์์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค. ์ค๋๋๊ณ ์กฐ์กํ ์ฃผ์์ ๊ฑฐ์ง๊ณผ ์๋ชป๋ ์ ๋ณด๋ฅผ ํผ๋จ๋ ค ํด์ ์ ๋ฏธ์น๋ค.
์ฐ๋ฆฌ๋ ์ฝ๋๋ก ์๋๋ฅผ ํํํ์ง ๋ชปํด, ๊ทธ๋ฌ๋๊น ์คํจ๋ฅผ ๋งํํ๊ธฐ ์ํด ์ฃผ์์ ์ฌ์ฉํ๋ค. ์ฃผ์์ ์ธ์ ๋ ์คํจ๋ฅผ ์๋ฏธํ๋ค. ๋๋๋ก ์ฃผ์ ์์ด๋ ์์ ์ ํํํ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํด ํ ์ ์์ด ์ฃผ์์ ์ฌ์ฉํ๋ค. ๊ทธ๋์ ์ฃผ์์ ๋ฐ๊ฒจ ๋ง์ ์๋์ด ์๋๋ค.
์ฃผ์์ ์ค๋๋ ์๋ก ์ฝ๋์์ ๋ฉ์ด์ง๋ค. ์ค๋๋ ์๋ก ์์ ํ ๊ทธ๋ฆ๋ ๊ฐ๋ฅ์ฑ๋ ์ปค์ง๋ค. ์ด์ ๋ ๋จ์ํ๋ค. ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ฃผ์์ ์ ์งํ๊ณ ๋ณด์ํ๊ธฐ๋ ํ์ค์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ๋๊น.
์ฝ๋๋ ๋ณํํ๊ณ ์งํํ๋ค. ์ผ๋ถ๊ฐ ์ฌ๊ธฐ์ ์ ๊ธฐ๋ก ์ฎ๊ฒจ์ง๊ธฐ๋ ํ๋ค. ์กฐ๊ฐ์ด ๋๋๊ณ ๊ฐ๋ผ์ง๊ณ ํฉ์ณ์ง๋ฉด์ ๊ดด๋ฌผ๋ก ๋ณํ๋ค. ๋ถํํ๊ฒ๋ ์ฃผ์์ด ์ธ์ ๋ ์ฝ๋๋ฅผ ๋ฐ๋ผ๊ฐ์ง๋ ์๋๋ค. ์๋, ๋ฐ๋ผ๊ฐ์ง ๋ชปํ๋ค. ์ฃผ์์ด ์ฝ๋์์ ๋ถ๋ฆฌ๋์ด ์ ์ ๋ ๋ถ์ ํํ ๊ณ ์๋ก ๋ณํ๋ ์ฌ๋ก๊ฐ ๋๋ฌด๋ ํํ๋ค.
๋ถ์ ํํ ์ฃผ์์ ์์ ์๋ ์ฃผ์๋ณด๋ค ํจ์ฌ ๋ ๋์๋ค. ๋ถ์ ํํ ์ฃผ์์ ๋ ์๋ค์ ํํนํ๊ณ ์ค๋ํ๋ค. ๋ถ์ ํํ ์ฃผ์์ ๊ฒฐ์ฝ ์ด๋ค์ง์ง ์์ ๊ธฐ๋๋ฅผ ์ฌ์ด์ค๋ค. ๋ ์ด์ ์งํฌ ํ์๊ฐ ์๋ ๊ท์น์ด๋ ์ง์ผ์๋ ์ ๋๋ ๊ท์น์ ๋ช ์ํ๋ค.
์ง์ค์ ํ๊ณณ์๋ง ์กด์ฌํ๋ค. ๋ฐ๋ก ์ฝ๋๋ค. ์ฝ๋๋ง์ด ์๊ธฐ๊ฐ ํ๋ ์ผ์ ์ง์ค๋๊ฒ ๋งํ๋ค. ์ฝ๋๋ง์ด ์ ํํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ ์ผํ ์ถ์ฒ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฐ๋ฆฌ๋ ์ฃผ์์ ๊ฐ๋ฅํ ์ค์ด๋๋ก ๊พธ์คํ ๋ ธ๋ ฅํด์ผ ํ๋ค.
๐ ์ฃผ์์ ๋์ ์ฝ๋๋ฅผ ๋ณด์ํ์ง ๋ชปํ๋คโ
์ฝ๋์ ์ฃผ์์ ์ถ๊ฐํ๋ ์ผ๋ฐ์ ์ธ ์ด์ ๋ ์ฝ๋ ํ์ง์ด ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
ํํ๋ ฅ์ด ํ๋ถํ๊ณ ๊น๋ํ๋ฉฐ ์ฃผ์์ด ๊ฑฐ์ ์๋ ์ฝ๋๊ฐ, ๋ณต์กํ๊ณ ์ด์์ ํ๋ฉฐ ์ฃผ์์ด ๋ง์ด ๋ฌ๋ฆฌ ์ฝ๋๋ณด๋ค ํจ์ฌ ์ข๋ค. ์์ ์ด ์ ์ง๋ฅธ ๋์ฅํ์ ์ฃผ์์ผ๋ก ์ค๋ช ํ๋ ค ์ ์ฐ๋ ๋์ ์ ๊ทธ ๋์ฅํ์ ๊นจ๋์ด ์น์ฐ๋ ๋ฐ ์๊ฐ์ ๋ณด๋ด๋ผ!
๐ ์ฝ๋์ ์๋๋ฅผ ํํํ๋ผ!โ
ํ์คํ ์ฝ๋๋ง์ผ๋ก ์๋๋ฅผ ์ค๋ช ํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค. ๋ถํํ๋ ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ด๋ฅผ ์ฝ๋๋ ํ๋ฅญํ ์๋จ์ด ์๋๋ผ๋ ์๋ฏธ๋ก ํด์ํ๋ค. ๋ถ๋ช ํ ์๋ชป๋ ์๊ฐ์ด๋ค. ๋ค์ ์ฝ๋ ์์ ๋ ๊ฐ๋ฅผ ์ดํด๋ณด์. ์ด๋ ์ชฝ์ด ๋ ๋์๊ฐ?
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
๋ค์ ์ฝ๋๋ ์ด๋ค๊ฐ?
if (employee.isEligibleForFullBenefits())
๋ช ์ด๋ง ๋ ์๊ฐํ๋ฉด ์ฝ๋๋ก ๋๋ค์ ์๋๋ฅผ ํํํ ์ ์๋ค. ๋ง์ ๊ฒฝ์ฐ ์ฃผ์์ผ๋ก ๋ฌ๋ ค๋ ์ค๋ช ์ ํจ์๋ก ๋ง๋ค์ด ํํํด๋ ์ถฉ๋ถํ๋ค.
๐ ์ข์ ์ฃผ์โ
์ด๋ค ์ฃผ์์ ํ์ํ๊ฑฐ๋ ์ ์ตํ๋ค. ํ์ง๋ง ๋ช ์ฌํ๊ธฐ ๋ฐ๋๋ค. ์ ๋ง๋ก ์ข์ ์ฃผ์์, ์ฃผ์์ ๋ฌ์ง ์์ ๋ฐฉ๋ฒ์ ์ฐพ์๋ธ ์ฃผ์์ด๋ผ๋ ์ฌ์ค์!
๐ ๋ฒ์ ์ธ ์ฃผ์โ
๋๋ก๋ ํ์ฌ๊ฐ ์ ๋ฆฝํ ๊ตฌํ ํ์ค์ ๋ง์ถฐ ๋ฒ์ ์ธ ์ด์ ๋ก ํน์ ์ฃผ์์ ๋ฃ์ผ๋ผ๊ณ ๋ช ์ํ๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ ์์ค ํ์ผ ์ฒซ ๋จธ๋ฆฌ์ ์ฃผ์์ผ๋ก ๋ค์ด๊ฐ๋ ์ ์๊ถ ์ ๋ณด์ ์์ ๊ถ ์ ๋ณด๋ ํ์ํ๊ณ ๋ ํ๋นํ๋ค.
์์ค ํ์ผ ์ฒซ๋จธ๋ฆฌ์ ๋ค์ด๊ฐ๋ ์ฃผ์์ด ๋ฐ๋์ ๊ณ์ฝ ์กฐ๊ฑด์ด๋ ๋ฒ์ ์ธ ์ ๋ณด์ผ ํ์๋ ์๋ค. ๋ชจ๋ ์กฐํญ๊ณผ ์กฐ๊ฑด์ ์ด๊ฑฐํ๋ ๋์ ์, ๊ฐ๋ฅํ๋ค๋ฉด, ํ์ค ๋ผ์ด์ ์ค๋ ์ธ๋ถ ๋ฌธ์๋ฅผ ์ฐธ์กฐํด๋ ๋๊ฒ ๋ค.
๐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ฃผ์โ
๋๋ก๋ ๊ธฐ๋ณธ์ ์ธ ์ ๋ณด๋ฅผ ์ฃผ์์ผ๋ก ์ ๊ณตํ๋ฉด ํธ๋ฆฌํ๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ ์ฃผ์์ ์ถ์ ๋ฉ์๋๊ฐ ๋ฐํํ ๊ฐ์ ์ค๋ช ํ๋ค.
// ํ
์คํธ ์ค์ธ Responder ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
protected abstract Responder responderInstance();
๋๋๋ก ์์ ๊ฐ์ ์ฃผ์์ด ์ ์ฉํ๋ค ํ ์ง๋ผ๋, ๊ฐ๋ฅํ๋ค๋ฉด, ํจ์ ์ด๋ฆ์ ์ ๋ณด๋ฅผ ๋ด๋ ํธ์ด ๋ ์ข๋ค. ์๋ฅผ ๋ค์ด, ์ ์ฝ๋๋ ํจ์ ์ด๋ฆ์ responderBeingTested
๋ก ๋ฐ๊พธ๋ฉด ์ฃผ์์ด ํ์ ์์ด์ง๋ค.
๋ค์์ ์ข ๋ ๋์ ์์ ๋ค.
// kk:mm:ss EEE, MMM dd, yyyy ํ์์ด๋ค.
Pattern timeMatcher = Pattern.compile(
"\\d*:\\d*:\\d* \\w*, \\w* \\d*, \\d*"
);
์์ ์ ์ํ ์ฃผ์์ ์ฝ๋์์ ์ฌ์ฉํ ์ ๊ทํํ์์ด ์๊ฐ๊ณผ ๋ ์ง๋ฅผ ๋ปํ๋ค๊ณ ์ค๋ช ํ๋ค. ์ด์์ด๋ฉด ์๊ฐ๊ณผ ๋ ์ง๋ฅผ ๋ณํํ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฝ๋๋ฅผ ์ฎ๊ฒจ์ฃผ๋ฉด ๋ ์ข๊ณ ๋ ๊น๋ํ๊ฒ ๋ค. ๊ทธ๋ฌ๋ฉด ์ฃผ์์ด ํ์ ์์ด์ง๋ค.
๐ ์๋๋ฅผ ์ค๋ช ํ๋ ์ฃผ์โ
๋๋๋ก ์ฃผ์์ ๊ตฌํ์ ์ดํดํ๊ฒ ๋์์ฃผ๋ ์ ์ ๋์ด ๊ฒฐ์ ์ ๊น๋ฆฐ ์๋๊น์ง ์ค๋ช ํ๋ค.
public void testConcurrentAddWidgets() throws Exception {
WidgetBuilder widgetBuilder =new WidgetBuilder(new Class[]{BoldWidget.class});
String text = "'''bold text'''";
ParentWidget parent = new BoldWidget(new MockWidgetRoot(), "'''bold text'''");
AtomicBoolean failFlag = new AtomicBoolean();
failFlag.set(false);
// ์ค๋ ๋๋ฅผ ๋๋ ์์ฑํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ป๊ฒ๋ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ง๋ค๋ ค ์๋ํ๋ค.
for (int i = 0; i < 25000; i++) {
WidgetBuilderThread widgetBuilderThread = new WidgetBuilderThread(widgetBuilder, text, parent, failFlag);
Thread thread = new Thread(widgetBuilderThread);
thread.start();
}
assertEquals(false, failFlag.get());
}
๐ ์๋ฏธ๋ฅผ ๋ช ๋ฃํ๊ฒ ๋ฐํ๋ ์ฃผ์โ
๋๋๋ก ๋ชจํธํ ์ธ์๋ ๋ฐํ๊ฐ์ ๊ทธ ์๋ฏธ๋ฅผ ์ฝ๊ธฐ ์ข๊ฒ ํํํ๋ฉด ์ดํดํ๊ธฐ ์ฌ์์ง๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ธ์๋ ๋ฐํ๊ฐ ์์ฒด๋ฅผ ๋ช ํํ๊ฒ ๋ง๋ค๋ฉด ๋ ์ข๊ฒ ์ง๋ง, ์ธ์๋ ๋ฐํ๊ฐ์ด ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ณ๊ฒฝํ์ง ๋ชปํ๋ ์ฝ๋์ ์ํ๋ค๋ฉด ์๋ฏธ๋ฅผ ๋ช ๋ฃํ๊ฒ ๋ฐํ๋ ์ฃผ์์ด ์ ์ฉํ๋ค.
public void testCompareTo() throws Exception {
WikiPagePath a = PathParser.parse("PageA");
assertTrue(a.compareTo(a) == 0); // a == b
}
๋ฌผ๋ก ๊ทธ๋ฆ๋ ์ฃผ์์ ๋ฌ์๋์ ์ํ์ ์๋นํ ๋๋ค.
๐ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฝ๊ณ ํ๋ ์ฃผ์โ
๋๋ก ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฝ๊ณ ํ ๋ชฉ์ ์ผ๋ก ์ฃผ์์ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, ๋ค์์ ํน์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๊บผ์ผํ๋ ์ด์ ๋ฅผ ์ค๋ช ํ๋ ์ฃผ์์ด๋ค.
// ์ฌ์ ์๊ฐ์ด ์ถฉ๋ถํ์ง ์๋ค๋ฉด ์คํํ์ง ๋ง์ญ์์ค.
public void _testWithReallyBigFile() {
writeLinesToFile(10000000);
response.setBody(testFile);
response.readToSend(this);
String responseString = output.toString();
assertSubString("Content-Length: 10000000", responseString);
assetTrue(bytesSent > 10000000);
}