JUnit이란?
JUnit은 자동화된 테스트를 쉽게 작성하고 실행할 수 있게 해 주며, 테스트 결과를 빠르게 피드백받을 수 있어 개발자들이 선호하는 프레임워크이다.
현재 많이 사용되는 건 JUnit 5이며, 자바 8 이상을 필요로 한다.
단위 테스트
단위란 엄격하게 정해져 있지는 않지만, 일반적으로 클래스 또는 메서드 수준으로 정해진다.
그래서 구현 목표에 맞게 잘 동작하는지 확인하는 것이 중요하다.
단위 테스트의 장점
단위 테스트는 주로 하나의 메서드를 단위로 테스트하기 때문에, 코드를 변경해도 기존에 작성한 테스트 코드만 돌려보면 변경 사항이 기존 기능에 영향을 미쳤는지 빠르게 확인할 수 있다. 이렇게 하면 새로운 기능을 추가하거나 기존 코드를 수정할 때 더 안전하게 작업할 수 있는 장점이 있다.
Annotation의 종류
@Test
해당 메소드가 테스트 메서드임을 나타낸다.
@ParameterizedTest
여러 입력값을 사용해 동일한 테스트를 반복 실행할 수 있도록 해준다.
@DisplayName
이 어노테이션 없이 실행하면 테스트 이름이 함수 이름이 default로 지정되는데,
@DisplayName 어노테이션을 사용하면 읽기 좋은 다른 이름을 부여할 수 있다.
+) 테스트 메서드 명은 한글로 적어도 괜찮다.
@BeforeEach , AfterEach
각 테스트 코드가 시작할 때, 끝날 때마다 동작하는 메서드
간단한 예제
아래의 코드는 BossMonster라는 객체의 동작을 검증하기 위해 작성한 단위 테스트이다. 이 테스트를 통해 객체가 제대로 동작하는지 확인해 볼 수 있다.
public class BossMonster {
private static final int MAX_BOSS_HIT_DAMAGE = 20;
private static final int MIN_BOSS_HP = 100;
private static final int MAX_BOSS_HP = 300;
private final Health health;
private final RandomDamageGenerator randomDamageGenerator;
public BossMonster(Health health, RandomDamageGenerator randomDamageGenerator) {
validateHpRange(health);
this.health = health;
this.randomDamageGenerator = randomDamageGenerator;
}
private void validateHpRange(Health health) {
if (health.isValidHpRange(MIN_BOSS_HP, MAX_BOSS_HP)) {
throw new IllegalArgumentException("[ERROR] 보스 몬스터의 초기 HP의 범위가 유효하지 않습니다.");
}
}
public void attackedByPlayer(AttackType attackType) {
health.spendHp(attackType.getDamage());
}
}
요구 사항에 따른 초기 HP의 범위에 대한 예외처리와 플레이어에게 공격받으면 보스의 HP가 감소하는 attackedByPlayer메서드가 있다.
BossMonsterTest 클래스
이제, BossMonster 객체를 테스트하는 코드를 살펴보자.
@DisplayName("BossMonster")
public class BossMonsterTest {
@ParameterizedTest
@ValueSource(ints = {99, 301})
void 생성자는_100이상_300이하가_아니면_IllegalArgumentException가_발생한다(int hp) {
assertThatThrownBy(() -> new BossMonster(new Health(hp)))
.isInstanceOf(IllegalArgumentException.class);
}
@Test
void attackedByPlayer_메서드는_공격을_받으면_HP를_감소한다() {
Health health = new Health(200);
BossMonster bossMonster = new BossMonster(health);
bossMonster.attackedByPlayer(AttackType.MAGIC);
assertThat(bossMonster.getHealth().getHp()).isEqualTo(180);
}
}
이 테스트 클래스에서는 BossMonster 객체가 올바르게 생성되는지, 플레이어의 공격을 받았을 때 HP가 적절히 감소하는지를 검증하고 있다. 만약 코드를 조금 변경한다고 하더라도 작성해 놓은 테스트코드만 돌려보면 검증이 가능하다.
결론
JUnit을 사용한 단위 테스트의 중요성과 그 장점을 알아보았다. 단위 테스트는 코드의 안정성을 높이고, 예상치 못한 버그를 조기에 발견할 수 있는 강력한 도구다. 특히 JUnit과 같은 테스트 프레임워크를 사용하면 테스트 코드를 체계적이고 간편하게 작성할 수 있어, 개발자가 더 안전하게 코드를 리팩터링 하고 새로운 기능을 추가할 수 있다.
단위 테스트는 단순히 코드의 품질을 높이는 것을 넘어서, 개발자의 자신감을 키워주는 중요한 역할을 한다. 앞으로도 지속적으로 테스트 코드를 작성하고 유지보수하면서, 더 나은 품질의 소프트웨어를 개발하기 위해 노력해야겠다.
'WEB' 카테고리의 다른 글
MDC를 이용한 로깅 도입기 (0) | 2024.09.23 |
---|---|
@SpringBootTest vs @Mock (0) | 2024.09.12 |
스프링부트의 Tomcat과 Thread Pool (0) | 2024.09.10 |
트랜잭션이란? (0) | 2024.09.05 |
RDB와 NoSQL의 차이점 (3) | 2024.09.01 |
영속성 컨텍스트란? (1) | 2024.08.31 |
Java Thread란 무엇일까? (1) | 2024.08.30 |
SubModule이란? (0) | 2024.08.28 |