Biến ở trong Robot Framework về cơ bản rất giống biến của Python do RB là framework Python-based.
Đầu tiên mình sẽ đi qua các loại biến cơ bản trong RB
Variables Types
Chủ yếu trong RB sẽ sử dụng 3 loại biến, Scalar, List và Dictionary.
Scalar Variables
Scalar variables hiểu đơn giản là một biến đơn chứa đúng một giá trị, nó gần giống như khi assign một giá trị cho một tên biến trong python a = 5.
Syntax của scalar table là dùng dấu $ trước tên biến.
*** Variables ***
${URL} http://google.com
${BROWSER} chrome
Trong Robot Framework thì có thể gán bất cứ giá trị dạng String hay số cho biến Scalar. Với giá trị string thì không đặt trong dấu ngoặc kép hoặc đơn
*** Variables ***
${URL} 'http://google.com'
${BROWSER} "chrome"
Trong ví dụ trên, cả hai đều sẽ tính cả dấu ngoặc vào string 'http://google.com' và "chrome", chỉ khi bỏ dấu ngoặc thì mới như ý muốn ban đầu.
Đơn giản chỉ cần hiểu, sau khi khai báo tên biến scalar, tất cả cái gì sau dấu = sẽ được hiểu là giá trị của biến đó (Hoặc sau từ 2 khoảng trắng trở lên)
Đồng thời, dấu = cũng không cần thiết phải có, chỉ cần có khoảng trắng giữa tên biến và giá trị là đủ.
*** Variables ***
${URL} http://google.com
${BROWSER} = chrome
Nếu sử dụng dấu = thì nó phải ở cách giá trị của biến 2 dấu cách, ví dụ
*** Variables ***
${a}= 5
${b} = 6
${c} 7
Tuy là được, nhưng mình khuyên nên sử dụng quy chuẩn theo kiểu của biến b và c để cho code dễ nhìn. Bản thân mình nghiêng về kiểu của biến c, do nó tiết kiệm một lần gõ dấu =.
Một cái mà mọi người cần lưu ý đó là khi gán số. Nếu khai báo như sau
*** Variables ***
${a} 5
${b} ${5}
Cả a và b đều được gán giá trị là số, tuy nhiên, a được gán loại giá trị một cách tự động, còn b thì đã bị ép kiểu về số.
Có một function là evaluate để thực hiện tính toán, và nếu chúng ta có
*** Test Cases ***
Test
${c} Evaluate ${a} + 1
Log ${c}
${d} Evaluate ${b} + 1
Log ${d}
Cả c và d đều sẽ được gán giá trị số là 6.
Nếu chúng ta để ${a} 5.0 thì a sẽ được gán kiểu float. Hay nếu để ${a} 5.p thì a sẽ được gắn kiểu string. Đồng thời, nếu với giá trị 5.0 nếu được ép vào một function kiểu dạng string ví dụ như
*** Test Cases ***
Test
${c} Set Variable ${a} + '1'
Log ${c}
Thì khi đó giá trị của c sẽ là 5.0 +'1' và là một string.
Tóm lại, với scalar variables, việc tự ép kiểu giữa int, float và string sẽ được thực hiện tự động
List Variables
Một list trong Robot Framework được khai báo giống như Python nhưng khác về Syntax, với list thì sẽ dùng @ thay vì $ như scalar.
*** Variables ***
@{BROWSERS} chrome firefox safari
Các element của một list có thể là bất cứ loại dữ liệu nào, string, số, list, dictionary, ... Tuy nhiên, không thể khai báo theo kiểu thuần Python như [1,2,3] hay {'a':1,'b':2}, chúng nó sẽ được tính là string
*** Variables ***
@{BROWSERS} chrome 5 [1, 2, 3] {'a': 1, 'b': 2}
Cách duy nhất để có thể thấy được tính chất này là gọi lại một list khi khai báo một list khác
*** Variables ***
@{a} chrome 5 [1, 2, 3] {'a': 1, 'b': 2}
@{c} [1, 2, 3] @{a}
*** Test Cases ***
Test
Log @{c}
Khi chạy thì sẽ log ra từ @{c} là
[1, 2, 3]- là string,chrome- là string,5- là int,[1, 2, 3]là string,{'a': 1, 'b': 2}là string
Và giá trị gốc của @{c} là [1,2,3],@{a} và list @{a} sẽ được unpack ở trong list @{c}.
Khi truy cập và một giá trị riêng lẻ trong list thì sẽ dùng cú pháp ${list}[index]. Tức là coi giá trị đang truy cập như một scalar variable.
*** Variables ***
@{a} chrome 5 [1, 2, 3] {'a': 1, 'b': 2}
@{c} [1, 2, 3] @{a}
*** Test Cases ***
Test
Log ${a}[0]
Nếu trong list có một list con như của @{c} thì vẫn dùng cú pháp scalar nhưng có thể đào sâu vào list con
*** Test Cases ***
Log ${c}[1][1]
Dictionary Variables
Dictionary trong Robot Framework cũng giống dicitonary của python như cách list trong RB giống list của python, nhưng khác về cách khai báo, với dictionary thì sẽ dùng & thay vì @ như list.
*** Variables ***
&{a} chrome=5 firefox=6 safari=7
Và khi truy cập vào một key của dictionary thì sẽ dùng cú pháp ${dictionary}[key]
*** Test Cases ***
Test
Log ${a}[chrome]
Tóm lại, cách khai báo hay truy cập biến của Robot Framework sử dụng ký hiệu @ cho list và & cho dictionary, còn scalar thì dùng $.
Các giá trị riêng lẻ trong list và dictionary sẽ được truy cập bằng cách dùng cú pháp của scalar
Nếu tồn tại một list ở trong list, có thể dùng cú pháp của scalar để truy cập vào phần từ của list con đó. Tương tự cho dictionary.
Typical question: What is the difference between Scalar, List and Dictionary Variables? - Sự khác biệt giữa Scalar, List và Dictionary Variables là gì?
Variables Scope
Một biến trong Robot Framework sẽ có 3 scope chính, Global, Test Suite và Test Case.
Test Case Variable
Đầu tiên, nếu một biến được set trong Test Case bằng Set Variable, thì nó sẽ chỉ tồn tại trong Test Case đó, và không thể truy cập từ Test Suite hoặc Test Case khác.
*** Test Cases ***
Test
${a} Set Variable 5
Test 2
Log ${a}
Khi chạy, sẽ báo lỗi vì không tìm thấy biến a trong Test Case Test 2. Tương tự, nếu giờ khai báo biến a trong Keywords thì cũng không thể truy cập từ Test Case.
Tiếp theo, một biến cũng có thể được set trong Test Case với Set Test Variable nhưng syntax hơi khác.
*** Test Cases ***
Test
Set Test Variable ${b} 5
Test 2
Log ${b}
Trong tình huống trên, IDE sẽ không báo ra lỗi, nhưng khi chạy thì sẽ báo lỗi không tìm thấy biến b trong Test Case Test 2.
Test Suite Variable
Biến được set trong Test Suite sẽ có thể truy cập từ mọi Test Case trong Test Suite đó, nhưng không thể truy cập từ Test Suite khác.
Khi chạy nhiều test suite với nhau, một biến được set trong một Test Suite sẽ không thể truy cập từ Test Suite khác.
Một biến khi được khai báo trên section Variables của Test Suite thì sẽ được mặc định là Suite Variable.
Nếu muốn khai báo Suite Variable từ bên trong một Test Case, chúng ta sẽ dùng keyword Set Suite Variable
*** Variables ***
${a} 5
${B} 5
*** Test Cases ***
Test
Set Suite Variable ${c} 5
Set Suite Variable ${D} 5
Test 2
Log ${a}
Log ${B}
Log ${c}
Log ${D}
Trong ví dụ này, tất cả sẽ log bình thường.
Global Variable
Một biến được set ở mức Global sẽ có thể truy cập từ mọi Test Case trong Test Suite đó và mọi Test Suite con và cả các Test Suite sau đấy.
Để khai báo một biến ở mức Global, chúng ta sẽ dùng keyword Set Global Variable và thực sự chỉ có cách này để khai báo biến ở mức Global.
*** Variables ***
${a} 5
${B} 5
*** Test Cases ***
Test
Set Global Variable ${c} 5
Set Global Variable ${D} 5
Hai biến c và D sẽ có thể truy cập từ mọi Test Case trong Test Suite và mọi Test Suite con cùng các Test Suite kế tiếp sau, nhưng ${a} và ${B} sẽ không thể truy cập từ Test Suite con và Test Suite sau
Typical question: What is the difference between Global, Suite and Test Case Variables? - Sự khác biệt giữa Global, Suite và Test Case Variables là gì?
Variables From Variable File
Nếu sử dụng một file python để import trên Settings thì các biến trong file python đó sẽ được coi như Suite Variables.
*** Settings ***
Variables variables.py
Giả sử trong file python có 3 loại biến
a = 5
b = [1,2]
c = {'a':1,'b':2}
Khi file python này được import vào ở section Settings thì 3 biến a, b và c sẽ được coi như Suite Variables. Và gọi nó ở trong file robot cũng tương tự như 3 loại biến nêu ở trên
*** Test Cases ***
Test
Log ${a}
Log ${b}
Log ${b}[1]
Log ${c}[a]
Typical question: How to use variables from a variable file? - Làm thế nào để sử dụng biến từ một file biến?