Giảm thời gian viết và duy trì các bài kiểm tra trong Flutter

Jul 25 2022
Tất cả chúng ta đều đã nghe nói rằng kiểm tra là vô cùng quan trọng và nó có rất nhiều lợi ích như cải thiện sự tự tin và giảm lỗi. Tuy nhiên, các bài kiểm tra end-to-end / tích hợp trong Flutter thường tốn nhiều thời gian để viết, gỡ lỗi và bảo trì, và lãng phí nhiều thời gian.

Tất cả chúng ta đều đã nghe nói rằng kiểm tra là vô cùng quan trọng và nó có rất nhiều lợi ích như cải thiện sự tự tin và giảm lỗi. Tuy nhiên, các bài kiểm tra end-to-end / tích hợp trong Flutter thường tốn nhiều thời gian để viết, gỡ lỗi và bảo trì, và lãng phí nhiều thời gian. Điều này làm cho thử nghiệm không phải là một công việc dễ chịu và rất dễ bị bỏ qua (ít nhất là đối với tôi: /). Do đó, chúng ta hãy suy nghĩ lại và cố gắng giảm lãng phí thời gian.

Lý tưởng so với thực tế (cũ)

Hãy nhắm mắt lại và tưởng tượng: Các bài kiểm tra sẽ như thế nào trong một thế giới lý tưởng? Vâng, chỉ cần nói với máy tính những gì chúng ta mong đợi sẽ xảy ra mà không lãng phí một từ nào. Đó là tất cả. Sau đó, khi các bài kiểm tra vượt qua, chúng tôi tự tin; bất cứ khi nào thử nghiệm không thành công, nó phải chỉ ra rõ ràng mã doanh nghiệp của chúng tôi bị sai ở đâu để chúng tôi có thể sửa chữa nó.

Tuy nhiên, đó không phải là thực tế. Trong thế giới thực, người ta dành nhiều thời gian hơn (đọc là: lãng phí) cho các khía cạnh khác của bài kiểm tra.

Một sự khác biệt đáng kể giữa lý tưởng và thực tế là thời gian cần thiết để xác định nguyên nhân gốc rễ của lỗi thử nghiệm, có thể được gọi là khả năng gỡ lỗi (tổng quát ) . Mặt khác, sau khi viết một bài kiểm tra, thường xảy ra trường hợp nó không thành công một vài lần trước khi nó vượt qua, bởi vì bài kiểm tra của chúng tôi có lỗi hoặc mã nghiệp vụ có vấn đề. Mặt khác, hồi quy (một bài kiểm tra đã vượt qua trước đó không thành công bây giờ) xảy ra theo thời gian, điều này cho thấy có một số vấn đề trong mã cập nhật của chúng tôi. Trong cả hai trường hợp, chúng ta cần phải tìm ra nguyên nhân gốc rễ để khắc phục nó. Do đó, tốc độ định vị lỗi chậm góp phần rất nhiều vào việc lãng phí thời gian.

Flutter's integration_testcó, tốt, trải nghiệm nhà phát triển không xuất sắc cho việc này, mặc dù toàn bộ khuôn khổ Flutter đều rất tuyệt vời và hiệu quả. Hãy xem xét một tình huống điển hình: Một thử nghiệm tích hợp / đầu cuối nhấn / kéo / cuộn nhiều phần tử và cuối cùng không thành công ở một khẳng định. Sau đó, làm thế nào để biết bước nào sai? Hãy để một mình những lỗi như vậy có thể xảy ra bên trong CI, nơi chúng tôi thường chỉ có sẵn các bản ghi. Một cách tiếp cận có thể là đọc và phân tích nhật ký - nếu chúng ta có một hệ thống ghi nhật ký kỹ lưỡng - nhưng nó vẫn còn chậm vì nhiều lỗi có thể được phát hiện nhanh chóng bằng cách nhìn vào giao diện người dùng hoặc du hành thời gian. Quan sát kỹ những gì trình mô phỏng hiển thị cũng không phải là một lựa chọn hoàn hảo, vì các lần nhấn / kéo thường xảy ra quá nhanh và điều này là không thể đối với chế độ CI. Các chi tiết khác trong quá trình tìm hiểu nguyên nhân cũng có thể lãng phí một chút thời gian.

Ngoài ra còn có các khía cạnh khác. Việc thiếu khả năng thử lại sẽ lãng phí một thời gian. Trong các thử nghiệm tích hợp / đầu cuối, các sự kiện không xác định, chẳng hạn như yêu cầu mạng, xảy ra khá thường xuyên. Chúng ta không thể biết chính xác khi nào nó sẽ kết thúc. Do đó, các bài kiểm tra phải được viết với các lần đợi và thử lại. Rung động , là điều tự nhiên trong các bài kiểm tra đầu cuối, cũng gây ra một số kết quả dương tính giả. Không ai muốn dành thời gian kiểm tra bài kiểm tra “thất bại”, chỉ để nhận ra nó chỉ là bong tróc.

Đó thế giới thực. Chúng ta có thể làm điều đó tốt hơn không?

Một giải pháp

Tất cả những vấn đề đau đầu ở trên khiến tôi phải viết một thư viện mã nguồn mở :

Gói, flutter_convenient_testcố gắng giảm thiểu các quy trình lãng phí thời gian được đề cập ở trên. Chắc chắn, nó không hoàn hảo (và còn non trẻ), nhưng tôi hy vọng bước nhỏ của tôi có thể giúp bạn tiết kiệm thời gian và truyền cảm hứng cho những cải tiến tiết kiệm thời gian hơn.

Lưu ý: Nó được xây dựng bên trên integration_test, vì vậy bạn vẫn có thể sử dụng các gói yêu thích của mình như integration_test,,, mockitov.v. flutter_testvà di chuyển sang thư viện này với các sửa đổi nhỏ.

Hãy xem gói này làm gì để gỡ lỗi. (Tất cả các tính năng sau đây cũng có thể áp dụng khi chạy trong CI - nó sẽ tạo ra một gói dữ liệu và chúng ta có thể hình dung nó sau này trên máy tính để bàn.)

Để bắt đầu, chúng ta có thể xem tất cả các hành động / xác nhận được thực hiện trong các bài kiểm tra, với các mô tả thân thiện.

Tiếp theo, chúng ta có thể du hành thời gian bằng ảnh chụp màn hình. Giao diện người dùng trông như thế nào khi nút đó được nhấn vào cách đây thậm chí 50 bước? Bây giờ chúng tôi biết tất cả mọi thứ.

Bạn muốn xem nó trực tiếp thay vì ảnh chụp màn hình? Không sao - chúng tôi có các bản ghi video.

Có nhiều chức năng hơn để giúp phát hiện lỗi dễ dàng hơn. Ví dụ:

  • Chúng tôi có thể chuyển đổi chế độ và chơi với ứng dụng một cách tương tác, ngay cả khi chúng tôi đang chạy thử nghiệm. Điều này có vẻ không dễ dàng trong thời đại integration_testvà chúng tôi đã phải khởi động lại hoàn toàn cho điều đó.
  • Sau khi sửa đổi mã, các bài kiểm tra có thể được thực hiện lại trong vòng vài giây chứ không phải vài phút.
  • Goldens nâng cao - “dung sai” có thể định cấu hình (cho phép một phần pixel khác biệt ở một mức độ nào đó so với hình ảnh vàng); một bảng điều khiển đầy đủ để kiểm tra sự khác biệt vàng bằng kính lúp.
  • Một bài kiểm tra đơn lẻ hoặc một nhóm có thể được chạy trong một cú nhấp chuột.
  • Đối với khả năng thử lại, gói này tự động chèn pumpvà thử lại bất cứ khi nào thích hợp, vì vậy hoàn toàn không cần con người can thiệp và viết mã.
  • Khi nói đến bong tróc, thư viện hoàn toàn hiểu nó và sẽ không xem nó sai là thất bại (và có thể là một lỗi lớn màu đỏ trong CI) cũng như coi nó đã thành công.

Tóm lại, chúng tôi đã thấy việc thử nghiệm trong Flutter đã chứa một số thời gian lãng phí, bao gồm cả thời gian bổ sung để xác định nguyên nhân lỗi, thiếu khả năng thử lại và không ổn định. Do đó, tôi đã thực hiện Flagship_conosystem_test cố gắng giảm nó xuống mức tối thiểu. Hy vọng nó có thể tiết kiệm thời gian của bạn!

© Copyright 2021 - 2022 | vngogo.com | All Rights Reserved