말랑한 하루
[Flutter] TDD (Test Driven Development) 본문
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
테스트가 진행 될 각 항목에 대한 글이 길어지고, 같은 구조를 쌓아올라가도 내부의 설계는 다르게 작성되므로 새로운 칼럼에서 내용을 진행하도록 하겠습니다.
'개발 > Flutter' 카테고리의 다른 글
[Flutter] TDD (Test Driven Development) - Repository (0) | 2024.02.06 |
---|---|
[Flutter] TDD (Test Driven Development) - DataSource (0) | 2024.02.03 |
[Flutter] MVVM (0) | 2024.01.31 |
[Flutter] Clean Architecture (0) | 2024.01.30 |
[Flutter] (Project) MapleApp: 30. 리젝 (1) | 2024.01.25 |