🌱Backend/Java

[μ½”λ“œλΆ„μ„ 도ꡬ]# 1 μ½”λ“œ μ»€λ²„λ¦¬μ§€λž€?

JiwonDev 2021. 8. 21. 13:50

* 썸넀일 μ΄λ―Έμ§€λŠ” λ§ˆλ•…ν•œκ²Œ μ—†μ–΄μ„œ μ  ν‚¨μŠ€λ₯Ό 같이 μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆλ‹€.

 

# μ½”λ“œ 컀버리지(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λ₯Ό μžλ°” μŠ€ν”„λ§ ν”„λ‘œμ νŠΈμ— μ μš©ν•˜λŠ” 방법을 λ°°μ›Œλ³΄μž