밤빵's 개발일지
[TIL]20240810 단위테스트란? 본문
원래는 기술매니저님이 말씀해주신 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 |