JavaRush /Java Blog /Random-KO /JavaRush์šฉ JUnit ๋˜๋Š” ์ง‘์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
Sdu
๋ ˆ๋ฒจ 17

JavaRush์šฉ JUnit ๋˜๋Š” ์ง‘์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์ž‘์—…์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ฝ˜์†”์— ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ญ ๋ฒˆ ์ž…๋ ฅํ•˜๋Š” ๋ฐ ์ง€์น˜์…จ๋‚˜์š”? ๊ณ ์–‘์ด์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์–‘์ด๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์ž๋ฃŒ์˜ ๊ถ๊ทน์ ์ธ ๋ชฉํ‘œ๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๋‹ค์–‘ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ๋˜๋Š” ์ž‘์—…์˜ ์‹œ์ž‘์„ ์ž๋™ํ™”ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๋ชฉ์—์„œ ์ด๋ฏธ ์ดํ•ดํ•˜์…จ๊ฒ ์ง€๋งŒ, ์ด ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ณด์กฐ์ž๋Š” JUnit ์ž…๋‹ˆ๋‹ค . ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์™€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์— ๋Œ€ํ•ด ์•„์ง ๋“ค์–ด๋ณด์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ์ž ์‹œ ํœด์‹์„ ์ทจํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๊ฐœ๋…์— ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ์ธํ„ฐ๋„ท์—๋Š” ์ถฉ๋ถ„ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ, ๊ทธ๋Ÿฌ๊ณ  ์‹ถ์ง€ ์•Š์•„? ๊ธ€์Ž„์š”, ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ํฐ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํ…Œ์ŠคํŠธ์™€ ์ผ๋ฐ˜์ ์ธ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•„์‹ญ๋‹ˆ๊นŒ? ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๊ฒฐ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ƒํ–ˆ๋˜ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
์•ˆ๋…•ํ•˜์„ธ์š”, ์›”๋“œ JUnit์ž…๋‹ˆ๋‹ค!
JUnit์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ”„๋กœ์ ํŠธ ๊ณต์‹ ์›น์‚ฌ์ดํŠธ ์—์„œ ๋‹ค์Œ ์„ค๋ช…์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
JUnit์€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ xUnit ์•„ํ‚คํ…์ฒ˜์˜ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ์—๊ฒŒ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š” ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ฒฐ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•˜๊ณ  ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์•Œ๋ ค์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋ณด์กฐ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋Š” int ์œ ํ˜•์˜ ๋‘ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ ๊ทธ ํ•ฉ๊ณ„๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. JavaRush์šฉ JUnit ๋˜๋Š” ์ง‘์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.  - 1 ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ…Œ์ŠคํŠธํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์„ ํ˜ธํ•˜๋Š” IDEA์—๋Š” ์‹ ์†ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์„ ์–ธ ์ค„์— ์ปค์„œ๋ฅผ ๋†“๊ณ  "Alt + Enter"๋ฅผ ๋ˆ„๋ฅด๊ณ  ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด์—์„œ "ํ…Œ์ŠคํŠธ ์ƒ์„ฑ"์„ ์„ ํƒํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค JavaRush์šฉ JUnit ๋˜๋Š” ์ง‘์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.  - 2 . ํ…Œ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ IDEA์—์„œ๋Š” ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์ด ์ž๋ฃŒ์—์„œ๋Š” JUnit4๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค๋ฅผ ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด "์ˆ˜์ •" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์•ผ ํ•จ), ํ…Œ์ŠคํŠธํ•  ๋ฉ”์„œ๋“œ ๋ฐ ์ถ”๊ฐ€ ํ•ญ๋ชฉ์„ ์„ ํƒํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜. JavaRush์šฉ JUnit ๋˜๋Š” ์ง‘์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.  - ์‚ผ IDE๋Š” ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JavaRush์šฉ JUnit ๋˜๋Š” ์ง‘์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.  - 4 ๋ฉ”์„œ๋“œ ๋ณธ๋ฌธ๋งŒ ์ฑ„์šฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค. JUnit์—์„œ ์ œ๊ณตํ•˜๋Š” ์†Œ์œ„ "์–ด์„ค์…˜(Assertions)" ๋ฉ”์†Œ๋“œ๊ฐ€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค . ๋‹จ์ˆœํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ด๋“ค์˜ ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: ์˜ˆ์ƒ ๊ฒฐ๊ณผ์™€ ํ…Œ์ŠคํŠธ ์ค‘์ธ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๊ฐ€ .assert* ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํŽธ์˜๋ฅผ ์œ„ํ•ด ์„ค๋ช… ๋ฉ”์‹œ์ง€๋ฅผ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ค‘์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์‹คํ–‰์„ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Ctrl+Shift+F10 ํ‚ค ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค JavaRush์šฉ JUnit ๋˜๋Š” ์ง‘์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.  - 5
์ž‘์—…์„ ์ง€์ •ํ•˜์ž
์ด๋ก ์ ์œผ๋กœ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๊ณ  ์•„๋ฆ„๋‹ต์ง€๋งŒ ์ œ์•ˆ๋œ ์˜ˆ์˜ ๋งฅ๋ฝ์—์„œ๋Š” ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ์ปดํ“จํ„ฐ๊ฐ€ ๋‘ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๋ฏฟ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” JavaRush ํ•™์ƒ๋“ค์ด ํ•ด๊ฒฐํ•œ ์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€์— ๋” ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ €๋Š” ์‚ฌ๋ž‘๋ฐ›๋Š” level05.lesson12.bonus03์„ ์ˆ˜๊ฐ•ํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
/* ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”: 1. ์ฝ˜์†”์—์„œ ์ˆซ์ž N > 0์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. 2. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฝ˜์†”์—์„œ N ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. 3. ์ž…๋ ฅ๋œ N ์ˆซ์ž์˜ ์ตœ๋Œ€๊ฐ’์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */
์–‘์ˆ˜, ์Œ์ˆ˜ ๋ฐ ํ˜ผํ•ฉ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ์„ธ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ˆฒ์†์œผ๋กœ ๋“ค์–ด๊ฐˆ์ˆ˜๋ก..
์—ฌ๊ธฐ์„œ ๋ช‡ ๊ฐ€์ง€ ๋†€๋ผ์›€์ด ์šฐ๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. public class UtilApp { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); //ะฝะฐะฟะธัˆะธั‚ะต ะทะดะตััŒ ะฒะฐัˆ code int n; int maximum; /* ะšะพะฝะตั‡ะฝะพ ะถะต ั ะฝะต ะฑัƒะดัƒ ั€ะฐะทะผะตั‰ะฐั‚ัŒ ั€ะตัˆะตะฝะธะต ะทะฐะดะฐั‡ะธ ;) ะšะพะด ะฟั€ะธะฒะตะดะตะฝะฝั‹ะน ั‚ัƒั‚ ะฟะตั€ะตั€ะฐะฑะพั‚ะฐะฝ ะดะปั ะฝะฐะณะปัะดะฝะพัั‚ะธ, ะธ ะฝะต ะฒ ะบะพะตะผ ัะปัƒั‡ะฐะต ะฝะต ะพะทะฝะฐั‡ะฐะตั‚ ั‡ั‚ะพ ะพะฝ ะดะพะปะถะตะฝ ะฟั€ะธััƒั‚ัั‚ะฒะพะฒะฐั‚ัŒ ะฒ "ะฟั€ะฐะฒะธะปัŒะฝะพะผ ั€ะตัˆะตะฝะธะธ" */ System.out.println(maximum); } }
  • ํ”„๋กœ๊ทธ๋žจ ๋กœ์ง์€ main() ๋ฉ”์†Œ๋“œ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์Šค ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋˜์ง€ ์•Š๊ณ  ํ‚ค๋ณด๋“œ์—์„œ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค.
  • main() ๋ฉ”์„œ๋“œ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ์š”์ ์ด ํŠน๋ณ„ํžˆ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด(ํ‰์†Œ์ฒ˜๋Ÿผ main() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ), ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์š”์ ์€ ์ฃผ์ œ์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด ๋‘๋‡Œ๋ฅผ ๊ธด์žฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
  1. ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๋Š” ๋…ผ๋ฆฌ๋ฅผ ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ์žฅ์ : ๋ฆฌํŒฉํ† ๋ง ์ธก๋ฉด์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹
    • ๋‹จ์ : ํ”„๋กœ๊ทธ๋žจ์€ ์ฝ”๋“œ, ๋ถˆํ•„์š”ํ•œ ๊ตฌ์กฐ, ์ตœ์†Œํ•œ ๋ฐฐ์—ด ๋˜๋Š” ArrayList๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค(์ทจํ–ฅ๊ณผ ์ƒ‰์ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„...). ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜๋งŒ ํ…Œ์ŠคํŠธ๋˜๋ฉฐ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ์€ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. System.in/System.out์šฉ ๋ž˜ํผ ์ž‘์„ฑ.
    • ์žฅ์ : ์šฐ๋ฆฌ๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๋‹จ์ : ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๊ตฌํ˜„์˜ ์ƒ๋Œ€์  ๋ณต์žก์„ฑ, ํ…Œ์ŠคํŠธ์˜ ์ฝ”๋“œ ์–‘์€ ํ…Œ์ŠคํŠธ ์ค‘์ธ ์ž‘์—…์˜ ์ฝ”๋“œ ์–‘๋ณด๋‹ค ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์žฅ์ : ํ…Œ์ŠคํŠธ์˜ ์ฝ”๋“œ๊ฐ€ ๊นจ๋—ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ค‘์ธ ํด๋ž˜์Šค์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๋‹จ์ : ํ”„๋กœ์ ํŠธ์— ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์†”์งํžˆ ์ €๋Š” ์„ธ ๋ฒˆ์งธ ์˜ต์…˜์ด ๊ฐ€์žฅ ๋งˆ์Œ์— ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ ๊ตฌํ˜„ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์‹œ์Šคํ…œ ๊ทœ์น™
์งง์€ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด http://stefanbirkner.github.io/system-rules/ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ–ˆ๊ณ  , ์ด๊ฒƒ์ด ๋‚˜์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์ž„์„ ์ฆ‰์‹œ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.
java.lang.System์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ JUnit ๊ทœ์น™ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด ๋ด…์‹œ๋‹ค . ์‹œ์Šคํ…œ ๊ทœ์น™์ด ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ Commons IO ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค . ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•˜๊ณ (ํŒŒ์ผ -> ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ -> ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -> + -> Java) ์กฐ๊ฐ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ ํ›„ ์ž‘์—…์€ ์ฝ˜์†”์—์„œ N+1 ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฅผ ๋”ฐ๋ผ๊ฐˆ ์ˆซ์ž๋Š” ์–ผ๋งˆ๋‚˜ ๋ ๊นŒ์š”? ์‹œ์Šคํ…œ ๊ทœ์น™์—์„œ๋Š” TextFromStandardInputStream ํด๋ž˜์Šค๊ฐ€ ์ด๋Ÿฌํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ด ์œ ํ˜•์˜ ํ•„๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•˜๊ณ  @Rule ์ฃผ์„์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ์—์„œ ์ง์ ‘ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. systemInMock.provideText("4\n2\n6\n1\n3\n"); ๋ณด์‹œ๋‹ค์‹œํ”ผ ์ˆซ์ž๋Š” ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ „์†ก๋˜๋ฉฐ ํ•˜์ดํ”ˆ ๋ฌธ์ž์—ด "\n"์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ N์€ 4์™€ ๊ฐ™์„ ๊ฒƒ์ด๋ฉฐ ์ˆซ์ž {2, 6, 1, 3}์—์„œ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ค‘์ธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  main() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์€ systemInMock์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์ธ์‡„ํ•˜๋ฉฐ, ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ๊ทธ๊ฒƒ์„ ์ฝ๊ณ  ํ‘œ์ค€๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์‹œ์Šคํ…œ ๊ทœ์น™์€ StandardOutputStreamLog ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ์œ ํ˜•์˜ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); .getLog() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์‡„๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐœํ–‰ ๋ฌธ์ž์˜ ์กด์žฌ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฉฐ ์ตœ์ข… ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); // or assertEquals("{2, 6, 1, 3}, max = 6", "6\r\n", log.getLog()); . ๋ฐ์ดํ„ฐ ๊ณ„์ธตํ™”๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ๋กœ๊ทธ๋ฅผ ์ง€์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. log.clear(); ๋‚ด ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ์ „์ฒด ํ…์ŠคํŠธ: import org.junit.Rule; import org.junit.Test; import org.junit.contrib.java.lang.system.StandardOutputStreamLog; import org.junit.contrib.java.lang.system.TextFromStandardInputStream; import static org.junit.Assert.*; import static org.junit.contrib.java.lang.system.TextFromStandardInputStream.emptyStandardInputStream; public class UtilAppTest { @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); @Test public void testAddition() throws Exception { systemInMock.provideText("4\n2\n6\n1\n3\n"); UtilApp utilApp = new UtilApp(); utilApp.main(new String[]{}); assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); systemInMock.provideText("5\n-100\n-6\n-15\n-183\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{-100, -6, -15, -183, -1}, max = -1", "-1", log.getLog().trim()); systemInMock.provideText("3\n2\n0\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{2, 0, -1}, max = 2", "2", log.getLog().trim()); } } ์šฐ๋ฆฌ๋Š” ์‹œ์ž‘ํ•˜๊ณ  ์ฆ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -=!!! ์ค‘์š”!!!=- ์ด ์ž๋ฃŒ๋Š” ์ •๋ณด ์ œ๊ณต์˜ ๋ชฉ์ ์œผ๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…๊ณผ ํ•จ๊ป˜ ํŒจํ‚ค์ง€์— ๊ด€๋ จ ์—†๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ ์ž‘์—…์˜ ์„ฑ๊ณต์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•์ธ ์ž‘์—…์„ ์„œ๋ฒ„์— ๋ณด๋‚ด๊ธฐ ์ „์— ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ, ๋ถˆํ•„์š”ํ•œ ํด๋ž˜์Šค, ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ ๋“ฑ ๋ถˆํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค. ์ƒ์„ฑํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„์—์„œ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜๋„์ ์œผ๋กœ ์ด๋ก ์  ์ž๋ฃŒ(๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ด๋ก , JUnit ์ฃผ์„, ์ฃผ์žฅ ๋“ฑ)๋ฅผ ์”น์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž๋ฃŒ๋Š” ํ…์ŠคํŠธ์— ์ œ๊ณต๋œ ๋งํฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์—ฌ๋Ÿฌ๋ถ„์€ ์ž‘์—…์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ž์‹ ๋งŒ์˜ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜๊ฒฌ์„ ํ†ตํ•ด ์ด์— ๋Œ€ํ•ด ๊ธฐ๊บผ์ด ๋…ผ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION