welcome to my blog

[Flutter] 단위/위젯테스트 코드 정리 본문

Flutter

[Flutter] 단위/위젯테스트 코드 정리

_annie_ 2021. 12. 17. 20:50
728x90

플러터에서 지원하는 테스트 종류는 총 3가지로

  1. 단위테스트 
  2. 위젯테스트
  3. 통합테스트

이다.

 

이번 게시글에서는 1번과 2번을 다루겠다.

 

참고) 특정 위젯을 찾으려면 find 를 이용한다. ex) find.text('apply');

 

1. 단위테스트

  •  test 라이브러리를 종속성에 추가(pubspec.yaml 에 직접 입력 혹은 명령어로 추가)
flutter pub add test --dev
  • 기본구조
    import 'package:test/test.dart';
    import 'package:unit_test/counter.dart';
    
    void main() {
      test('Counter value should be incremented', () {
        final counter = Counter();
    
        counter.increment();
    
        expect(counter.value, 1);});
    }​

test 라이브러리 import 

test 함수의 첫번째 인자에 description 작성

미리 작성해둔 Counter()라는 클래스의 객채 생성

(counter.increment() -> counter의 value 값 1 증가하는 함수)

expect로 예상 결과값과 비교 --> counter.value와 1이 같은지 비교

 

2. 위젯테스트

  1. 테스트 파일은 'test' 디렉토리 내부에 생성하고, 파일명은 마지막에 '_test.dart' 로 끝나도록 네이밍 한다.
  2. 기본 구조 : 
import 'package:flutter_test/flutter_test.dart';

void main() {

	testWidgets('ApplyView Button Test', (WidgetTester tester) async {
    
    	await tester.pumpWidget(MyWidget());
        
        final titleFinder = find.text("apply");
        
        expect(titleFinder, findsOneWidget);
    });
}

flutter_test 라이브러리를 사용한다.

 

testWidgets : 

  • This function uses the test function in the test package to register the given callback as a test. 
  • The callback, when run, will be given a new instance of WidgetTester.
  • The find object provides convenient widget Finders for use with the WidgetTester.
  • 주어진 콜백을 테스트로 등록하기 위한 테스트 패키지 함수
  • 콜백이 실행되고 WidgetTester의 새 인스턴스가 주어진다
  • finder 객체는 WidgetTester와 함께 사용할 수 있는 편리한 위젯인 Finder를 제공한다.

 

WidgetTester : 

  •  위젯 및 테스트 환경과 프로그래밍 방식으로 상호 작용하는 클래스
  • 첫번째 인자는 description으로 어떤 테스트인지 간단하게 설명을 남긴다.
  • 객체 속성 몇가지 정리
    • testDescription : testWidgets 함수의 첫번째 매개변수인 description 반환
      print(tester.testDescription);​
    • getSize : size를 가져온다
      print(tester.getSize(find.text('apply')));​ 
      //apply라는 이름을 가진 widget의 size를 반환 --> Text 위젯의 사이즈만 가져옴
      
      나는 apply라는 text를 가진 버튼 자체의 크기를 가져오고 싶다면?
      
      print(tester.getSize(find.widgetWithText(TextButton, 'apply')));
      //'apply'라는 Text의 child를 가지고 있는 TextButton의 객체를 찾아서 사이즈를 반환함
    • tap : 해당 위젯의 중앙을 클릭한다
      await tester.tap(find.text("apply"));
      //apply라는 text를 가진 위젯을 클릭​
      
      await tester.tap(find.widgetWithText(TextButton, 'apply'));
      //apply라는 text를 가진 TextButton을 클릭
    • pump
      • Triggers a frame after duration amount of time. 일정시간 후에 프레임을 트리거 -> 리빌드
        await tester.pump();
        //변경된 위젯만 트리거
    • pumpWidget
      • Renders the UI from the given widget. 주어진 위젯으로부터 UI를 렌더링
        await tester.pumpWidget(MyWidget());
        //최상위 트리부터 다시 트리거
    • byIcon :
      • icon으로 검색
        final icon = find.byIcon(Icons.check);
        
        expect(icon, findsWidgets);​
    • allElements.toList() :
      • 현재 등록된 트리 항목들을 보여줌 (tree에 제대로 등록되어있나 확인할때 유용)
      • print(tester.allElements.toList());​

예시)

group('group test', () {
    testWidgets('make MaterialApp widget ', (WidgetTester tester) async {
      
      //home에는 미리 작성해둔 widget 입력 MyStateView -> Scaffold 리턴함
      const rootWidget = MaterialApp(
        title: 'material',
        home: MyStateView(),
      );

      //pumpWidget의 전달인자로 MaterialApp 을 전달해야 함
      await tester.pumpWidget(rootWidget);

      //'back'이라는 텍스트를 가진 위젯을 찾음
      final backBtn = find.text('back');
      
      //위에서 찾은 버튼이 하나있는지 확인
      expect(backBtn, findsOneWidget);

    });
  });

명령어로 테스트 실행하기

flutter test [테스트파일경로]/[테스트파일이름].dart
ex) flutter test test/unit.dart

 

 

https://pub.dev/packages/test/install

 

test | Dart Package

A full featured library for writing and running Dart tests across platforms.

pub.dev

 

https://flutter-ko.dev/docs/cookbook/testing/unit/introduction

 

단위 테스트 소개

새로운 기능을 추가하거나 기존 기능을 변경했을 때, 앱이 여전히 제대로 동작한다는 것을어떻게 보장할 수 있을까요? 테스트 코드를 작성하세요.단위 테스트는 하나의 함수, 메서드 혹은 클래

flutter-ko.dev

https://flutter-ko.dev/docs/testing

 

Flutter 앱 테스트하기

앱의 기능이 많아질수록, 수동으로 테스트하기는 더 어려워집니다.자동 테스트는 기능과 버그 개선 속도를 유지하여 앱을 출시하기 전에 정상적으로 작동할 수 있도록 보장해드립니다.자동 테

flutter-ko.dev

 

https://api.flutter.dev/flutter/flutter_test/testWidgets.html

 

https://api.flutter.dev/flutter/flutter_test/WidgetTester-class.html

https://api.flutter.dev/flutter/flutter_test/CommonFinders-class.html

728x90
반응형