Tự động hóa
Đọc lại một lượt chạy
Vì sao một lượt chạy báo Thành công mà chẳng làm gì, Thất bại và TIMEOUT thật ra đang nói điều gì, và cách khiến lượt chạy sau tự khai ra.
7 phút đọc
Một lượt chạy kết thúc thì đưa cho bạn đúng một chữ: Thành công, Thất bại, Đã dừng, Hết hạn. Tìm chữ đó ở đâu và mỗi chữ nghĩa là gì thì bài Chạy kịch bản và theo dõi đã lo.
Bài này lo câu hỏi khó hơn nằm bên dưới. Chữ đó không phải lời phán xem việc đã xong hay chưa — nó là bản báo cáo về việc kịch bản đã kết thúc như thế nào. Hai thứ ấy tách nhau ra thường xuyên hơn người ta tưởng, và hiểu được chỗ tách nhau là thứ biến một lượt chạy hỏng thành một bản sửa.
"Thành công" có thể nghĩa là "im lặng dừng sớm"
Hãy học cái bẫy này trước, vì chẳng có gì cảnh báo bạn về nó cả.
Lượt chạy đi từ node này sang node kia theo dây. Tới một đầu ra không có dây nối, nó dừng — và trình soạn thảo nói rõ điều đó được tính là gì:
"out, true, false, case, timeout trống: flow kết thúc thành công tại đó."
Nên một kịch bản hai mươi node mà mới nối dây tới node thứ sáu thì không hề kêu ca. Nó chạy sáu node đó, thấy phía sau không còn gì, rồi báo Thành công. Nhánh bạn quên nối cũng vậy: một node Nếu (If) để hở đầu ra false sẽ kết thúc lượt chạy mỗi lần điều kiện sai, và gọi đó là thành công.
Thành công nghĩa là kịch bản đã hết dây mà không báo lỗi. Nó không có nghĩa là app đã làm đúng thứ bạn muốn, và thậm chí không có nghĩa là kịch bản đã đi tới cái kết bạn hình dung.
Trước khi tin một lượt chạy màu xanh, hãy nhìn lại khung vẽ và hỏi xem đầu ra nào đang bỏ trống. Mỗi cái trong số đó là một cửa ra.
Trong thân vòng lặp thì cùng một luật lại đọc ra nghĩa khác: "Trong thân loop, đầu ra trống là hết một lượt lặp." Ở đó, để hở đầu ra là bình thường — đó chính là cách một lượt lặp kết thúc. Và đó cũng đúng là lý do thói quen này dễ nhiễm rồi mang sang chỗ khác, nơi nó gây hại.
"Thất bại" không phải lúc nào cũng là sập
Ba thứ khác hẳn nhau đều hiện ra thành Thất bại.
Chính kịch bản của bạn nói vậy. Node Dừng kịch bản (Stop flow) mang theo một mã kết quả, và trình soạn thảo mô tả lựa chọn đó thế này: "Thành công: kịch bản kết thúc tốt. Thất bại: kịch bản dừng và được tính là chạy hỏng, người chạy sẽ thấy lỗi." Một kịch bản kiểm tra điều gì đó rồi chủ động kết thúc ở trạng thái Thất bại là một kịch bản đang chạy đúng. Hãy đọc kịch bản trước khi đi bắt lỗi nó.
Một bước trượt mà không có đường đi tiếp. Node nào có thể trượt thì có đầu ra error — "Thao tác thất bại: click không thấy element, HTTP lỗi…". Để trống đầu ra đó thì "error trống: flow dừng và báo lỗi." Đây mới là thất bại thật, và là loại hay gặp.
Để ý chỗ bất đối xứng, vì nó bẫy nhiều người: mọi đầu ra khác bỏ trống thì kết thúc lượt chạy trong trạng thái thành công, riêng error bỏ trống thì kết thúc trong trạng thái thất bại — kể cả khi nằm trong vòng lặp, nơi "error vẫn dừng cả flow."
Nó chạy quá lâu. Lượt chạy vẫn còn chạy sau 30 phút thì bị cắt và đánh dấu Thất bại, lý do TIMEOUT. Nguyên nhân thường gặp là một vòng lặp không có lối ra — một node Lặp khi còn đúng (While) mà điều kiện không bao giờ sai được, hoặc một cái chờ màn hình không bao giờ tới. Hãy cho mọi vòng lặp một cái trần hoặc một lối thoát; xem Danh mục node và Điều khiển luồng chạy.
Hết hạn thì không thuộc họ này chút nào. Nó nghĩa là máy chưa bao giờ nhận lượt chạy trong vòng 5 phút — một lời nói về cái máy, không phải về kịch bản, vì kịch bản còn chưa được thử. Bài Kịch bản không chạy thì làm gì đi qua ca đó theo từng triệu chứng.
Vì sao một bước hỏng có thể ngốn mấy phút
Một lượt chạy trông như đứng hình thường chỉ đang kiên nhẫn giùm bạn, và phép tính được in ngay trong trình soạn thảo:
"Số lần thử LẠI, không tính lần chạy đầu (tổng số lần chạy = giá trị + 1). Thời gian xấu nhất = thời gian chờ của node × (số lần + 1) + nghỉ giữa các lần × số lần — chờ 15 giây + thử lại 5 lần là cả phút."
Thứ tự rất quan trọng khi bạn ngồi đọc lại sau đó: "Thất bại → nghỉ khoảng này → thử lại. Hết lượt mới đi nhánh Lỗi, và khi đó không nghỉ thêm khoảng nghỉ của node." Cái lỗi rốt cuộc bạn nhìn thấy đến rất lâu sau khi thứ đầu tiên hỏng. Vài chỗ đặt số lần thử lại rộng rãi chính là cách một kịch bản trông có vẻ ổn trôi dần về phía vạch cắt 30 phút.
Làm cho lượt chạy sau tự khai ra
Kết quả cuối cho bạn biết cái gì. Muốn biết ở đâu thì phải hỏi từ trước. Ba công cụ, cái nào cũng rẻ:
Cắm node Ghi log. Node Ghi log (Log) sinh ra đúng để làm việc này: "Ghi một dòng vào nhật ký chạy — cắm để biết flow đã tới đâu và biến đang là gì". Đặt một cái sau mỗi chặng đáng kể. Hai dòng log biến "nó hỏng ở đâu đó" thành "nó hỏng giữa hai điểm này".
Nhét biến vào trong nội dung log. Dòng gợi ý của ô đó nói thẳng mẹo: "Nội dung ghi vào nhật ký chạy — chèn {{biến}} để xem giá trị tại thời điểm đó." Một giá trị nhìn thì đúng trong hộp thoại chạy mà xuống máy lại sai thì không có cách nào khác để thấy.
Chụp màn hình ở các khúc ngoặt. Node Chụp màn hình (Screenshot) được mô tả là "bằng chứng flow chạy tới đâu", lưu theo tên bạn đặt. Một tấm ảnh của cái màn hình mà kịch bản thật sự đang nhìn vào giải quyết được phần lớn tranh cãi chỉ trong một cái liếc — nhưng để ý cái tên: "Trùng tên thì ghi đè; chèn {{biến}} để phân biệt từng lượt." Đặt tên cố định rồi chụp trong vòng lặp thì cuối cùng bạn chỉ còn bằng chứng của lượt cuối.
Đặt tên cho node. Mỗi node đều có ô Tên hiển thị, và "Để trống thì lấy tên loại node" — đó chính là cách một kịch bản mười hai bước đọc lên thành Bấm · Bấm · Bấm. Chỗ gợi ý cho sẵn văn phong: "Ví dụ: Bấm Đăng nhập". Mỗi node năm giây, đổi lại là một kịch bản vẫn đọc hiểu được khi bạn quay lại sau vài tuần.
Đọc một lượt thất bại từ đầu tới cuối
Ghép lại, một lượt chạy hỏng thường được đọc theo thứ tự này:
- Kết quả và lý do của nó — đây là lỗi thật, là
TIMEOUT, hay là node Dừng kịch bản của chính bạn đang làm đúng việc? - Các dòng log của bạn — dòng cuối cùng được ghi cho biết nó đi hết chặng nào.
- Màn hình lúc đó — ảnh bạn tự chụp, cộng với cấu trúc màn hình được ghi lại kèm lỗi.
- Bản thân cái node — một bước không tìm thấy phần tử thì hoặc là đang tìm nhầm thứ, hoặc là tìm quá sớm. Bài Làm cho thao tác bấm sống được lâu lo vế đầu, còn vế sau thì cách chữa là chờ đúng màn hình thay vì đoán một khoảng thời gian.
Các nguyên nhân theo từng triệu chứng — biến rỗng, lượt chạy bị lượt khác chiếm máy, kịch bản hôm qua chạy hôm nay trượt — nằm ở bài Kịch bản không chạy thì làm gì.
Tóm tắt
- Thành công nghĩa là kịch bản hết dây mà không báo lỗi — một đầu ra out, true, false, case hay timeout bỏ trống sẽ kết thúc lượt chạy ngay tại đó và vẫn tính là thành công.
- Đầu ra error bỏ trống là ngoại lệ: nó kết thúc lượt chạy trong trạng thái thất bại, kể cả khi nằm trong vòng lặp.
- Thất bại có thể là lỗi thật, là
TIMEOUTsau 30 phút, hoặc là node Dừng kịch bản của chính bạn đang báo kết quả. - Thử lại thì nhân lên: thời gian chờ của node nhân số lượt thử, cộng thêm khoảng nghỉ giữa các lượt.
- Cắm node Ghi log có kèm biến trong nội dung, Chụp màn hình ở các khúc ngoặt, và đặt Tên hiển thị cho mọi node — làm trước cái lượt chạy mà sau này bạn sẽ phải ngồi đọc.