[flutter] Injectable을 사용하여 플러터 앱의 테스트 코드 작성 성능 향상하기

앱 개발 과정에서 테스트는 매우 중요한 부분입니다. 테스트 코드를 작성하여 앱의 정확성과 안정성을 검증하는 것은 앱의 품질 향상에 큰 기여를 합니다. 하지만, 대규모 플러터 앱을 테스트하는 경우, 종속성 관리와 테스트 성능에 대한 고려가 필요합니다.

이번 기사에서는 Injectable을 사용하여 플러터 앱의 테스트 코드 작성 성능을 향상하는 방법을 알아보겠습니다. Injectable은 종속성 주입(Dependency Injection)을 지원하는 라이브러리로, 테스트용 종속성을 쉽게 제공하고 모의 객체(Mock Object)를 생성할 수 있게 해줍니다.

Injectable이란?

Injectable은 플러터 앱에서 종속성 주입을 편리하게 해주는 패키지입니다. 이 패키지는 @injectable, @singleton 등의 주석을 사용하여 종속성을 정의하고, 앱 전체에서 이용 가능한 싱글톤 종속성을 생성할 수 있습니다.

Injectable을 사용하면, 테스트용 종속성을 제공하기 위해 Mock Object를 쉽게 만들 수 있습니다. 이를 통해 테스트 코드를 작성할 때 실제 종속성(네트워크 호출, 데이터베이스 접근 등)을 가짜 객체로 대체하여 테스트 시간을 단축할 수 있습니다.

사용 방법

먼저, injectable 패키지를 프로젝트에 추가해야 합니다. pubspec.yaml 파일에 다음과 같이 패키지를 추가합니다:

dependencies:
  injectable: ^1.0.1

dev_dependencies:
  injectable_generator: ^1.0.1
  build_runner: ^1.12.2

패키지를 추가한 후, main.dart 파일에서 configureInjection 함수를 호출해야 합니다. 이 함수는 모든 종속성을 설정하는 역할을 합니다:

import 'package:injectable/injectable.dart';
import 'injection.config.dart';

Future<void> main() async {
  configureInjection(Environment.prod);
  runApp(MyApp());
}

이제 종속성을 정의하는 단계입니다. 종속성을 정의할 클래스에 @injectable 주석을 추가하세요. 기본적으로 Injectable은 모든 클래스를 싱글톤으로 인식하므로, 필요한 경우 @singleton 주석을 추가하여 싱글톤으로 등록할 수 있습니다.

import 'package:injectable/injectable.dart';

@injectable
class MyService {
  void doSomething() {
    print('Do something');
  }
}

@injectable
@singleton
class ApiService {
  void fetchData() {
    print('Fetching data from API');
  }
}

이제 테스트 코드를 작성할 준비가 되었습니다. test 폴더에 새로운 파일을 만들고, 기존 종속성을 모의 객체로 대체하는 방법을 알아보겠습니다:

import 'package:injectable/injectable.dart';
import 'package:mockito/mockito.dart';

@Injectable(as: MyService)
class MockMyService extends Mock implements MyService {}

void main() {
  configureInjection(Environment.test);

  MockMyService mockService;

  setUp(() {
    mockService = MockMyService();
    when(mockService.doSomething()).thenReturn('Mocked result');
  });

  test('Test my service', () {
    MyService myService = getIt<MyService>();

    expect(myService.doSomething(), 'Mocked result');
  });
}

위의 테스트 코드에서는 MockMyService 클래스를 만들어 기존 MyService 클래스 대신 사용하고 있습니다. Mockito 패키지를 사용하여 mockService 객체를 생성하고 원하는 동작을 정의한 후, 테스트에서 이를 활용하였습니다.

이제 테스트를 실행하면, 실제 종속성을 사용하지 않고 모의 객체로 대체하여 테스트 코드를 작성할 수 있습니다.

결론

Injectable을 사용하면 플러터 앱의 테스트 코드 작성 성능을 향상시킬 수 있습니다. 테스트용 종속성을 제공하고 모의 객체를 생성하여 실제 종속성을 사용하지 않고 테스트할 수 있기 때문입니다. 적절히 사용하여 앱의 테스트에 투자하는 시간과 노력을 줄이고, 안정성을 높일 수 있습니다.

더 자세한 내용은 공식 문서를 참조해주세요.