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 thử để 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 widget, 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à kết xuất 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'), 
      ), 
   )); 
});
find.text('Hello')
find.byKey('home')
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 để khớp tiện ích con với tiện ích con mong đợi và chúng thường được gọi là Người đối sánh. Chúng tôi có thể sử dụng phương pháp mong đợi do khung thử nghiệm cung cấp để đố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.

expect(find.text('Hello'), findsOneWidget);
expect(find.text('Hello World'), findsNothing);
expect(find.text('Save'), findsWidgets);
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 widget để hiểu rõ hơn về các bước liên quan và khái niệm.

  • Tạo một ứng dụng Flagship mới, Flagship_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 cung cấp 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 bộ so khớp 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 kết hợp 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);

Kiểm tra rung