단위(Unit) 테스트
- 특정 모듈이 의도한 대로 잘 작동하는가를 테스트하는 것이다.
테스트 케이스
- 가능한 모든 가능성의 범위를 테스트하는 것이 좋은 테스트 케이스다.
장점
- 장애에 관한 신속한 피드백
- 개발 주기에서 조기 장애 감지
- 회귀에 신경 쓸 필요 없이 코드를 최적화할 수 있도록 하는 더 안전한 코드 리팩터링
- 기술적 문제를 최소화하는 안정적인 개발 속도
사용 경우
- DB
- 스키마가 변경되는 경우
- 모델 클래스가 변경되는 경우
- Network
- 데이터 검증
사용 방법
- 테스트 코드는 원래 파일에 _test를 붙이고 동일 위치에 생성한다.
- 테스트 기법
- given > when > then
- expect() 함수를 활용해 결과를 검증한다.
Mock 객체 활용
- 때때로 단위 테스트는 라이브 웹 서비스 또는 데이터베이스에서 데이터를 가져오는 클래스에 의존할 수 있다. 이는 다음과 같은 몇 가지 이유로 불편하다.
- 테스트 실행 속도가 느려진다.
- 예기치 않은 결과를 반환하면 통과 테스트가 실패하기 시작할 수 있다.
- 가능한 모든 성공 및 실패 시나리오를 테스트하는 것은 어렵습니다.
- 따라서 라이브 웹 서비스나 데이터베이스에 의존하는 대신 이러한 종속성을 Mocking할 수 있다.
- Mock은 라이브 웹 서비스 또는 데이터베이스를 에뮬레이션하고 상황에 따라 특정 결과를 반환할 수 있다.
- 가짜 객체를 작성하여 테스트할 수 있다.
- 먼저 데이터를 가져오는 객체의 interface를 정의한다.
- 네트워크 통신 테스트를 위해 매번 실제로 통신을 한다면 비용+, 시간+, 불확실성+ (서버 에러 등)
예제
짝수일 경우 true를 반환하는 함수
import 'package:basic/23_12_18/even.dart';
import 'package:test/test.dart';
void main() {
test('짝수일 경우 true를 반환', () => expect(isEven(4), true));
test('홀수일 경우 false를 반환', () => expect(isEven(3), false));
}
![](https://velog.velcdn.com/images/ssh0407/post/7997fe8b-c959-4f8d-9f42-44835a4922aa/image.png)
숫자들 중 최대값을 반환하는 함수
import 'package:basic/23_12_18/maximum_value.dart';
import 'package:test/test.dart';
void main() {
List<int> list1 = [2, 5, 1, 9, 3];
List<int> list2 = [1, 10, 8, 7, 6];
test('최대값을 반환', () => expect(findMax(list1), equals(9)));
test('최대값을 반환', () => expect(findMax(list2), equals(10)));
test('최대값을 반환', () => expect(findMax(list1), equals(11)));
}
![](https://velog.velcdn.com/images/ssh0407/post/cce37f75-5acb-47de-9482-8a23a8f6de8e/image.png)
문자열을 거꾸로 반환하는 함수
import 'package:basic/23_12_18/reverse_string.dart';
import 'package:test/test.dart';
void main() {
String s1 = 'hello';
String s2 = 'world';
test('olleh를 반환한다', () => expect(reverseString(s1), equals('olleh')));
test('dlrow를 반환한다', () => expect(reverseString(s2), equals('dlrow')));
test('dlrow를 반환한다', () => expect(reverseString(s1), equals('dlrow')));
}
![](https://velog.velcdn.com/images/ssh0407/post/da80c6cb-90d7-4a4c-a557-c4976ade83ae/image.png)