Thực tế thì khi thực hiện chạy test bằng Robot Framework, chúng ta sẽ thường xuyên gặp các test case lỗi trong quá trình phát triển bộ script test tự động. Để giúp việc dễ dàng hơn trong việc xác định lỗi, Robot Framework cung cấp một số tính năng và có một số thủ thuật.

Errors

Error về cơ bản là khi test case fail do các lỗi viết test case.

Khi một test case fail, thông thường, từ bước của một keyword nhất định đã fail, toàn bộ các keyword phía sau sẽ không được thực hiện. Nó sẽ nhảy thẳng đến Test Teardown, chạy nốt rồi tới test case tiếp theo. Sau đó, kết quả của test case cùng test suite sẽ được báo lại ở trong log.htmloutput.xml

Với việc chạy test bằng VSCode hay kể cả trong command line, thì kết quả khi một test case fail sẽ đầu tiên được báo trong terminal

Ví dụ với việc chạy test suite bằng cmd: robot --suite Logout ./

------------------------------------------------------------------------------
Duy247.github.io.Logout                                               | FAIL |
2 tests, 1 passed, 1 failed
==============================================================================
Duy247.github.io                                                      | FAIL |
2 tests, 1 passed, 1 failed
==============================================================================

Báo cáo lỗi sẽ không uy tín cho lắm, vì thiếu đi các thông tin cần thiết để bắt bug. Còn nếu thực hiện chạy test bằng GUI, nó sẽ cho ra một cái báo cáo trong terminal nhìn khá hơn chút

Logout
==============================================================================
Test Normal                                                           | PASS |
------------------------------------------------------------------------------
Test Flaky                                                            | FAIL |
No keyword with name 'Log 2' found. Did you mean:
    BuiltIn.Log
------------------------------------------------------------------------------
Logout                                                                | FAIL |
2 tests, 1 passed, 1 failed
==============================================================================

Nó sẽ có cấu trúc rõ ràng hơn, bắt đầu với report về test case, cái nào Pass, cái nào Fail và tại sao fail, cuối cùng là tổng lại report về Suite.

Tuy nhiên, nếu nhìn từ file log.html thì hiệu quả trong việc báo lỗi là giống nhau. Ở đây test suite mình cho chạy là

*** Settings ***
Name    Logout
Library   SeleniumLibrary

*** Test Cases ***
Test Normal
    Log    1
Test Flaky
    [Tags]    flaky
    Log 2
Log giữa hai kiểu chạy
Log giữa hai kiểu chạy

Log giữa hai kiểu chạy

Cả 2 file log.html đều cung cấp đầy đủ thông tin về lỗi, đều chỉ ra lỗi là nằm ở Log 2, vì mình viết Log2 quá gần nhau, không theo tiêu chuẩn nên Robot Framework hiểu Log 2 là một keyword. Nếu báo lỗi quá dài thì nó sẽ bị cắt bớt ở trong report.html, nhưng ở trong log.html thì nó sẽ hiển thị đầy đủ.

Cách nhanh nhất để tìm và hiểu error của test case là xem log.htmlreport.html.

Ngoài ra có phương pháp nhanh hơn có thể phát hiện ra các error do syntax là sử dụng Language Highlight khi sử dụng IDE

Việc test case dính error có thể hoặc:

  1. Là do lỗi của test case, code sai

  2. Là do logic của test case có vấn đề

Exceptions

Exception là nguyên nhân chính dẫn đến một test case bị fail, nó rộng hơn và bao hàm Error.

Nguyên nhân dẫn đến Exception:

  1. Là do test case error như đã nêu ở trên
  2. Là do lỗi của test data, dữ liệu không đúng, import không đúng hoặc sử dụng không đúng
  3. Là do lỗi của keyword, gọi sai tên keyword, hoặc keyword không tồn tại
  4. Là do lỗi của thư viện, thư viện không được import, hoặc import sai
  5. Do sản phẩm thực sự gặp bug

Tuỳ thuộc vào báo lỗi mà chúng ta sẽ xác định được nguyên nhân, thường, chúng ta sẽ phải đi lần lượt từ trên xuống trước khi kết luận được có bug hay không khi thực hiện chạy test

Có các phương pháp cơ bản để handle Exception một cách bài bản và tránh được các hậu quả không đáng có.

Handle Exceptions

Mặc định, khi một keyword thuộc một test case hay keyword lớn fail, thì ngay lập tức keyword lớn hay test case sẽ fail và các keyword sau sẽ không chạy nữa, nhưng nhiều khi bài test của chúng ta được thiết kế khác với hành vi mặc định thì sẽ có các phương án phù hợp tuỳ theo yêu cầu.

Sử dụng Keywords

Run Keyword And Expect Error

Run Keyword And Expect Error là một keyword giúp chạy một keyword khác và sẽ đợi lỗi của keyword kia. Nôm na là chúng ta đang mong muốn keyword đó fail, nếu nó thật sự fail thì keyword này sẽ pass, ngược lại thì keyword này sẽ fail.

Ví dụ

*** Test Cases ***
Test Run Keyword And Expect Error
    Run Keyword And Expect Error    PREFIX:Message    Keyword

Cách bắt Message của Exception như sau:

Đầu tiên PREFIX ở đây có 3 loại là EQUALS, STARTS, REGXP.

Với EQUALS thì nó sẽ so sánh chính xác với message của Exception, phù hợp với việc bắt cứng message Exception tức là bạn chỉ đang mong muốn 1 kiểu Exception xảy ra, ví dụ như

*** Test Cases ***
Test Run Keyword And Expect Error
    Run Keyword And Expect Error    EQUALS:No match for '//input[@type="text"]'    Keyword

Ở đây có nghĩa là bạn đang mong sẽ không tìm thấy element với locator xpath là //input[@type="text"]

Với STARTS thì nó sẽ so sánh với message Exception từ đầu, phù hợp với việc bắt đúng loại Exception nhưng mà bạn không chắc chắn về message, ví dụ như

*** Test Cases ***
Test Run Keyword And Expect Error
    Run Keyword And Expect Error    STARTS:ValueError:    Keyword

Ở đây chúng ta sẽ đợi tất cả khả năng ValueError, còn cái nào dính Exception thì không cần quan tâm, phù hợp sử dụng khi Exception mà chúng ta đang đợi có thể có nhiều khả năng xảy ra khác nhau

Với REGXP thì nó sẽ so sánh với message Exception theo một pattern, cũng phù hợp với việc bắt Exception mà chúng ta không chắc chắn về message như STARTS, nhưng vì là Regex nên nó mạnh hơn khi bắt được pattern ở giữa và cuối message, ví dụ như

*** Test Cases ***
Test Run Keyword And Expect Error
    Run Keyword And Expect Error    REGEXP:.*'//input[@type="text']'.*    Keyword

Ở đây chúng ta đang mong muốn bắt tất cả Exception có chứa //input[@type="text"], bất kể Exception nào liên quan đến cái xpath locator này thì bắt hết.

Ngoài ra, phần PREFIX có thể bỏ trống, còn Message có thể bắt theo pattern, ví dụ như

*** Test Cases ***
Test Run Keyword And Expect Error
    Run Keyword And Expect Error    *   Keyword

Ở đây chúng ta không quan tâm đến message, chỉ cần keyword fail là được, * là pattern bắt tất cả Exception, ? là bắt 1 ký tự, [chars] là bắt 1 trong các ký tự ghi bên trong

Run Keyword And Ignore Error

Ý nghĩa của keyword này là : Chạy một keyword và bỏ qua đa số các lỗi.

Ví dụ

*** Test Cases ***
Test Run Keyword And Ignore Error
    Run Keyword And Ignore Error    Keyword

Run Keyword And Continue On Failure

Ý nghĩa của keyword này là : Chạy một keyword và nếu lỗi thì tiếp tục chạy các keyword phía sau.

Do bình thường nếu một keyword con trong một keyword lớn hay trong một test case mà fail, thì test case sẽ dừng lại, tính là fail, phần phía sau keyword này sẽ không được thực thi. Tuy nhiên với keyword này, nếu keyword con fail thì nó sẽ tính fail nhưng vẫn tiếp tục chạy các keyword phía sau.

Ví dụ

*** Test Cases ***
Test Run Keyword And Continue On Failure
    Run Keyword And Continue On Failure    Keyword

Sử dụng Try/Except

Giống như Python có Try Except, Robot Framework cũng có và cũng nhằm mục đích bắt Exception, nhưng ở đây chúng ta sẽ bắt Exception ở mức rộng hơn khi có thể đưa vào trong block Try một số lượng keyword nhất định chứ không chỉ là một như Run Keyword...

Syntax cơ bản là

*** Test Cases ***
Example
    TRY
        Keyword 1
        Keyword 2
    EXCEPT    Exception
        Keyword 3
    END
    Keyword 4

Trong tình huống trên, nếu 1 trong 2 Keyword Keyword 1 hoặc Keyword 2 pass thì block EXCEPT chứa Keyword 3 sẽ không được thực thi. Sau đó, Keyword 4 sẽ tiếp tục được chạy giống như thể chỉ có Keyword 1, Keyword 2Keyword 4

Ngược lại, nếu bất kỳ trong số keyword Keyword 1 hoặc Keyword 2 fail với message chỉ định Exception thì block EXCEPT sẽ được thực thi, sau đó Keyword 4 sẽ tiếp tục được chạy như thể chỉ có Keyword 3Keyword 4

Nếu nếu bất kỳ trong số keyword Keyword 1 hoặc Keyword 2 fail với message không giống chỉ định thì Exception sẽ không được xử lý và fail, Keyword 4 sẽ không được chạy

Nó rất giống Try Except trong Python, vì chúng ta cũng có thể bắt nhiều Exception khác nhau, hoặc bắt tất cả Exception

*** Test Cases ***
Example
    TRY
        Keyword 1
        Keyword 2
    EXCEPT    ValueError
        Keyword 3
    EXCEPT    KeyError
        Keyword 4
    END
    Keyword 6

Ví dụ như ở trên, chúng ta đang xử lý ValueError và KeyError, nếu Keyword 1 hoặc Keyword 2 fail với ValueError thì Keyword 3 sẽ được thực thi, nếu fail với KeyError thì Keyword 4 sẽ được thực thi.

Nếu Keyword 1 hoặc Keyword 2 pass hoặc fail với một trong hai Exception chỉ định, Keyword 6 sẽ được chạy.

Nếu chúng ta không cần quan tâm đến loại Exception mà muốn bắt hết thì không truyền Exception vào là được

*** Test Cases ***
Example
    TRY
        Keyword 1
        Keyword 2
    EXCEPT
        Keyword 3
    END
    Keyword 4

Lỗi Invalid Syntax, tức là sai cú pháp code thì không thể bắt được bằng Try/Except, nó sẽ fail ngay từ đầu luôn

Match Exception theo pattern cũng có thể được thực hiện với kiểu GLOB tức là *, ?, [chars] như đã nêu ở trên, theo Regexp và theo Start, thậm chí theo đúng từng từ

*** Test Cases ***
Example
    TRY
        Keyword 1
    EXCEPT    ValueError: *   type = GLOB
        Keyword 3
    EXCEPT    [Ee]rror ?? occurred *    type=GLOB
        Keyword 4
    EXCEPT    [Ee]rror \\d+ occurred    type=Regexp
        Keyword 5
    EXCEPT    ValueError:    type=start
        Keyword 6
    EXCEPT    ValueError: invalid literal for int() with base 10: 'ooops'    type=LITERAL
        Keyword 7
    END
    Keyword 8

Ở đây mình ví dụ cả 4 kiểu bắt, theo GLOB, Regexp, Start, LITERAL, mỗi kiểu sẽ bắt Exception theo một kiểu khác nhau, để xem thêm thì bạn có thể đọc thêm ở đây

Nguồn tham khảo