안드로이드에서 유닛 테스트를 실행하는 방법은 다음과 같습니다. 안드로이드 유닛 테스트는 앱의 비즈니스 로직을 작은 단위로 테스트하는 것이며, 안드로이드 프레임워크를 사용할 필요 없이 JVM 상에서 실행됩니다. 주요 도구로는 JUnit과 Mockito가 있습니다. 아래에 안드로이드에서 유닛 테스트를 작성하고 실행하는 기본적인 단계를 설명하겠습니다.
1. 환경 설정
Gradle 의존성 추가
먼저, 프로젝트의 build.gradle
파일에 유닛 테스트에 필요한 의존성을 추가해야 합니다. 보통 app
모듈의 build.gradle
파일에 아래와 같은 설정을 추가합니다:
// build.gradle (Module: app)
dependencies {
// 기존의 다른 의존성들...
// JUnit
testImplementation 'junit:junit:4.13.2'
// Mockito
testImplementation 'org.mockito:mockito-core:4.5.1'
// 안드로이드 테스트
testImplementation 'androidx.test.ext:junit:1.1.3'
testImplementation 'androidx.test:core:1.4.0'
}
2. 테스트 클래스 작성
테스트 클래스는 보통 src/test/java
디렉토리 아래에 위치합니다. 예를 들어 MainActivityTest.java
같은 파일을 작성할 수 있습니다.
3. 기본적인 JUnit 테스트
JUnit을 사용하여 간단한 테스트를 작성해보겠습니다. Calculator
라는 간단한 클래스의 테스트를 작성한다고 가정합니다.
// src/main/java/com/example/Calculator.java
package com.example;
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
테스트 클래스를 작성합니다.
// src/test/java/com/example/CalculatorTest.java
package com.example;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
int result = calculator.add(2, 3);
assertEquals(5, result);
}
}
위의 테스트 클래스는 JUnit을 사용하여 Calculator
클래스의 add
메서드를 테스트합니다. @Test
애노테이션을 통해 테스트 메서드를 표시하고, assertEquals
를 사용하여 기대되는 결과를 확인합니다.
- Android Studio: 테스트 클래스나 메서드를 마우스 오른쪽 버튼으로 클릭하고, "Run 'testName'"을 선택합니다.
- 명령어 라인: 프로젝트의 루트 디렉토리에서 ./gradlew test 명령어를 실행합니다.
4. Mockito를 사용한 Mock 객체 테스트
Mockito는 외부 의존성을 가짜(Mock) 객체로 대체하여 테스트할 수 있게 해줍니다. 아래는 UserService
라는 클래스가 데이터베이스에서 데이터를 가져온다고 가정하고, 이를 Mockito를 사용하여 테스트하는 예제입니다.
UserService 외에 테스트에 필요한 Class는 Interface를 통해서 가상화 합니다.
테스트 전에 Class를 미리 만들고 Test 직전에 호출되는 Member 변수는 whe().thenReturn()으로 미리 반환 값을 설정해서 테스트 시 사용합니다.
- User 클래스 작성
// src/main/java/com/example/User.java
package com.example;
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
- UserRepository 클래스 작성
// src/main/java/com/example/UserRepository.java
package com.example;
public interface UserRepository {
User findById(int id);
}
- UserService 클래스 작성
// src/main/java/com/example/UserService.java
package com.example;
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public String getUserName(int userId) {
User user = userRepository.findById(userId);
return user != null ? user.getName() : "Unknown";
}
}
- UserServiceTest 클래스 작성
// src/test/java/com/example/UserServiceTest.java
package com.example;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
public class UserServiceTest {
@Mock
private UserRepository userRepository;
private UserService userService;
@Before
public void setUp() {
MockitoAnnotations.openMocks(this);
userService = new UserService(userRepository);
}
@Test
public void testGetUserName() {
User user = new User(1, "John Doe");
when(userRepository.findById(1)).thenReturn(user);
String userName = userService.getUserName(1);
assertEquals("John Doe", userName);
}
@Test
public void testGetUserName_withValidId() {
// Given
User user = new User(1, "John Doe");
when(userRepository.findById(1)).thenReturn(user);
// When
String userName = userService.getUserName(1);
// Then
assertEquals("John Doe", userName);
}
@Test
public void testGetUserName_withInvalidId() {
// Given
when(userRepository.findById(2)).thenReturn(null);
// When
String userName = userService.getUserName(2);
// Then
assertEquals("Unknown", userName);
}
}
여기서 중요한 부분은 다음과 같습니다:
MockitoAnnotations.openMocks(this);
는 Mockito 애노테이션을 초기화합니다.when(userRepository.findById(1)).thenReturn(user);
는userRepository.findById
메서드가 호출될 때 반환할 값을 설정합니다.@Mock
애노테이션을 사용하여UserRepository
인터페이스의 Mock 객체를 만듭니다.- assertEquals는 실제 결과가 기대되는 결과와 같은지 확인합니다.
테스트를 실행하려면 다음 중 하나를 사용할 수 있습니다:
- Android Studio: 테스트 클래스나 메서드를 마우스 오른쪽 버튼으로 클릭하고, "Run 'testName'"을 선택합니다.
- 명령어 라인: 프로젝트의 루트 디렉토리에서
./gradlew test
명령어를 실행합니다.
5. 추가 도구 및 리소스
- Espresso: UI 테스트를 위한 프레임워크.
- Robolectric: 안드로이드의 View 및 리소스를 JVM에서 실행할 수 있게 해주는 테스트 프레임워크.
안드로이드에서 유닛 테스트를 설정하고 사용하는 방법을 요약했습니다. 필요한 경우 테스트 전략을 더욱 확장할 수 있습니다.
'android > Debug' 카테고리의 다른 글
안드로이드 테스트 방법 (0) | 2024.06.10 |
---|