말랑한 하루

[Flutter] TDD (Test Driven Development) 본문

개발/Flutter

[Flutter] TDD (Test Driven Development)

지수는말랑이 2024. 2. 2. 20:12
반응형

Test Driven Development라 불리는 소프트웨어 개발 방법론 중 하나 입니다. 개발자가 코드를 작성하기 전에 테스트 케이스를 먼저 작성하고, 그 후에 해당 테스트 케이스를 통과하는 코드를 작성하는 방식으로 진행됩니다. 진행 과정은 다음과 같습니다.

 

🍒 Test: 테스트 작성

새로운 기능이나 수정된 기능에 대한 테스트 케이스를 작성합니다.

이 테스트는 아직 구현되지 않은 기능이나 버그가 있는 부분을 검증하는 역할을 합니다.

🍒 Fail: 테스트 실패

작성한 테스트가 현재 코드에서 실패하도록 만듭니다.

아직 구현되지 않았기 때문에 당연한 결과입니다.

🍒 Code: 코드 작성

실패한 테스트 코드가 통과하도록 재 작성합니다.

목표는 테스트를 통과하는 최소한의 코드를 작성하는 것입니다.

🍒 Pass: 테스트 통과

작성한 테스트가 통과하는지 판단합니다.

🍒 Refactor: 리팩토링

작성한 코드를 리팩토링하여 코드의 가독성, 유지보수성, 성능 등을 개선합니다.

개선된 코드 또한 테스트는 통과해야 합니다.

🐇 테스트 라이브러리

Flutter Framework에서 테스트를 진행할 땐, flutter_test와 mockito를 사용합니다.

 

🥕 flutter_test

Flutter 애플리케이션의 단위 테스트와 통합 테스트를 작성하고 실행하기 위한 도구를 제공합니다. 비동기 테스트, Widget 검색, Mocking 등 다양한 테스트도 작성할 수 있습니다.

 

🥕 mockito

Mock 객체를 생성하고 테스트에서 외부 의존성을 가짜로 대체하여 테스트를 용이하게 만드는 도구입니다.

데이터베이스나 네트워크 호출 같은 외부 의존성이 있는 코드를 테스트할 때, 의존성을 Mock 객체로 대체하여 테스트를 진행할 수 있습니다.

 

두 라이브러리를 활용하여 전체적인 테스트 흐름을 설계하고 구현해갈 수 있습니다. 전체적인 흐름으로는 객체 선언 및 초기화, 더미 데이터 생성, 테스트 선언/준비/실행/검증, 테스트 종료를 수행합니다.

 

관련된 예시로는 TodoList를 구현할 때 사용되는 각 계층의 entity, datasource, repository, usecase, bloc에 대한 전체적인 테스트 케이스를 어떻게 설계하고 만들어가는지 흐름에 맞춰서 보여드리도록 하겠습니다.

🐇 테스트 코드 작성

🥕 파일 구조

테스트 코드를 작성하기 전, TDD를 진행하기 위한 전체적인 파일 구조는 다음과 같습니다. Clean Architecture를 접목하여 core/data/domain/presentation 계층으로 나뉘어져있습니다.

lib
├── core
│   ├── error
│   │   └── failure.dart
│   └── usecases
│       └── todo_use_case.dart
│
├── data
│   ├── datasources
│   │   └── todo_remote_data_source.dart
│   └── repositories
│       └── todo_repository.dart
│
├── domain
│   ├── entities
│   │   └── todo.dart
│   ├── repositories
│   │   └── todo_repository.dart
│   └── usecases
│       └── todo_use_case.dart
│
├── presentation
│   ├── blocs
│   │   └── todo_bloc.dart
│   ├── pages
│   │   └── todo_list_page.dart
│   └── widgets
│       └── todo_list_widget.dart
│
└── main.dart
test
├── data
│   └── datasources
│       └── todo_remote_data_source_test.dart
├── domain
│   ├── repositories
│   │   └── todo_repository_test.dart
│   └── usecases
│       └── get_todo_list_test.dart
└── presentation
    └── blocs
            └── todo_bloc_test.dart

 

테스트가 진행 될 각 항목에 대한 글이 길어지고, 같은 구조를 쌓아올라가도 내부의 설계는 다르게 작성되므로 새로운 칼럼에서 내용을 진행하도록 하겠습니다.

반응형
Comments