본문 바로가기
카테고리 없음

[고급] Dart 서버 테스트 및 디버깅 / 서버 코드의 단위 테스트 및 통합 테스트 작성법

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

 

Dart를 사용하여 서버 애플리케이션을 개발할 때, 코드의 안정성과 신뢰성을 보장하기 위해서는 테스트디버깅이 필수적입니다.

이번 블로그에서는 Dart 서버 애플리케이션의 단위 테스트와 통합 테스트를 어떻게 작성하고 디버깅하는지에 대해 실제 예제를 통해 알아보겠습니다.

1. 단위 테스트(Unit Test) 예제

단위 테스트는 서버의 개별 기능이나 모듈이 올바르게 작동하는지 확인하는 데 사용됩니다. 이 섹션에서는 간단한 서버 기능을 테스트하는 방법을 설명합니다.

1.1 서버 코드 예제

먼저, Dart로 작성한 간단한 서버 코드 예제를 살펴보겠습니다. 이 예제는 HTTP 요청을 받아 처리하는 기능을 가진 서버입니다.

  • server.dart
import 'dart:io';

void main() async {
  final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 8080);
  print('Server listening on port ${server.port}');

  await for (HttpRequest request in server) {
    if (request.uri.path == '/greet') {
      request.response
        ..headers.contentType = ContentType.text
        ..write('Hello, Dart!')
        ..close();
    } else {
      request.response
        ..statusCode = HttpStatus.notFound
        ..write('Not Found')
        ..close();
    }
  }
}

이 서버는 /greet 경로로 요청이 들어오면 "Hello, Dart!"를 응답하고, 다른 경로로는 404 Not Found를 응답합니다.

1.2 단위 테스트 코드

서버의 단위 테스트를 작성하기 위해 test 패키지를 사용합니다. 이 예제에서는 HTTP 서버의 응답을 테스트합니다.

  • server_test.dart
import 'package:test/test.dart';
import 'package:http/http.dart' as http;
import 'dart:io';

void main() {
  HttpServer? server;

  setUp(() async {
    server = await HttpServer.bind(InternetAddress.loopbackIPv4, 8080);
    server!.listen((HttpRequest request) {
      if (request.uri.path == '/greet') {
        request.response
          ..headers.contentType = ContentType.text
          ..write('Hello, Dart!')
          ..close();
      } else {
        request.response
          ..statusCode = HttpStatus.notFound
          ..write('Not Found')
          ..close();
      }
    });
  });

  tearDown(() async {
    await server?.close();
  });

  test('GET /greet returns Hello, Dart!', () async {
    final response = await http.get(Uri.parse('http://localhost:8080/greet'));

    expect(response.statusCode, 200);
    expect(response.body, 'Hello, Dart!');
  });

  test('GET /unknown returns 404 Not Found', () async {
    final response = await http.get(Uri.parse('http://localhost:8080/unknown'));

    expect(response.statusCode, 404);
    expect(response.body, 'Not Found');
  });
}

위 코드에서 setUp 함수는 테스트 전에 서버를 시작하고, tearDown 함수는 테스트 후에 서버를 종료합니다. test 함수는 각 경로에 대한 응답을 검증합니다.

1.3 테스트 실행하기

테스트는 다음 명령어로 실행할 수 있습니다.

dart test

2. 통합 테스트(Integration Test) 예제

통합 테스트는 여러 모듈이 함께 작동하는지 검증하는 데 사용됩니다. 이 예제에서는 서버가 전체적으로 작동하는지 확인하는 테스트를 작성합니다.

2.1 통합 테스트 코드

integration_test 패키지를 사용하여 통합 테스트를 작성합니다. 다음 예제는 서버와의 전체적인 상호작용을 검증합니다.

  • integration_test/server_integration_test.dart
import 'package:integration_test/integration_test.dart';
import 'package:http/http.dart' as http;

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('GET /greet integration test', (WidgetTester tester) async {
    final response = await http.get(Uri.parse('http://localhost:8080/greet'));

    expect(response.statusCode, 200);
    expect(response.body, 'Hello, Dart!');
  });

  testWidgets('GET /unknown integration test', (WidgetTester tester) async {
    final response = await http.get(Uri.parse('http://localhost:8080/unknown'));

    expect(response.statusCode, 404);
    expect(response.body, 'Not Found');
  });
}

이 통합 테스트는 HTTP GET 요청을 보내고, 서버의 응답을 검증합니다. testWidgets를 사용하여 여러 테스트를 병렬로 실행할 수 있습니다.

2.2 테스트 실행하기

통합 테스트는 다음 명령어로 실행할 수 있습니다.

dart test integration_test

3. 디버깅(Debugging) 방법

디버깅은 코드에서 발생하는 문제를 해결하는 과정입니다. Dart에서는 IDE를 사용하여 디버깅을 수행할 수 있습니다.

3.1 디버깅 출력 사용하기

코드에 print 문을 추가하여 디버깅 출력을 확인할 수 있습니다.

  • server.dart
void main() async {
  final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 8080);
  print('Server listening on port ${server.port}');

  await for (HttpRequest request in server) {
    print('Request received: ${request.uri.path}'); // 디버깅 출력
    if (request.uri.path == '/greet') {
      request.response
        ..headers.contentType = ContentType.text
        ..write('Hello, Dart!')
        ..close();
    } else {
      request.response
        ..statusCode = HttpStatus.notFound
        ..write('Not Found')
        ..close();
    }
  }
}

3.2 IDE 디버거 사용하기

IntelliJ IDEA나 Visual Studio Code와 같은 IDE에서 제공하는 디버거를 사용할 수 있습니다. 브레이크포인트를 설정하고, 코드 실행을 중단하여 변수 값을 확인하거나 코드 흐름을 추적할 수 있습니다.

  • 브레이크포인트 설정: 코드의 특정 줄에서 실행을 멈추고, 해당 시점의 변수 값을 확인합니다.
  • 단계 실행: 코드를 한 줄씩 실행하며 문제를 찾습니다.
  • 호출 스택 보기: 함수 호출 경로를 확인하여 문제가 발생한 위치를 추적합니다.

Dart 서버 애플리케이션의 단위 테스트와 통합 테스트를 작성하고 디버깅하는 방법을 알아보았습니다.

단위 테스트는 개별 모듈의 기능을 검증하고, 통합 테스트는 전체 시스템의 동작을 확인합니다.

디버깅 기술을 활용하여 코드의 문제를 빠르게 찾아 해결할 수 있습니다. 이러한 테스트와 디버깅 과정을 통해 더 안정적이고 신뢰성 높은 서버 애플리케이션을 개발할 수 있습니다.

 

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

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

 

반응형