Flutter - Thử nghiệm

Kiểm thử là giai đoạn rất quan trọng trong vòng đời phát triển của một ứng dụng. Nó đảm bảo rằng ứng dụng có chất lượng cao. Kiểm tra yêu cầu lập kế hoạch và thực hiện cẩn thận. Đây cũng là giai đoạn mất nhiều thời gian nhất của quá trình phát triển.

Ngôn ngữ Dart và khuôn khổ Flutter cung cấp hỗ trợ rộng rãi cho việc kiểm tra tự động một ứng dụng.

Các loại kiểm tra

Nói chung, có ba loại quy trình kiểm tra để kiểm tra hoàn toàn một ứng dụng. Chúng như sau:

Kiểm tra đơn vị

Kiểm thử đơn vị là phương pháp dễ nhất để kiểm tra một ứng dụng. Nó dựa trên việc đảm bảo tính đúng đắn của một đoạn mã (nói chung là một hàm) oa phương thức của một lớp. Tuy nhiên, nó không phản ánh môi trường thực và sau đó, là lựa chọn ít nhất để tìm ra lỗi.

Kiểm tra tiện ích con

Kiểm tra widget dựa trên việc đảm bảo tính chính xác của việc tạo, hiển thị và tương tác với các widget khác như mong đợi. Nó tiến thêm một bước nữa và cung cấp môi trường gần thời gian thực để tìm thêm lỗi.

Thử nghiệm hội nhập

Kiểm thử tích hợp bao gồm cả kiểm thử đơn vị và kiểm tra tiện ích cùng với thành phần bên ngoài của ứng dụng như cơ sở dữ liệu, dịch vụ web, v.v., Nó mô phỏng hoặc mô phỏng môi trường thực để tìm ra gần như tất cả các lỗi, nhưng đây là quá trình phức tạp nhất.

Flutter cung cấp hỗ trợ cho tất cả các loại thử nghiệm. Nó cung cấp hỗ trợ rộng rãi và độc quyền cho thử nghiệm Widget. Trong chương này, chúng ta sẽ thảo luận chi tiết về kiểm thử widget.

Kiểm tra tiện ích con

Khung thử nghiệm Flutter cung cấp phương pháp testWidgets để kiểm tra các vật dụng. Nó chấp nhận hai đối số -

  • Mô tả thử nghiệm
  • Mã kiểm tra
testWidgets('test description: find a widget', '<test code>');

Các bước liên quan

Kiểm tra tiện ích bao gồm ba bước riêng biệt -

  • Hiển thị tiện ích con trong môi trường thử nghiệm.

  • WidgetTester là lớp được cung cấp bởi khung thử nghiệm Flutter để xây dựng và hiển thị widget. Phương thức pumpWidget của lớp WidgetTester chấp nhận bất kỳ widget nào và hiển thị nó trong môi trường thử nghiệm.

testWidgets('finds a specific instance', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
});
  • Tìm tiện ích mà chúng tôi cần kiểm tra.

    • Flutter framework cung cấp nhiều tùy chọn để tìm các widget được hiển thị trong môi trường thử nghiệm và chúng thường được gọi là Finders. Các công cụ tìm kiếm được sử dụng thường xuyên nhất là find.text, find.byKey và find.byWidget.

      • find.text tìm tiện ích có chứa văn bản được chỉ định.

find.text('Hello')
      • find.byKey tìm tiện ích bằng khóa cụ thể của nó.

find.byKey('home')
      • find.byWidget tìm tiện ích bằng biến cá thể của nó.

find.byWidget(homeWidget)
  • Đảm bảo widget hoạt động như mong đợi.

  • Khung công tác Flutter cung cấp nhiều tùy chọn để đối sánh tiện ích con với tiện ích con mong đợi và chúng thường được gọi là Matchers . Chúng tôi có thể sử dụng phương pháp mong đợi được cung cấp bởi khung thử nghiệm để đối sánh tiện ích con mà chúng tôi đã tìm thấy ở bước thứ hai với tiện ích con mong đợi của chúng tôi bằng cách chọn bất kỳ đối sánh nào. Một số đối sánh quan trọng như sau.

    • findOneWidget - xác minh một widget được tìm thấy.

expect(find.text('Hello'), findsOneWidget);
    • findNothing - xác minh không tìm thấy widget nào

expect(find.text('Hello World'), findsNothing);
    • findWidgets - xác minh nhiều hơn một widget được tìm thấy.

expect(find.text('Save'), findsWidgets);
    • findNWidgets - xác minh số lượng widget được tìm thấy.

expect(find.text('Save'), findsNWidgets(2));

Mã thử nghiệm hoàn chỉnh như sau:

testWidgets('finds hello widget', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
   expect(find.text('Hello'), findsOneWidget); 
});

Ở đây, chúng tôi đã hiển thị một tiện ích MaterialApp với văn bản Xin chào bằng cách sử dụng tiện ích Văn bản trong phần thân của nó. Sau đó, chúng tôi sử dụng find.text để tìm tiện ích và sau đó đối sánh nó bằng cách sử dụng findOneWidget.

Ví dụ làm việc

Hãy để chúng tôi tạo một ứng dụng rung đơn giản và viết một bài kiểm tra tiện ích để hiểu rõ hơn các bước liên quan và khái niệm.

  • Tạo một ứng dụng rung mới, flut_test_app trong Android studio.

  • Mở widget_test.dart trong thư mục thử nghiệm. Nó có một mã thử nghiệm mẫu như được đưa ra bên dưới -

testWidgets('Counter increments smoke test', (WidgetTester tester) async {
   // Build our app and trigger a frame. 
   await tester.pumpWidget(MyApp()); 
   
   // Verify that our counter starts at 0. 
   expect(find.text('0'), findsOneWidget); 
   expect(find.text('1'), 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('1'), findsOneWidget); 
});
  • Ở đây, mã kiểm tra thực hiện các chức năng sau:

    • Kết xuất tiện ích MyApp bằng tester.pumpWidget.

    • Đảm bảo rằng bộ đếm ban đầu bằng 0 bằng cách sử dụng các đối sánh findOneWidget và findNothing.

    • Tìm nút tăng bộ đếm bằng phương thức find.byIcon.

    • Nhấn vào nút tăng bộ đếm bằng phương pháp tester.tap.

    • Đảm bảo rằng bộ đếm được tăng lên bằng cách sử dụng các trình đối sánh findOneWidget và findNothing.

  • Hãy để chúng tôi nhấn lại vào nút tăng bộ đếm và sau đó kiểm tra xem bộ đếm có được tăng lên hai hay không.

await tester.tap(find.byIcon(Icons.add)); 
await tester.pump(); 

expect(find.text('2'), findsOneWidget);
  • Nhấp vào Chạy menu.

  • Nhấp vào kiểm tra trong tùy chọn widget_test.dart. Thao tác này sẽ chạy thử nghiệm và báo cáo kết quả trong cửa sổ kết quả.