본 포스팅은 우아한 테크 톡을 참고하였습니다.
https://www.youtube.com/watch?v=A0TB7qG-JBE&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=7
단위 테스트란 무엇인가
단위 테스트(Unit Testing)는 소프트웨어 개발에서 중요한 품질 보증 및 테스트 방법 중 하나입니다. 이것은 소프트웨어의 가장 작은 단위, 즉 함수, 메서드 또는 클래스와 같은 개별 컴포넌트를 격리된 환경에서 테스트하는 것을 의미합니다. 각 단위 테스트는 코드의 특정 부분을 검증하고 예상대로 동작하는지 확인하는 것을 목표로 합니다.
대표적인 단위 테스트 프레임워크로는 JUnit(자바), NUnit(C#), pytest(Python) 등이 있습니다.
Mock이란 무엇인가
Mock은 소프트웨어 테스트에서 사용되는 가상 객체로, 주로 다른 객체 또는 컴포넌트와의 상호작용을 모방하거나 검증하기 위해 사용됩니다. Mock 객체는 실제 객체와 유사한 인터페이스를 가지고 있지만 실제 동작을 갖지 않습니다. 대신, Mock 객체는 테스트 중에 호출된 메서드의 호출 여부, 호출 횟수, 전달된 인자 등을 추적하고 기록하는 역할을 수행합니다.
Mock을 왜 사용할까?
- 의존성 관리 : 테스트 중에 실제 객체를 사용하면 의존성 문제가 발생할 수 있다. Mock 객체를 사용하면 의존성을 격리시키고 테스트의 신뢰성을 높일 수 있다.
- 테스트 격리 : 특정 컴포넌트 또는 클래스를 테스트할 때 다른 컴포넌트와의 상호작용을 격리시키려는 경우 Mock 객체를 사용할 수 있다. 이를 통해 특정 컴포넌트의 동작만을 검증할 수 있습니다.
- 예측 및 검증 : Mock 객체를 사용하면 특정 메서드가 예상대로 호출되었는지 또는 호출 횟수를 확인할 수 있으므로 코드의 동작을 검증하거나 테스트를 통해 예측할 수있다.
Mock 객체를 생성하고 사용하는 데 도움이 되는 도구와 라이브러리가 제공된다. 예를들어 Java에서는 Mokito가 제공된다.
Test Double이란 무엇인가
테스트가 어려운 객체를 테스트 할 수 있도록 하는 객체이다. 즉, 특정 컴포넌트를 격리시키고 테스트를 보다 빠르고 효과적으로 수행하기 위한 목적으로 사용된다. 소프트웨어에서는 테스트에서 컴포넌트(ex. 클래스, 모듈, 함수)를 격리시키려면 종종 컴포넌트가 의존하는 다른 컴포넌트를 가짜나 대체로 대체해야한다. TestDouble은 이러한 역할을 수행하는 객체를 일반적으로 가리키는 용어로 사용된다.
Dummy, Spy, Fake, Stub, Mock 등이 있다.
Dummy
인스터스화는 하지만 테스트에 사용되지 않는 객체이다.
Stub
특정 메서드 호출에 대한 고정된 값을 반환하도록 설정된 객체이다.
Spy
실제 객체와 유사하지만 호출된 메서드와 그에 전달된 인자를 기록하고 확인할 수 있는 객체이다.
Mock
특정 메서드 호출 및 그에 대한 인자 및 호출 횟수를 검증하기 위한 객체이다. 메서드가 특정 조건에서 호출되어야 하는지 여부를 확인하는 데 사용된다.
Fake
실제로 동작하는 대체 객체로, 실제 컴포넌트의 일부 기능을 구현한 객체이다.
Mock을 사용해 테스트하기
import static org.mockito.Mockito.*;
// ...
// Mock 객체 생성
MyService myServiceMock = mock(MyService.class);
// Mock 객체가 호출될 때 반환할 값을 정의
when(myServiceMock.getData()).thenReturn("Mocked Data");
// 테스트 대상 클래스 생성 및 Mock 객체 주입
MyClass myClass = new MyClass(myServiceMock);
// 테스트 수행
String result = myClass.getDataFromService();
// 결과 검증
assertEquals("Mocked Data", result);
// Mock 객체의 특정 메서드 호출 여부 검증
verify(myServiceMock).getData();
간단하게 Mokito를 사용하여 테스트한 것이다.
아래는 위 과정에 대한 설명이다.
- 의존성 주입(Dependency Injection): 먼저 테스트 대상 클래스에 의존성 주입 패턴을 구현합니다. 이것은 테스트 대상 클래스가 외부 의존성을 생성하거나 가져오는 대신 의존성을 주입받도록 하는 것을 의미합니다. 이를 통해 Mock 객체를 쉽게 주입할 수 있습니다.
- Mock 라이브러리 사용: Android 앱의 테스트에서는 주로 Mockito 또는 Android-specific Mocking 라이브러리인 Robolectric과 함께 사용할 수 있는 Robolectric의 @Mock 어노테이션을 사용하여 Mock 객체를 생성합니다.
- Mock 객체 생성 및 동작 정의: Mock 객체를 생성하고 실제 동작을 정의합니다. 예를 들어, 외부 서비스 호출을 Mock 객체로 대체하고, 해당 Mock 객체가 호출될 때 예상 결과를 반환하도록 설정할 수 있습니다.
- 테스트 케이스 작성: Mock 객체를 사용하여 테스트 케이스를 작성합니다. 테스트 케이스에서는 테스트 대상 클래스가 Mock 객체와 상호작용할 때 올바른 동작을 수행하는지 검증합니다. 이를 위해 Mockito의 when 및 verify 함수와 같은 메서드를 사용할 수 있습니다.
- 테스트 실행: 테스트를 실행하고 결과를 확인합니다. Android Studio에서는 테스트를 실행하고 결과를 보고 분석할 수 있는 테스트 러너를 제공합니다.
'Android > Study' 카테고리의 다른 글
[Android] 로그인 기능 구현 (1) - Activity (0) | 2023.10.26 |
---|---|
[Android] 로그인 화면 구성 및 디자인 (0) | 2023.10.25 |
[Android] ViewBinding(뷰 바인딩) 정리 (0) | 2023.09.23 |
[Android] EditTextView 간단 정리 (0) | 2023.09.23 |
[Android] TextView 정리 (0) | 2023.09.23 |