이번 글에서는 지난 시간에 만든 NoteListState에 대해 테스트 코드를 작성해 보겠습니다.
지난 글에서 우리는 다양한 정렬 기준과 오름차순/내림차순을 적용할 수 있는 정렬 기능을 구현했습니다. 이 과정에서 정렬 상태를 별도로 관리할 필요성을 느꼈고, 이를 위해 만든 것이 NoteListState였습니다. 다시 말해 NoteListState는 노트 목록의 검색과 정렬 상태를 관리하는 역할을 합니다.
다음은 NoteListState의 기능을 요약한 것입니다.
- 검색 기능 : 검색어 입력 시 정확도 순으로 정렬하고, 검색어가 비워지면 기본 정렬(생성일 순)로 돌아간다.
- 정렬 기능 : 노트를 생성일, 수정일, 중요도, 정확도 기준으로 오름차순/내림차순 정렬할 수 있다.
- 상태 초기화 : 검색어와 정렬 상태를 초기값으로 리셋할 수 있다.
이렇듯 NoteListState는 다양한 케이스를 핸들링하고 다양한 동작을 수행합니다. 지금까지는 구현한 기능들을 일일이 시뮬레이터 등을 통해 직접 테스트했지만, 매번 코드를 수정할 때마다 직접 테스트하는 것은 아무래도 번거로움이 큽니다.
하여 이를 개선하기 위해 테스트 코드를 추가하고, 명령어를 통해 NoteListState의 모든 기능을 테스트해 보겠습니다.
테스트 파일 구조 및 설정
먼저 test/note_list_state_test.dart 파일을 생성하고 필요한 패키지를 가져옵니다.
import 'package:flutter_test/flutter_test.dart';
import 'package:ttingnote/states/note_list_state.dart';
import 'package:ttingnote/views/note_list_view.dart';
패키지를 가져왔다면 밑에 main 함수로 테스트 코드를 시작합니다.
void main() {
// 이 함수 내에서 여러 테스트 그룹과 개별 테스트를 작성합니다
}
1. 테스트 그룹과 setUp 함수
모든 테스트를 group으로 묶어 NoteListState와 관련된 테스트임을 나타냅니다. 또한 setUp을 사용해 각 테스트 실행 전 noteListState의 인스턴스를 초기화하여 테스트마다 독립적인 환경에서 실행되도록 합니다.
group('NoteListState 테스트', () {
late NoteListState noteListState;
setUp(() {
noteListState = NoteListState(); // 각 테스트 시작 전에 새 인스턴스 생성
});
2. 초기 상태 테스트
NoteListState의 초기 상태를 확인하는 테스트입니다. 이 클래스가 처음 생성되었을 때의 기본 상태를 확인하여, 예상한 대로 초기값이 설정되었는지 테스트합니다.
test('초기 상태 확인', () {
expect(noteListState.searchQuery, ''); // 검색어는 빈 값이어야 함
expect(noteListState.currentSortCriteria, SortCriteria.createdAt); // 기본 정렬 기준은 생성일이어야 함
expect(noteListState.isAscending, false); // 기본 정렬 순서는 내림차순이어야 함
});
3. 검색어 설정 테스트
setSearchQuery 메서드를 테스트하여, 검색어가 입력되었을 때 currentSortCriteria가 정확도순으로 변경되는지 확인하고, 검색어가 지워졌을 때 기본 정렬 기준인 생성일순으로 돌아오는지 확인합니다.
test('검색어 설정 테스트', () {
// 검색어 입력 시 정확도순으로 변경
noteListState.setSearchQuery('테스트');
expect(noteListState.searchQuery, '테스트'); // 검색어가 제대로 설정되었는지
expect(noteListState.currentSortCriteria, SortCriteria.accuracy); // 정확도순으로 변경되었는지
// 검색어 삭제 시 생성일순으로 변경
noteListState.setSearchQuery('');
expect(noteListState.searchQuery, ''); // 검색어가 지워졌는지
expect(noteListState.currentSortCriteria, SortCriteria.createdAt); // 생성일순으로 변경되었는지
});
4. 정렬 기준 변경 테스트
정렬 기준을 변경했을 때 상태가 정확히 반영되는지 테스트합니다. 같은 정렬 기준을 반복 선택하면 오름차순과 내림차순이 토글 되어야 하며 다른 기준으로 변경할 경우 기본 정렬 순서인 내림차순으로 설정됩니다.
test('정렬 기준 변경 테스트', () {
// 같은 기준으로 변경 시 오름/내림차순 토글
noteListState.changeSortCriteria(SortCriteria.importance);
expect(noteListState.currentSortCriteria, SortCriteria.importance);
expect(noteListState.isAscending, false);
noteListState.changeSortCriteria(SortCriteria.importance);
expect(noteListState.isAscending, true); // 오름차순으로 변경
// 다른 기준으로 변경 시 내림차순으로 초기화
noteListState.changeSortCriteria(SortCriteria.updatedAt);
expect(noteListState.currentSortCriteria, SortCriteria.updatedAt);
expect(noteListState.isAscending, false); // 내림차순으로 초기화
});
5. 상태 초기화 테스트
노트 목록 상태를 초기 상태로 되돌리는 resetState 메서드를 테스트합니다. 이 메서드는 검색어, 정렬 기준, 정렬 순서가 초기값으로 되돌아가도록 설정해야 합니다.
test('상태 초기화 테스트', () {
// 상태 변경
noteListState.setSearchQuery('테스트');
noteListState.changeSortCriteria(SortCriteria.importance);
// resetState 호출
noteListState.resetState();
// 모든 값이 초기값으로 돌아갔는지 확인
expect(noteListState.searchQuery, '');
expect(noteListState.currentSortCriteria, SortCriteria.createdAt);
expect(noteListState.isAscending, false);
});
전체 테스트 코드
NoteListState 테스트에 대한 전체 파일입니다.
import 'package:flutter_test/flutter_test.dart';
import 'package:ttingnote/states/note_list_state.dart';
import 'package:ttingnote/views/note_list_view.dart';
void main() {
group('NoteListState 테스트', () {
late NoteListState noteListState;
setUp(() {
noteListState = NoteListState();
});
test('초기 상태 확인', () {
expect(noteListState.searchQuery, '');
expect(noteListState.currentSortCriteria, SortCriteria.createdAt);
expect(noteListState.isAscending, false);
});
test('검색어 설정 테스트', () {
noteListState.setSearchQuery('테스트');
expect(noteListState.searchQuery, '테스트');
expect(noteListState.currentSortCriteria, SortCriteria.accuracy);
noteListState.setSearchQuery('');
expect(noteListState.searchQuery, '');
expect(noteListState.currentSortCriteria, SortCriteria.createdAt);
});
test('정렬 기준 변경 테스트', () {
noteListState.changeSortCriteria(SortCriteria.importance);
expect(noteListState.currentSortCriteria, SortCriteria.importance);
expect(noteListState.isAscending, false);
noteListState.changeSortCriteria(SortCriteria.importance);
expect(noteListState.isAscending, true);
noteListState.changeSortCriteria(SortCriteria.updatedAt);
expect(noteListState.currentSortCriteria, SortCriteria.updatedAt);
expect(noteListState.isAscending, false);
});
test('상태 초기화 테스트', () {
noteListState.setSearchQuery('테스트');
noteListState.changeSortCriteria(SortCriteria.importance);
noteListState.resetState();
expect(noteListState.searchQuery, '');
expect(noteListState.currentSortCriteria, SortCriteria.createdAt);
expect(noteListState.isAscending, false);
});
});
}
테스트 실행 방법
터미널에서 다음 명령어를 실행하여 작성한 테스트를 실행할 수 있습니다.
flutter test test/note_list_state_test.dart
테스트를 실행하면 각 테스트 케이스가 통과 또는 실패했는지 결과가 출력됩니다.
00:01 +0: NoteListState 테스트 초기 상태 확인
00:01 +1: NoteListState 테스트 초기 상태 확인
00:01 +1: NoteListState 테스트 검색어 설정 테스트
00:01 +2: NoteListState 테스트 검색어 설정 테스트
00:01 +2: NoteListState 테스트 정렬 기준 변경 테스트 00:01 +3: NoteListState 테스트 정렬 기준 변경 테스트 00:01 +3: NoteListState 테스트 상태 초기화 테스트
00:01 +4: NoteListState 테스트 상태 초기화 테스트
00:01 +4: All tests passed!
모든 테스트를 통과했습니다.
만약 아직 안심이 안된다면 더 다양한 테스트 케이스를 추가하는 것도 좋습니다.
마무리
이번 글에서는 Flutter에서 상태 관리 클래스(NoteListState)를 테스트하는 방법을 살펴보았습니다.
테스트 코드를 작성하면 코드의 신뢰성을 높일 수 있고 코드 변경 시 예상치 못한 오류를 사전에 발견할 수 있습니다. 특히, 리팩터링을 할 때 테스트 코드는 큰 힘을 발휘합니다. 테스트 코드 없이 하는 리팩터링은 어떤 사이드 이펙트가 발생할지 알 수 없어 변경에 큰 위험이 따르죠..
물론 테스트 코드가 모든 사이드 이펙트나 버그를 잡아내는 것은 아니며, 최소한의 예방책이 되어줄 뿐입니다. 테스트 코드 덕분에 개발자는 어느 정도 안심하고 개발을 이어갈 수 있죠. 이러한 안정감은 개발 생산성에도 큰 영향을 미칩니다.
정말 빠르고 유연하게 개발을 하고 싶다면 테스트 코드와 함께 개발할 것을 추천드립니다.
[Flutter로 간단한 노트 앱을 만들어보자] 시리즈는 직접 독학으로 하나씩 만들어나가는 과정이므로 틀리거나 부족한 내용이 있을 수 있습니다. 조언과 피드백을 댓글로 남겨주시면 적극 반영하겠습니다. 감사합니다.
'나는 이렇게 논다 > Flutter 로 간단한 노트 앱을 만들어보자' 카테고리의 다른 글
Flutter로 간단한 노트 앱을 만들어보자 ⑩ - 노트 쓰기 플로팅 버튼 추가하기 (2) | 2024.11.13 |
---|---|
Flutter로 간단한 노트 앱을 만들어보자 ⑨ - 노트 목록 UI 리팩터링 (0) | 2024.11.11 |
Flutter로 간단한 노트 앱을 만들어보자 ⑦ - 노트 정렬 기능 구현하기 (0) | 2024.11.09 |
Flutter로 간단한 노트 앱을 만들어보자 ⑥ - 노트에 중요 표시 라벨 붙이기 (0) | 2024.11.08 |
Flutter로 간단한 노트 앱을 만들어보자 ⑤ - 노트 검색 기능 구현 (유사도 알고리즘을 곁들인) (4) | 2024.11.07 |