Flutter로 단위 테스트 작성

이전 여기 (TODO 앱에서 비교하는 Android (MVVM)와 Flutter (Provider)의 차이) 기사에서 소개한 TODO 앱의 단위 테스트를 작성해 보았습니다.
시도해 보았던 것을 공유합니다. 여기는 이렇게 하면 해결한다! 이런 편이 좋다! 라든지 있으면 코멘트 주시면 기쁩니다.

필자의 레벨


  • Flutter의 실무 경험 없음 (시작하기 시작해 반년 미만)
  • 일반적으로 SIer 인프라 엔지니어
  • 인프라 주위라고해도 온 프레미스 밖에하지 않는다 ...

  • 했던 일



    이전에 작성한 TODOAppSample-Flutter로 단위 테스트를 수행했습니다.
    모든 코드는 여기

    기본적으로는 아래의 공식 문서에 방법이 쓰여 있으므로 참조하십시오.
    An introduction to unit testing

    필요한 준비


    pubspec.yaml에 다음과 같이 flutter_test를 추가해야 합니다.

    또한 저는 다음과 같은 환경에서 실시했습니다.
    OS:Windows 10 Pro 1909
    IDE:Android Studio 4.1.1

    코드



    테스트 코드이지만 프로젝트 루트의 test 폴더 아래에 테스트하려는 dart 파일의 이름에 _test가 붙은 파일을 만들어 그 안에 씁니다.


    기본적인 단위 테스트는 간단하게 걸어 다음과 같이 됩니다.

    test.dart
    
    import 'package:flutter_test/flutter_test.dart';
    import 'package:todo_app_sample_flutter/data/todo_item.dart';
    
    void main() {
      group("TodoItemのゲッターのテスト", () {
        final TodoItem todoItem = TodoItem(
          id: 0,
          title: 'title',
          body: 'body',
          createdAt: DateTime(2020, 1, 1),
          updatedAt: DateTime(2020, 1, 1),
          isDone: true,
        );
    
        test('idのテスト', () {
          expect(todoItem.getId, 0);
        });
    
    flutter_test.dart 및 테스트할 dart 파일을 가져옵니다.main()test() 함수를 쓰고 그 중 예상 값을 expect(<テスト対象が出力する値>,<期待される結果>)와 같이 씁니다.test()가 하나의 테스트 케이스에 해당하는 느낌입니다.
    test()group()로 그룹화할 수도 있습니다.

    모든 테스트 코드는 여기

    테스트 실행



    실행하려면 다음과 같이 테스트 파일을 마우스 오른쪽 버튼으로 클릭하고 실행⇒test in ~~~ 을 클릭합니다.


    테스트가 흐르고 결과가 화면 하단에 표시됩니다.
    녹색 체크 마크가 붙어 있으면 테스트에 pass하고 있다는 것이 됩니다.


    테스트에 실패하면 에러와 함께 다음과 같이 출력됩니다.

    위의 예에서는 예상 결과의 날짜를 일부 변경했습니다.ExpectedActual가 다르다는 것을 보여줍니다.

    결론



    이 기사를 위해 작성한 테스트는 매우 간단했습니다. 왜냐하면 TodoItem은 데이터를 저장하는 유일한 엔티티 역할만 있기 때문입니다.
    그러나 다른 수업에 테스트를 쓰려고 하면 어쨌든 쓸 수 없다는 것을 알았습니다.

    다른 클래스에 대해서도 테스트를 시도했지만 내가 작성한 코드에서는 테스트 할 수 없습니다.

    todo_item_repository.dart
    class TodoItemRepository {
      static String table = 'todo_item';
      static DatabaseProvider instance = DatabaseProvider.instance;
    
    

    DB의 인스턴스를 내부에서 생성해 버리고 있기 때문에, mock로 옮겨놓을 수 없기 때문입니다.

    이런 일을 일으키지 않기 위해서, 인스턴스의 생성시에 DB의 인스턴스를 밖으로부터 건네주면 좋을 것 같습니다.
    개인 개발하고 있는 분에는 코어가 되는 비즈니스 로직만 의존관계에 주의하면서 코딩해 두고, 테스트하기 쉽도록 해 두는 것이 좋다고 생각했습니다.
    그 중 테스터블한 코드로 다시 써 다시 기사로 하려고 합니다.

    2021/02/15 추가



    기사로했습니다! 【Flutter】Provider로 최소한의 DI를 실시해 테스타블인 코드에 리팩토링한다

    2021/4/9 추가



    이 기사에 관한 발표를 실시했습니다.
    다음은 발표 슬라이드입니다.

    Flutter에서 단위 테스트를 수행하는 방법과 GitHub Actions를 사용한 자동화 from 신노스케 도쿠다

    좋은 웹페이지 즐겨찾기