JiwonDev

[์ฝ”๋“œ๋ถ„์„ ๋„๊ตฌ]# 1 ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ž€?

by JiwonDev

* ์ธ๋„ค์ผ ์ด๋ฏธ์ง€๋Š” ๋งˆ๋•…ํ•œ๊ฒŒ ์—†์–ด์„œ ์  ํ‚จ์Šค๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

# ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€(Code Coverage)๋ž€?

์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ถฉ์กฑ๋˜์—ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ ์ค‘ ํ•˜๋‚˜.

ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€์„ ๋•Œ '์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์–ผ๋งˆ๋‚˜ ์‹คํ–‰๋˜์—ˆ๋Š”๊ฐ€' ์— ๋Œ€ํ•œ ์ˆ˜์น˜.

 


@ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ์–ด๋–ป๊ฒŒ ์ธก์ •ํ• ๊นŒ?

  • ๋ธ”๋ž™๋ฐ•์Šค ํ…Œ์ŠคํŠธ
    - ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ, ์›๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ ๋™์ž‘์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ์‹
    - ์‚ฌ์šฉ์ž ๊ด€์ ์˜ ํ…Œ์ŠคํŠธ. ์ด์ƒํ•œ ๊ฐ’์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ์ถœ๋ ฅ์ด ๋‚˜์˜ค๋Š”๊ฐ€?

  • ํ™”์ดํŠธ๋ฐ•์Šค ํ…Œ์ŠคํŠธ
    - ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ๋™์ž‘์„ ๊ฒ€์‚ฌํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹.
    - ๊ฐœ๋ฐœ์ž์˜ ๊ด€์ ์—์„œ ์†Œํ”„ํŠธ์›จ์–ด ๋‚ด๋ถ€์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ

 


@ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ธฐ์ค€๊ฐ’์€ ์–ด๋–ค๊ฒƒ์ด ์žˆ์„๊นŒ?

  • ๊ตฌ๋ฌธ(Statement) ๋˜๋Š” ๋ผ์ธ(Line) ์ปค๋ฒ„๋ฆฌ์ง€
    - ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๋กœ์ง(์‹œ๋‚˜๋ฆฌ์˜ค)๋ฅผ ํ™•์ธํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€๋Š” ํ™•์ธ ๊ฐ€๋Šฅํ•œ ์ง€ํ‘œ
    - ํ•˜์ง€๋งŒ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก๊ฒŒ๋˜๋ฉด ์ปจ๋ฒค์…˜์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค -> ๋ฐ”์ดํŠธ์ฝ”๋“œ ๊ตฌ๋ฌธ ์ปค๋ฒ„๋ฆฌ์ง€ ์‚ฌ์šฉ
// ํ…Œ์ŠคํŠธ์—์„œ ์ „์ฒด(100%) ์ฝ”๋“œ ์ค‘, ๋ช‡ ๋ผ์ธ์ด ์‹คํ–‰๋˜๋Š”๊ฐ€?
// 4๊ฐœ์˜ ๋ผ์ธ์ค‘ 3๊ฐœ๊ฐ€ ์‹คํ–‰๋ฌ๋‹ค๋ฉด ๊ตฌ๋ฌธ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” 75% (3/4)
void foo (int x) {
    system.out("start line"); // ํ…Œ์ŠคํŠธ 1๋ฒˆ
    if (x > 0) { // ํ…Œ์ŠคํŠธ 2๋ฒˆ
        system.out("middle line"); // ํ…Œ์ŠคํŠธ 3๋ฒˆ
    }
    system.out("last line"); // ํ…Œ์ŠคํŠธ 4๋ฒˆ
}

 

 

  • ์กฐ๊ฑด(Condition) ์ปค๋ฒ„๋ฆฌ์ง€
    - ์กฐ๊ฑด๋ฌธ์˜ ๋‚ด๋ถ€์กฐ๊ฑด(if)๊ฐ€ ์ด์ƒํ•œ ๊ฐ’์ด ์•„๋‹Œ true, false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ง€ํ‘œ
// ๋ชจ๋“  ์กฐ๊ฑด์‹์˜ ๋‚ด๋ถ€์กฐ๊ฑด(if)์•  ๋Œ€ํ•ด ์ปจ๋””์…˜ ๊ฐ’์ด true ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ
// ๋‹จ, ์กฐ๊ฑด์ด ์˜๋ฏธ์—†๋Š” ๊ฒฝ์šฐ(๋ฌด์กฐ๊ฑด true)๋„ ํ…Œ์ŠคํŠธ ์„ฑ๊ณต์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Œ.
void foo (int x, int y) {
    system.out("start line");
    if (x > 0 && y < 0) { // ํ…Œ์ŠคํŠธ. x,y ์—ฌ๋Ÿฌ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋ฉฐ true or false๊ฐ€ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธ
        system.out("middle line");
    }
    system.out("last line");
}

 

  • ๊ฒฐ์ •(Decision) ์ปค๋ฒ„๋ฆฌ์ง€ ๋˜๋Š” ๋ธŒ๋ Œ์น˜(Branch) ์ปค๋ฒ„๋ฆฌ์ง€
    - ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ ๋ชจ๋“  ์กฐ๊ฑด์‹์ด true, false๋ฅผ ๋‘˜ ๋‹ค ๊ฐ€์ ธ์•ผํ•จ. ์ฆ‰ ๋กœ์ง์— ๋”ฐ๋ผ ์‹คํ–‰ํ๋ฆ„์ด ๋ณ€ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ง€ํ‘œ
    - ๋‹จ ์กฐ๊ฑด๋ฌธ์ด ์—†์œผ๋ฉด ์•„์˜ˆ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Œ. => ๊ทธ๋ž˜์„œ ๋ผ์ธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉ.

 


@ ์ด๊ฒŒ ์™œ ์ค‘์š”ํ•˜์ฃ ?

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ์ž‘์„ฑ๋˜์–ด์•ผํ•œ๋‹ค. ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ํ†ตํ•œ ํ…Œ์ŠคํŠธ์˜ ์ˆ˜์น˜ํ™”๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋†“์นœ ๋กœ์ง์˜ ํ๋ฆ„์ด๋‚˜ ์ฝ”๋“œ๋ฅผ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

์‹ค์ œ ํ˜„์—…์—์„œ๋„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ค‘์š”์„ฑ์„ ์ธ์ง€ํ•˜๊ณ , ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ๋„๊ตฌ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ์†Œ๋‚˜ํ๋ธŒ(SonarQube)์™€ ๊ฐ™์€ ์ •์  ์ฝ”๋“œ ๋ถ„์„๋„๊ตฌ๋Š” ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ’์ด ๊ธฐ์กด๋ณด๋‹ค ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ ์ปค๋ฐ‹ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์‹œ๊ฐ„์—๋Š” Jacoco์™€ SonarQube๋ฅผ ์ž๋ฐ” ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ณด์ž

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ