본문 바로가기

android/Debug

[ 안드로이드 / Android ] JUnit으로 Unit 테스트를 해보자.

반응형

 

 

 

안드로이드에서 유닛 테스트를 실행하는 방법은 다음과 같습니다. 안드로이드 유닛 테스트는 앱의 비즈니스 로직을 작은 단위로 테스트하는 것이며, 안드로이드 프레임워크를 사용할 필요 없이 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