본문 바로가기
Flutter/Flutter Programming

플러터 GetX에서 테스트 상세 완벽 가이드

by Maccrey 2024. 6. 7.
반응형

테스트는 소프트웨어 개발에서 매우 중요한 부분입니다. 플러터와 GetX를 사용하면 테스트를 쉽게 작성할 수 있습니다. 이 가이드에서는 GetX를 사용한 플러터 앱에서 유닛 테스트와 위젯 테스트를 설정하고 실행하는 방법을 설명합니다.

1. 프로젝트 설정

1.1. 새로운 플러터 프로젝트 생성

먼저 새로운 플러터 프로젝트를 생성합니다

flutter create getx_test_app
cd getx_test_app

1.2. pubspec.yaml 파일 업데이트

프로젝트의 pubspec.yaml 파일에 필요한 패키지를 추가합니다

dependencies:
  flutter:
    sdk: flutter
  get: ^4.6.5

dev_dependencies:
  flutter_test:
    sdk: flutter
  mockito: ^5.0.16
  build_runner: ^2.1.7

그런 다음 패키지를 설치합니다

flutter pub get

2. GetX 컨트롤러 및 의존성 주입 설정

2.1. 컨트롤러 생성

먼저, 간단한 GetX 컨트롤러를 생성합니다.

lib/controllers/counter_controller.dart 파일

import 'package:get/get.dart';

class CounterController extends GetxController {
  var count = 0.obs;

  void increment() {
    count++;
  }

  void decrement() {
    count--;
  }
}

2.2. 의존성 주입 설정

lib/main.dart 파일

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'controllers/counter_controller.dart';

void main() {
  // CounterController를 GetX에 주입합니다.
  Get.put(CounterController());

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'GetX Test Demo',
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final CounterController controller = Get.find<CounterController>();

    return Scaffold(
      appBar: AppBar(
        title: Text('GetX Test Demo'),
      ),
      body: Center(
        child: Obx(() {
          return Text('Count: ${controller.count}');
        }),
      ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          FloatingActionButton(
            onPressed: controller.increment,
            child: Icon(Icons.add),
          ),
          SizedBox(height: 10),
          FloatingActionButton(
            onPressed: controller.decrement,
            child: Icon(Icons.remove),
          ),
        ],
      ),
    );
  }
}

3. 유닛 테스트

3.1. CounterController 유닛 테스트

test/controllers/counter_controller_test.dart 파일

import 'package:flutter_test/flutter_test.dart';
import 'package:get/get.dart';
import 'package:getx_test_app/controllers/counter_controller.dart';

void main() {
  group('CounterController Test', () {
    late CounterController controller;

    setUp(() {
      controller = CounterController();
      Get.put(controller);
    });

    tearDown(() {
      Get.reset();
    });

    test('Initial value should be 0', () {
      expect(controller.count.value, 0);
    });

    test('Increment function should increase count by 1', () {
      controller.increment();
      expect(controller.count.value, 1);
    });

    test('Decrement function should decrease count by 1', () {
      controller.decrement();
      expect(controller.count.value, -1);
    });
  });
}

4. 위젯 테스트

4.1. HomeScreen 위젯 테스트

test/widgets/home_screen_test.dart 파일

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:get/get.dart';
import 'package:getx_test_app/controllers/counter_controller.dart';
import 'package:getx_test_app/main.dart';

void main() {
  testWidgets('HomeScreen Widget Test', (WidgetTester tester) async {
    // CounterController를 주입합니다.
    Get.put(CounterController());

    await tester.pumpWidget(MyApp());

    // 초기 카운트 값이 0인지 확인합니다.
    expect(find.text('Count: 0'), findsOneWidget);

    // Increment 버튼을 눌러 카운트 값을 증가시킵니다.
    await tester.tap(find.byIcon(Icons.add));
    await tester.pump();

    // 카운트 값이 1인지 확인합니다.
    expect(find.text('Count: 1'), findsOneWidget);

    // Decrement 버튼을 눌러 카운트 값을 감소시킵니다.
    await tester.tap(find.byIcon(Icons.remove));
    await tester.pump();

    // 카운트 값이 0인지 확인합니다.
    expect(find.text('Count: 0'), findsOneWidget);
  });
}

5. 테스트 실행

테스트를 실행하려면 다음 명령어를 사용합니다

flutter test

6. 결론

이 가이드에서는 플러터와 GetX를 사용하여 유닛 테스트와 위젯 테스트를 설정하고 실행하는 방법을 설명했습니다.

GetX의 컨트롤러와 의존성 주입 기능을 활용하여 테스트 가능한 코드를 작성할 수 있습니다.

이를 통해 코드의 품질을 높이고, 유지보수를 용이하게 할 수 있습니다.

 

수발가족을 위한 일기장 “나비일기장”

 

https://play.google.com/store/apps/details?id=com.maccrey.navi_diary_release

 

나비일기장 [수발일기장] - Google Play 앱

수형자 수발가족및 수발인을 위한 일기장으로 수형생활시기에 따른 정보를 얻을 수 있습니다.

play.google.com

 

 

비공개테스트를 위한 20명의 테스터모집 앱 "테스터 쉐어"

 

https://play.google.com/store/apps/details?id=com.maccrey.tester_share_release

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

반응형