sync86 블로그

[Dart/Flutter] 테스트 - Map.putIfAbsent 본문

개발기

[Dart/Flutter] 테스트 - Map.putIfAbsent

sync86 2024. 11. 29. 07:00
728x90

 

코드를 수정하면 수정한 곳 이외에 다른 곳에서 오류가 생기는 경우가 많아졌다. 해결 방법으로 테스트를 작성하여 만약 문제가 생긴다면 빨리 발견하면 좋을 것 같다. 그러나 TDD (Test Driven Development)로 코드를 작성하길 원하는 것은 아니다. 적어도 코드를 수정하면 어디서 문제가 생겼다는 것만 발견할 수 있으면 된다. 그러나 아직 습관이 안되서 테스트를 작성하는 것에 손이 가지 않는다. 그래서 블로그에 글 작성을 빌미로 시도해보려고한다.

Dart 프로젝트 생성

목표는 Flutter 위젯과 함께 통합 테스트까지 작성하는 것이다. 하지만 처음에는 간단하게 시작하길 원한다.

$ dart create putifabsent
Creating putifabsent using template console...

  .gitignore
  analysis_options.yaml
  CHANGELOG.md
  pubspec.yaml
  README.md
  bin/putifabsent.dart
  lib/putifabsent.dart
  test/putifabsent_test.dart

Running pub get...                     2.5s
  Resolving dependencies...
  Downloading packages...
  Changed 50 dependencies!
  5 packages have newer versions incompatible with dependency constraints.
  Try `dart pub outdated` for more information.

Created project putifabsent in putifabsent! In order to get started, run the following commands:

  cd putifabsent
  dart run

테스트 작성 - putifabsent:/test/putifabsent.dart

유닛테스트를 작성하기 전에 어떤 결과를 기대하는지 간략히 정리하였다. 추가적으로 좀 더 당연하다고 생각하는 것, 좀 더 다양한 테스트 할 수 있는 상황이 있을 것 같다는 느낌이 든다. 그러나 생각이 나지 않는다. ㅠㅠ

  • 초기
    • Map을 생성한 직후에는 Map 컬렉션은 비어 있어야 한다.
    • 비어있으면서, a키는 없어야 한다.
  • _cachedMap.putIfAbsent 호출하여 a키에 1을 대입할 경우
    • a키가 있어야 한다.
    • a키의 값은 1이어야 한다.
  • _cachedMap.putIfAbsent 을 한번 더 호출하여 a키에 1을 대입할 경우
    • 한번 더 대입하더라도, a키가 있어야 한다.
    • 한번 더 대입하더라도, a키의 값은 1이어야 한다.
import 'package:test/test.dart';

final Map<String, int> _cachedMap = <String, int>{};

void main() {
  group('초기,', () {
    test('_cachedMap은 비어 있어야 한다.', () {
      expect(_cachedMap.isEmpty, equals(true));
    });

    test('_cachedMap에 a키가 없어야 한다.', () {
      expect(_cachedMap.containsKey('a'), equals(false));
    });
  });

  group('_cachedMap.putIfAbsent', () {
    test('a키를 대입한다.', () {
      _cachedMap.putIfAbsent('a', () => 1);
    });

    test('_cachedMap.putIfAbsent a키를 대입했다면, a키는 있어야 한다.', () {
      expect(_cachedMap.containsKey('a'), equals(true));
    });

    test('_cachedMap.putIfAbsent a키를 대입했다면, a키의 값은 1 이어야 한다.', () {
      expect(_cachedMap['a'], equals(1));
    });
  });

  group('_cachedMap.putIfAbsent', () {
    test('한번 더 _cachedMap.putIfAbsent에 a키의 값을 1로 대입한다.', () {
      _cachedMap.putIfAbsent('a', () => 1);
    });

    test('a키는 있어야 한다.', () {
      expect(_cachedMap.containsKey('a'), equals(true));
    });

    test('a키의 값은 1이어야 한다.', () {
      expect(_cachedMap['a'], equals(1));
    });
  });
}

작성한 테스트 실행

$ flutter test 명령어를 실행하였다. 물론 Visual Studio Code와 Dart/Flutter 확장 플러그인을 함께 사용하기 때문에 구태여 콘솔에서 실행할 이유는 없다. 그런데 결과를 보니 2번 실행된 것 같은데 어떤 이유일까?

찾아봐야겠다.

$ dart test
Building package executable...
Built test:test.
00:00 +0: test/putifabsent_test.dart: 초기, _cachedMap은 비어 있어야 한다.
00:00 +1: test/putifabsent_test.dart: 초기, _cachedMap은 비어 있어야 한다.
00:00 +1: test/putifabsent_test.dart: 초기, _cachedMap에 a키가 없어야 한다.
00:00 +2: test/putifabsent_test.dart: 초기, _cachedMap에 a키가 없어야 한다.
00:00 +2: test/putifabsent_test.dart: _cachedMap.putIfAbsent a키를 대입한다.
00:00 +3: test/putifabsent_test.dart: _cachedMap.putIfAbsent a키를 대입한다.
00:00 +3: test/putifabsent_test.dart: _cachedMap.putIfAbsent _cachedMap.putIfAbsent a키를 대입했다면, a키는 있어야 한다.
00:00 +4: test/putifabsent_test.dart: _cachedMap.putIfAbsent _cachedMap.putIfAbsent a키를 대입했다면, a키는 있어야 한다.
00:00 +4: test/putifabsent_test.dart: _cachedMap.putIfAbsent _cachedMap.putIfAbsent a키를 대입했다면, a키의 값은 1 이어야 한다.
00:00 +5: test/putifabsent_test.dart: _cachedMap.putIfAbsent _cachedMap.putIfAbsent a키를 대입했다면, a키의 값은 1 이어야 한다.
00:00 +5: test/putifabsent_test.dart: _cachedMap.putIfAbsent 한번 더 _cachedMap.putIfAbsent에 a키의 값을 1로 대입한다.
00:00 +6: test/putifabsent_test.dart: _cachedMap.putIfAbsent 한번 더 _cachedMap.putIfAbsent에 a키의 값을 1로 대입한다.
00:00 +6: test/putifabsent_test.dart: _cachedMap.putIfAbsent a키는 있어야 한다.
00:00 +7: test/putifabsent_test.dart: _cachedMap.putIfAbsent a키는 있어야 한다.
00:00 +7: test/putifabsent_test.dart: _cachedMap.putIfAbsent a키의 값은 1이어야 한다.
00:00 +8: test/putifabsent_test.dart: _cachedMap.putIfAbsent a키의 값은 1이어야 한다.
00:00 +8: All tests passed!
728x90