[Flutter] TDD 실습해보기 - 1

2023. 1. 3. 16:04IT/Flutter

SMALL
TDD란 ?
실패하는 테스트 작성 -> 테스트가 성공하게 만들기 -> 작성한 코드 리팩토링
순서를 계속 반복하면서 소프트웨어를 개발해 나가는 방법론이다.

 

 

먼저 실습할 앱은 flutter skeleton 앱이며, 기존에는 tap을 하게되면 카운트가 1씩증가했지만

요구사항이 변경되어 카운트가 2씩 증가하는 기능으로 변경하고자한다.

 

1. 카운트가 2씩 증가하는 테스트 작성

void main() {
  testWidgets('Counter increments smoke test', (WidgetTester tester) async {
    // Build our app and trigger a frame.
    await tester.pumpWidget(const MyApp());

    // Verify that our counter starts at 0.
    expect(find.text('0'), findsOneWidget);
    expect(find.text('2'), findsNothing);

    // Tap the '+' icon and trigger a frame.
    await tester.tap(find.byIcon(Icons.add));
    await tester.pump();

    // Verify that our counter has incremented.
    expect(find.text('0'), findsNothing);
    expect(find.text('2'), findsOneWidget);
  });
}

테스트 결과

══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure was thrown running a test:
Expected: exactly one matching node in the widget tree
  Actual: _TextFinder:<zero widgets with text "2" (ignoring offstage widgets)>
   Which: means none were found but one was expected

When the exception was thrown, this was the stack:
#4      main.<anonymous closure> (file:///Users/satoshi/Documents/skeleton_tdd/test/widget_test.dart:28:5)
<asynchronous suspension>
<asynchronous suspension>
(elided one frame from package:stack_trace)

This was caught by the test expectation on the following line:
  file:///Users/satoshi/Documents/skeleton_tdd/test/widget_test.dart line 28
The test description was:
  Counter increments smoke test
════════════════════════════════════════════════════════════════════════════════════════════════════
00:02 +0 -1: Counter increments smoke test [E]                                                                                                                                                         
  Test failed. See exception logs above.
  The test description was: Counter increments smoke test

예상한대로 탭을 한 이후 2라는 텍스트를 찾을 수 없었고 그에따라 테스트가 실패하였다.

 

2. 테스트가 성공하도록 만들자

  //변경전
  /**
     void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }
  */
  
  
  //변경후
  void _incrementCounter() {
    setState(() {
      _counter = _counter+2;
    });
  }

결과

00:02 +1: Counter increments smoke test  
00:02 +1: All tests passed!

3. 리팩토링

너무 간단해서 리팩토링이 할게 없을것같다. 그럼 다음 개발작업에 들어가면 되는것이고 리팩토링이 필요하다면 수행한다.

 

 

너무 간단한 예제라 이러한  프로세스로 개발이 진행되는구나~ 정도로만 알고있으면 좋을 것 같다.

 

다음포스팅은 아마 widget test가 되지않을까

LIST