본문 바로가기
Dart/Dart Programming language

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

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

 
코드 품질을 유지하고 개선하는 것은 소프트웨어 개발에서 매우 중요한 요소입니다.
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

728x90
반응형