# Flutter UnitTest ###### tags:`flutter` APP上的許多功能需測試的不單單只有邏輯部分,還有元件(Widget)的呈現、API的回傳與本地DB的資料,在這裡將各個需要測試的部分一一列舉出來,並寫下相關資源的關鍵字。 參考下列文章,總結有以下幾種測試方式 [【Flutter基礎概念與實作】 Day18–Flutter測試框架以及Mockito Package使用範例介紹](https://ithelp.ithome.com.tw/articles/10223393) [Flutter如何寫測試案例](https://lihsinplayer.medium.com/flutter-%E5%A6%82%E4%BD%95%E5%AF%AB%E6%B8%AC%E8%A9%A6%E6%A1%88%E4%BE%8B-5a41bad314fb) 邏輯測試:UnitTest [官方文件](https://flutter.dev/docs/cookbook/testing/unit/introduction) 元件測試:WidgetTest [官方文件](https://flutter.dev/docs/cookbook/testing/widget/introduction) 模擬API:Mockito Package [官方文件](https://flutter.dev/docs/cookbook/testing/unit/mocking) [Mockito package](https://pub.dev/packages/mockito) 集成測試:Integration Test [官方文件](https://flutter.dev/docs/cookbook/testing/integration/introduction) --- ## UnitTest 可參考PHPUnit瞭解寫法 1. 在pubspec.yaml內引入test套件 2. 創建一個test資料夾,跟lib資料夾於同個目錄底下 3. 創建一個dart檔,名稱跟lib資料夾內的某dart檔一樣,但於後面多了_test字樣。 ``` BMICounter/ lib/ counter.dart test/ counter_test.dart ``` 4. 在counter.dart內創建一個class,並於counter_test.dart內引入counter.dart,然後開始寫測試。 ``` import 'package:test/test.dart'; import 'package:counter_app/counter.dart'; void main() { test('Counter value should be incremented', () { final counter = Counter(); counter.increment(); expect(counter.value, 1); //測試counter.value == 1,若是則通過,否則跳錯誤,要注意型態 }); } ``` 5. 使用group將相同類型的測試放在一起 ``` import 'package:test/test.dart'; import 'package:counter_app/counter.dart'; void main() { group('Counter', () { test('value should start at 0', () { expect(Counter().value, 0); }); test('value should be incremented', () { final counter = Counter(); counter.increment(); expect(counter.value, 1); }); test('value should be decremented', () { final counter = Counter(); counter.decrement(); expect(counter.value, -1); }); }); } ``` 6. 於terminal執行測試的指令,顯示結果 ```flutter test test/counter_test.dart``` 以上是Unit Test於官方文件中的範例。 如果要測試的功能有包含database, api這類需要模擬,請參考[Mockito](https://pub.dev/packages/mockito)。