Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240810 단위테스트란? 본문

개발Article

[TIL]20240810 단위테스트란?

최밤빵 2024. 8. 10. 21:22

원래는 기술매니저님이 말씀해주신 N+1문제해결에대해 개발일지를 쓰려고했는데, 예전 개발일지에서 몇번 본 얕게 아는 수준이라 아직은 정리하기에 부족해서 예전 조에 있던 멘토님이 지나가듯 말씀해주신 단위테스트에 대해서 먼저 작성하기로 했다! 

단위 테스트(Unit Testing)는 소프트웨어 개발에서 코드의 작은 부분, "단위(Unit)"를 독립적으로 테스트하는 것을 의미한다. 일반적으로 이 단위는 메서드나 함수와 같은 작은 코드 조각을 말하며, 단위 테스트는 이러한 코드가 제대로 작동하는지를 검증하기 위해 수행된다. 단위 테스트는 초기 개발 단계에서 버그를 발견하고, 코드 변경 시 발생할 수 있는 문제를 조기에 파악할 수 있도록 도와준다.

🤓단위 테스트(Unit Testing)?

단위 테스트는 소프트웨어 개발 과정에서 가장 작은 코드 단위를 독립적으로 검증하는 테스트 방법이다. 주로 작성한 특정 메서드나 기능이 기대한 대로 작동하는지 확인하는 데 중점을 둔다. 이러한 테스트는 보통 테스트 프레임워크(예: JUnit, TestNG)를 사용하여 자동화된다.

 

▶단위 테스트의 개념

단위 테스트의 목적은 다음과 같다:

 

→ 코드의 정확성 검증:

특정 메서드가 예상대로 작동하는지 확인한다.

→ 빠른 피드백 제공:

코드를 수정하거나 추가할 때 기존 기능이 정상적으로 동작하는지 신속하게 검증할 수 있다.

→ 디버깅 용이성:

코드의 작은 부분을 독립적으로 테스트하므로 문제 발생 시 디버깅이 더 쉽다.

→ 리팩토링 지원:

코드 변경 시 단위 테스트가 자동으로 기존 코드의 기능을 확인하므로, 리팩토링이 더욱 안전하고 효율적이다.

 

▶단위 테스트의 장단점

 

▷장점

→ 빠른 피드백:

개발 단계에서 코드를 수정할 때마다 테스트를 실행해볼 수 있어, 즉각적인 피드백을 얻을 수 있다.

→ 버그 예방:

단위 테스트는 코드가 예상한 대로 작동하는지 검증하기 때문에, 잠재적인 버그를 조기에 발견할 수 있다.

→ 리팩토링 지원:

코드 변경 시 단위 테스트를 통해 기존 기능이 유지되는지 확인할 수 있어, 안전한 리팩토링을 지원한다.

→ 문서화 역할:

잘 작성된 단위 테스트는 코드의 동작 방식을 이해하는 데 큰 도움이 된다. 이는 새로운 개발자가 프로젝트에 빠르게 적응할 수 있게 한다.

→ 자동화 가능:

단위 테스트는 자동화된 테스트 도구를 사용하여 반복적으로 실행할 수 있어, 시간과 노력을 절약할 수 있다.

 

▷단점

→ 초기 작성 시간 소요:

처음 단위 테스트를 작성하는 데 시간이 걸릴 수 있고, 테스트 범위에 따라 많은 양의 테스트 코드를 작성해야 할 수도 있다.

→ 유지 보수 필요:

코드를 수정하면 단위 테스트도 함께 수정해야 하는 경우가 많아 유지 보수 비용이 발생할 수 있다.

→ 테스트 과다로 인한 혼란:

테스트를 너무 많이 작성하거나 비효율적으로 작성하면, 실제 코드보다 테스트 코드 관리가 더 어려워질 수 있다.

→ 외부 의존성 관리 필요:

데이터베이스, 파일 시스템 등 외부 시스템과의 의존성이 있는 경우, 이를 잘 관리해야 테스트가 독립적으로 실행될 수 있다.

 

▶ 단위 테스트의 효율성

단위 테스트는 개발의 효율성을 높이는 중요한 요소 중 하나이다. 단위 테스트를 잘 작성하면 다음과 같은 효율적인 개발이 가능하다:

→ 코드 품질 향상:

테스트 코드를 작성하면서 기능을 다시 한번 생각하게 되므로, 자연스럽게 코드 품질이 향상된다.

→ 변경에 대한 안정성 보장:

코드 수정 시 기존 기능에 영향을 미치는지 단위 테스트를 통해 즉시 확인할 수 있다.

→ 시간 절약:

수동으로 테스트하는 것보다 자동화된 테스트를 사용하는 것이 훨씬 빠르며, 반복적인 테스트 작업에 소요되는 시간을 절약할 수 있다.

→ 비용 절감:

버그를 초기에 발견하고 수정할 수 있기 때문에, 이후에 발생할 수 있는 큰 수정 비용을 줄일 수 있다.

 

▶단위 테스트의 간단한 코드 예시

다음은 Java와 JUnit을 사용한 간단한 단위 테스트 예시이다. 이 예시는 간단한 Calculator 클래스의 add 메서드를 테스트하는 방법을 보여준다.

▽ Calculator 클래스 예시: Calculator.java

public class Calculator {
    // 두 숫자를 더하는 메서드
    public int add(int a, int b) {
        return a + b;
    }
}

 

▽ 단위 테스트 클래스 예시: CalculatorTest.java

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

public class CalculatorTest {

    @Test  // JUnit 테스트 메서드를 나타내는 어노테이션
    public void testAdd() {
        Calculator calculator = new Calculator();  // Calculator 객체 생성
        int result = calculator.add(2, 3);  // add 메서드 테스트 실행
        assertEquals(5, result);  // 기대 결과와 실제 결과가 같은지 확인
    }
}
 

→ @Test: JUnit의 테스트 메서드를 정의하는 어노테이션이다.

→ assertEquals(expected, actual): 예상 값과 실제 값이 같은지 비교한다. 예시에서는 2 + 3의 결과가 5인지를 확인한다.

→ 위의 테스트가 통과하면 Calculator 클래스의 add 메서드가 정상적으로 작동함을 의미한다.

 

▶ 단위 테스트 사용 시 주의사항

→ 테스트 독립성 유지:

각 테스트는 독립적으로 실행될 수 있어야 하며, 테스트 간의 의존성을 없애야 한다.

→ 테스트의 명확성:

테스트는 명확한 목적을 가지고 있어야 한다. 각각의 테스트가 어떤 상황을 검증하는지 알 수 있어야 한다.

→ 커버리지 확인:

테스트 커버리지 도구를 사용하여 얼마나 많은 코드가 테스트되고 있는지 확인할 수 있다. 하지만 커버리지가 높다고 무조건 좋은 것은 아니며, 중요한 기능이 잘 테스트되고 있는지를 확인하는 것이 더 중요하다.

→ 지나친 의존성 피하기:

단위 테스트에서는 데이터베이스나 외부 서비스와 같은 실제 시스템에 의존하지 않도록 해야 한다. 이를 위해 모킹(Mock) 프레임워크(Mockito 등)를 사용하여 외부 의존성을 가짜 객체로 대체할 수 있다.

 

▶정리

단위 테스트는 코드의 신뢰성을 높이고, 유지보수성을 향상시키는 도구이다. 하지만 처음 단위 테스트를 접했을 때는 왜 이 과정을 거쳐야 하는지 이해하기 어려웠다. 단위 테스트를 작성하는 데 드는 시간과 노력에 비해 얻는 이점이 크지 않다고 생각됐기 때문에.. 그러나 개발 과정에서 코드의 안정성을 유지하고, 수정할 때마다 발생할 수 있는 문제를 조기에 발견할 수 있다는 점에서 단위 테스트의 중요성은 큰 것 같다. 

'개발Article' 카테고리의 다른 글

[TIL]20240812 성능최적화  (0) 2024.08.12
[WIL]20240811 Redis  (0) 2024.08.11
[TIL]20240809 Validation  (0) 2024.08.09
[TIL]20240808 SSE와 웹소켓 비교  (0) 2024.08.08
[TIL]20240807 연관관계  (0) 2024.08.07