본문 바로가기
Dart/Dart Programming language

[추가학습] Dart 코드 품질 및 테스트 / 통합 테스트 작성법 (Integration Testing)

by Maccrey Coding 2024. 9. 14.
반응형

 
코드 품질을 유지하고 개선하는 것은 소프트웨어 개발에서 매우 중요한 요소입니다.
Dart에서도 코드의 안정성과 품질을 보장하기 위해 테스트는 필수적인 과정입니다.
이 중 통합 테스트(Integration Testing)는 개별적으로 잘 동작하는 모듈들이 함께 모였을 때 예상대로 작동하는지 검증하는 중요한 방법입니다.
이 글에서는 Dart 초보자도 쉽게 이해할 수 있도록 통합 테스트의 개념부터 코드 작성 방법까지 자세히 설명합니다.

1. 통합 테스트란 무엇인가?

통합 테스트(Integration Testing)는 개별적으로 테스트된 모듈이나 컴포넌트들이 함께 작동할 때 발생하는 상호작용을 확인하는 테스트 방식입니다.
예를 들어, 로그인 기능에서 화면(UI), 네트워크 통신, 데이터 처리 등이 함께 연결되어 있을 때, 이 기능들이 전체적으로 올바르게 작동하는지 확인하는 것이 통합 테스트입니다.
 
통합 테스트의 주요 목표

  • 모듈 간 상호작용 검증
  • 다양한 모듈을 합쳤을 때 발생할 수 있는 통합 문제 확인
  • 실제 사용 환경에서 버그나 오류를 조기에 발견

2. 통합 테스트 vs 단위 테스트

통합 테스트와 단위 테스트(Unit Testing)는 목적이 다릅니다.
단위 테스트는 하나의 함수나 메서드가 올바르게 동작하는지 확인하는 데 중점을 두지만, 통합 테스트는 여러 모듈이 함께 작동할 때의 시스템 전체 동작을 검증합니다.
 
테스트 종류주된 목적테스트 범위

단위 테스트개별 함수나 메서드의 동작 확인좁음
통합 테스트여러 모듈의 상호작용 및 시스템 전체 검증넓음

3. Dart에서 통합 테스트를 시작하는 방법

통합 테스트를 시작하기 위해 Flutter 프로젝트에서 Flutter SDK에 있는 integration_test 패키지를 사용할 수 있습니다.
이 패키지를 통해 애플리케이션의 전체적인 흐름을 테스트할 수 있습니다.
 
통합 테스트 설정 방법
1. pubspec.yaml 파일에 아래 코드를 추가합니다.

dev_dependencies:
  integration_test:
    sdk: flutter
  flutter_test:
    sdk: flutter

 
2. 패키지 설치

$ flutter pub get

설치가 완료되면, integration_test 폴더에 테스트 파일을 생성할 수 있습니다.

4. 통합 테스트 예제: 로그인 기능 테스트하기

이제 간단한 로그인 화면을 테스트하는 예제를 살펴보겠습니다.

Flutter로 만들어진 앱에서 로그인 화면을 테스트하려면, 입력 필드, 버튼 클릭, 그리고 결과를 검증하는 과정을 포함해야 합니다.

 

Flutter 로그인 화면 코드
// lib/main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LoginScreen(),
    );
  }
}

class LoginScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Login')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              key: Key('username'),
              decoration: InputDecoration(labelText: 'Username'),
            ),
            TextField(
              key: Key('password'),
              decoration: InputDecoration(labelText: 'Password'),
              obscureText: true,
            ),
            ElevatedButton(
              key: Key('login_button'),
              onPressed: () {
                // 로그인 처리 로직
              },
              child: Text('Login'),
            ),
          ],
        ),
      ),
    );
  }
}​
통합 테스트 코드
// integration_test/app_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:my_app/main.dart'; // 실제 애플리케이션 파일 경로

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('로그인 화면 통합 테스트', (WidgetTester tester) async {
    // 앱 실행
    await tester.pumpWidget(const MyApp());

    // 사용자 입력 시뮬레이션
    await tester.enterText(find.byKey(Key('username')), 'test_user');
    await tester.enterText(find.byKey(Key('password')), 'password123');

    // 로그인 버튼 클릭
    await tester.tap(find.byKey(Key('login_button')));
    
    // 프레임 업데이트
    await tester.pump();

    // 예상된 결과 확인 (이 부분은 실제 테스트 환경에 맞춰 수정)
    expect(find.text('Welcome, test_user!'), findsOneWidget);
  });
}​
코드 설명
  • IntegrationTestWidgetsFlutterBinding.ensureInitialized(): 통합 테스트 환경을 설정합니다.
  • pumpWidget(): 애플리케이션을 실행합니다.
  • enterText(): 입력 필드에 텍스트를 입력하는 작업을 시뮬레이션합니다.
  • tap(): 버튼을 누르는 동작을 시뮬레이션합니다.
  • expect(): 예상되는 결과가 나타나는지 검증합니다.

5. 통합 테스트 실행 방법

통합 테스트를 실행하려면 실제 기기에뮬레이터에서 실행해야 합니다. 아래 명령어를 사용하여 통합 테스트를 실행할 수 있습니다.

$ flutter test integration_test

 

이 명령어를 통해 integration_test 폴더에 있는 모든 통합 테스트가 실행됩니다.

6. 통합 테스트에서 Mock 사용하기

통합 테스트에서는 Mock을 사용하여 외부 의존성을 시뮬레이션할 수 있습니다. 예를 들어, 네트워크 요청이나 데이터베이스 호출과 같은 외부 시스템과의 상호작용을 실제로 수행하지 않고, 가짜 데이터를 반환하게 하여 테스트를 빠르게 진행할 수 있습니다.

 

이를 위해 Dart에서는 mockito 패키지를 사용합니다. 아래는 모의 객체(Mock Object)를 사용하여 서버 호출을 흉내내는 예시입니다.

dev_dependencies:
  mockito: ^5.0.0

7. 통합 테스트로 코드 품질 향상하기

통합 테스트는 단위 테스트에서 잡아내지 못한 모듈 간 상호작용 문제를 발견하는 데 매우 유용합니다. 특히 여러 기능이 함께 작동할 때 발생할 수 있는 통합 문제를 조기에 파악하여 해결할 수 있습니다.

통합 테스트의 이점:
  • 복잡한 기능의 안정성을 확인
  • 새로운 기능이 추가되었을 때, 기존 기능이 정상적으로 동작하는지 확인
  • 실제 사용자와 비슷한 시나리오에서 시스템을 테스트하여 버그 발견

통합 테스트는 애플리케이션의 전반적인 코드 품질을 높이고 유지보수에 소요되는 시간을 줄이는 데 매우 효과적입니다.

 

Dart와 Flutter에서 통합 테스트는 애플리케이션의 품질을 유지하고 상호작용이 올바르게 이루어지는지 검증하는 중요한 과정입니다.

이 글에서 설명한 방법을 따라 통합 테스트를 시작하면, 애플리케이션의 안정성을 크게 높일 수 있습니다.

이제 코드를 안전하게 확장하고 기능을 추가해도 걱정하지 않고 개발할 수 있습니다.

 

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

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

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

play.google.com

반응형