웹 애플리케이션을 개발할 때, "이게 제대로 작동하는 걸까?"라는 고민, 한 번쯤 해보셨죠? 코드가 엉키면 예상치 못한 버그가 터지고, 유지보수도 엄청 힘들어질 수 있어요. 그래서 테스트는 필수입니다! 오늘은 Java 웹 애플리케이션을 보다 쉽고 효율적으로 테스트하는 방법을 알려드릴게요. JUnit과 Mockito를 활용한 단위 테스트 작성법부터, JaCoCo와 SonarQube를 이용한 코드 커버리지 분석, 그리고 Jenkins를 활용한 자동화까지! 제가 직접 겪었던 시행착오와 팁도 함께 소개할 테니, 부담 없이 읽어주세요. 😊
JUnit과 Mockito로 단위 테스트 쉽게 하기
JUnit과 Mockito, 꼭 필요할까요?
개발하면서 "내 코드, 정말 제대로 동작하는 거 맞아?"라고 의심해본 적 있으시죠? JUnit은 Java에서 가장 많이 쓰이는 테스트 프레임워크고, Mockito는 외부 의존성을 쉽게 가짜(Mock)로 만들어서 테스트를 편하게 해주는 도구예요. 둘을 함께 쓰면, 서블릿이나 컨트롤러 같은 웹 애플리케이션의 핵심 부분을 간단하게 테스트할 수 있답니다.
필요한 라이브러리 추가하기
테스트를 시작하려면 프로젝트에 필요한 라이브러리를 추가해야 해요.
Maven을 사용 중이라면?
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.0.0</version>
<scope>test</scope>
</dependency>
</dependencies>
Gradle을 사용 중이라면?
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testImplementation 'org.mockito:mockito-core:4.0.0'
}
서블릿 테스트, 생각보다 간단해요!
서블릿 테스트할 때 제일 헷갈리는 부분이 HTTP 요청과 응답이죠. Tomcat 같은 웹 컨테이너가 자동으로 처리해주는 걸 직접 다루려면 복잡할 수 있는데, 다행히 Mockito를 쓰면 이걸 쉽게 가짜로 만들 수 있어요.
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.RequestDispatcher;
public class MyServletTest {
private MyServlet myServlet;
@Mock private HttpServletRequest request;
@Mock private HttpServletResponse response;
@Mock private RequestDispatcher dispatcher;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
myServlet = new MyServlet();
}
@Test
void testDoGet() throws Exception {
when(request.getRequestDispatcher("/home.jsp")).thenReturn(dispatcher);
myServlet.doGet(request, response);
verify(request).getRequestDispatcher("/home.jsp");
verify(dispatcher).forward(request, response);
}
}
이제 doGet
메서드가 /home.jsp
로 정상적으로 포워딩되는지 확인할 수 있어요. 어렵지 않죠?
JaCoCo로 코드 커버리지 체크하기
JaCoCo는 코드가 얼마나 테스트되고 있는지 보여주는 강력한 도구예요. 테스트를 작성했다고 끝이 아니라, 실제로 코드의 어느 부분이 실행되고 있는지도 확인해야 하거든요.
Gradle에서 JaCoCo 설정하기
build.gradle
파일에 JaCoCo 플러그인을 추가하세요.
plugins {
id 'jacoco'
}
test {
useJUnitPlatform()
finalizedBy jacocoTestReport
}
jacocoTestReport {
dependsOn test
reports {
xml.required = true
html.required = true
}
}
JaCoCo 리포트 실행하기
테스트 커버리지 보고서를 만들려면 아래 명령어를 실행하면 돼요.
gradle test jacocoTestReport
결과는 build/reports/jacoco/test/html/index.html
에서 확인할 수 있어요.
SonarQube로 코드 품질 점검하기
SonarQube는 보안 문제, 코드 스멜(Code Smell), 유지보수성을 분석해주는 툴이에요. 간단히 말해, "내 코드가 얼마나 깔끔하고 유지보수하기 쉬운가?"를 평가하는 거죠.
SonarQube 설치하고 설정하기
SonarQube는 공식 사이트에서 다운로드 후 실행하면 돼요.
./sonarqube/bin/linux-x86-64/sonar.sh start
Gradle에서 SonarQube 설정하기
build.gradle
파일에 아래 설정을 추가하면 됩니다.
plugins {
id 'org.sonarqube' version '4.0.0'
}
sonarqube {
properties {
property "sonar.projectKey", "MyJavaProject"
property "sonar.host.url", "http://localhost:9000"
property "sonar.login", "admin"
property "sonar.password", "admin"
}
}
SonarQube 분석을 실행하려면 다음 명령어를 입력하세요.
gradle sonarqube
Jenkins로 자동화까지!
Jenkins는 CI/CD 자동화 도구로, 반복적인 빌드와 테스트를 자동으로 실행해 줘요. 귀찮은 작업은 컴퓨터에게 맡기고, 개발에 집중하면 됩니다!
Jenkins 설치하기
Jenkins는 공식 사이트에서 다운로드하고 실행하면 돼요. Gradle과 SonarQube 플러그인을 추가하면 활용도가 더욱 높아져요.
Jenkins 파이프라인 만들기
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://github.com/your-repo.git'
}
}
stage('Build & Test') {
steps {
sh './gradlew test'
}
}
stage('Code Coverage') {
steps {
sh './gradlew jacocoTestReport'
}
}
stage('Static Analysis') {
steps {
sh './gradlew sonarqube'
}
}
}
}
마무리
JUnit, Mockito, JaCoCo, SonarQube, 그리고 Jenkins까지! 이 툴들을 잘 활용하면, 개발이 훨씬 더 편하고 안정적이 될 거예요. 혹시 궁금한 점이 있거나 더 알고 싶은 내용이 있다면, 댓글로 남겨 주세요! 같이 고민하고 해결해봐요. 😊
'SW > Gradle' 카테고리의 다른 글
Gradle: 환경에서 서블릿 테스트하기: JUnit과 Mockito 사용법 (0) | 2025.02.24 |
---|---|
Gradle: JUnit과 Mockito 설정하는 방법, 예제 (0) | 2025.02.23 |
Gradle: Dependency Analysis, 쉽게 이해하기: Subproject와 Transitive Dependency 방법, 예제 (0) | 2025.02.21 |
Gradle: 대규모 Project Build와 Dependency 관리 방법, 예제 (0) | 2025.02.20 |
Gradle: Properties 쉽게 정리하기 | Subproject 설정과 빌드 최적화 (0) | 2025.02.19 |