Data Driven Testing nghĩa là chỉ dùng 1 kịch bản test nhưng có thể verify được nhiều trường hợp khác nhau với đầu vào/ đầu ra từ file data bên ngoài (csv, xml, xls, txt,..) thay vì sử dụng data cứng trong mỗi lần chạy. Mình đưa một ví dụ đơn giản như thế này: Bạn có 100 test scripts, mỗi script đều phải yêu cầu login (email/ password) vào hệ thống để sử dụng, nếu bạn set cứng 2 biến email/ password trong script thì mỗi lần thay đổi email/pass phải sửa 100 lần cho 100 scripts. Thay vì đó chỉ cần tạo 1 file lưu trữ data của 2 biến đó và đưa tên biến vào trong 100 scripts, chỉ cần sửa 1 lần và sẽ apply cho toàn bộ.

Chúng ta sẽ sử dụng một add-on hỗ trợ cho Selenium IDE tên là Selblocks, nó cho phép thêm các command về vòng lặp, điều kiện và data driven testing trong kịch bản test.

Demo được thực hiện trên trang: http://live.guru99.com/

  • Kịch bản kiểm thử (Tạo mới 5 account vào trang live.guru99.com):
    • Step 01: Truy cập vào trang http://live.guru99.com/
    • Step 02: Tới trang My Account
    • Step 03: Click vào button ‘CREATE AN ACCOUNT’
    • Step 04: Nhập dữ liệu hợp lệ vào form (2 field: Email và Password đọc dữ liệu từ file xml)
    • Step 05: Submit và verify account được tạo thành công
    • Step 06: Logout
  • Dữ liệu từ file xml (testdata.xml được lưu tại ổ C, mình chỉ tạo với 5 account, cần bao nhiêu thì các bạn tự thêm vào. Lưu ý là mỗi email chỉ đăng kí được 1 lần)

  • Chạy test
    • forXml: khai báo đường dẫn file xml, bắt đầu vòng lặp
    • ${Email}: lấy dữ liệu từ biến Email trong file xml (tương tự cho field Password)
    • endForXml: kết thúc vòng lặp (thoát điều kiện)

  • Code tham khảo:
  • Log (Run 5 lần tương đương với 5 record trong file xml)
    • [info] Playing test case TC_008_Selblock
    • [info] Executing: |forXml | file:///C:/testdata.xml | |
    • [info] [selblocks] Reading from: file:///C:/testdata.xml
    • [info] Executing: |open | / | |
    • [info] Executing: |clickAndWait | css=div.footer > div.links > ul > li.first > a[title=”My Account”] | |
    • [info] Executing: |clickAndWait | css=a.button > span > span | |
    • [info] Executing: |type | id=firstname | AUTOMATION |
    • [info] Executing: |type | id=lastname | TESTING |
    • [info] Executing: |type | id=email_address | ${Email} |
    • [info] Executing: |type | id=password | ${Password} |
    • [info] Executing: |type | id=confirmation | ${Password} |
    • [info] Executing: |click | id=is_subscribed | |
    • [info] Executing: |clickAndWait | css=div.buttons-set > button.button | |
    • [info] Executing: |waitForText | css=li > span | Thank you for registering with Main Website Store. |
    • [info] Executing: |verifyText | css=li > span | Thank you for registering with Main Website Store. |
    • [info] Executing: |click | css=a.skip-link.skip-account > span.label | |
    • [info] Executing: |clickAndWait | link=Log Out | |
    • [info] Executing: |endForXml | | |
    • [info] [selblocks] branch => @1: [forXml|file:///C:/testdata.xml]
    • [info] Executing: |forXml | file:///C:/testdata.xml | |
    • [info] Executing: |open | / | |
    • [info] Executing: |clickAndWait | css=div.footer > div.links > ul > li.first > a[title=”My Account”] | |
    • [info] Executing: |clickAndWait | css=a.button > span > span | |
    • [info] Executing: |type | id=firstname | AUTOMATION |
    • [info] Executing: |type | id=lastname | TESTING |
    • [info] Executing: |type | id=email_address | ${Email} |
    • [info] Executing: |type | id=password | ${Password} |
    • [info] Executing: |type | id=confirmation | ${Password} |
    • [info] Executing: |click | id=is_subscribed | |
    • [info] Executing: |clickAndWait | css=div.buttons-set > button.button | |
    • [info] Executing: |waitForText | css=li > span | Thank you for registering with Main Website Store. |
    • [info] Executing: |verifyText | css=li > span | Thank you for registering with Main Website Store. |
    • [info] Executing: |click | css=a.skip-link.skip-account > span.label | |
    • [info] Executing: |clickAndWait | link=Log Out | |
    • [info] Executing: |endForXml | | |
    • [info] [selblocks] branch => @1: [forXml|file:///C:/testdata.xml]
    • [info] Executing: |forXml | file:///C:/testdata.xml | |
    • [info] Executing: |open | / | |
    • [info] Executing: |clickAndWait | css=div.footer > div.links > ul > li.first > a[title=”My Account”] | |
    • [info] Executing: |clickAndWait | css=a.button > span > span | |
    • [info] Executing: |type | id=firstname | AUTOMATION |
    • [info] Executing: |type | id=lastname | TESTING |
    • [info] Executing: |type | id=email_address | ${Email} |
    • [info] Executing: |type | id=password | ${Password} |
    • [info] Executing: |type | id=confirmation | ${Password} |
    • [info] Executing: |click | id=is_subscribed | |
    • [info] Executing: |clickAndWait | css=div.buttons-set > button.button | |
    • [info] Executing: |waitForText | css=li > span | Thank you for registering with Main Website Store. |
    • [info] Executing: |verifyText | css=li > span | Thank you for registering with Main Website Store. |
    • [info] Executing: |click | css=a.skip-link.skip-account > span.label | |
    • [info] Executing: |clickAndWait | link=Log Out | |
    • [info] Executing: |endForXml | | |
    • [info] [selblocks] branch => @1: [forXml|file:///C:/testdata.xml]
    • [info] Executing: |forXml | file:///C:/testdata.xml | |
    • [info] Executing: |open | / | |
    • [info] Executing: |clickAndWait | css=div.footer > div.links > ul > li.first > a[title=”My Account”] | |
    • [info] Executing: |clickAndWait | css=a.button > span > span | |
    • [info] Executing: |type | id=firstname | AUTOMATION |
    • [info] Executing: |type | id=lastname | TESTING |
    • [info] Executing: |type | id=email_address | ${Email} |
    • [info] Executing: |type | id=password | ${Password} |
    • [info] Executing: |type | id=confirmation | ${Password} |
    • [info] Executing: |click | id=is_subscribed | |
    • [info] Executing: |clickAndWait | css=div.buttons-set > button.button | |
    • [info] Executing: |waitForText | css=li > span | Thank you for registering with Main Website Store. |
    • [info] Executing: |verifyText | css=li > span | Thank you for registering with Main Website Store. |
    • [info] Executing: |click | css=a.skip-link.skip-account > span.label | |
    • [info] Executing: |clickAndWait | link=Log Out | |
    • [info] Executing: |endForXml | | |
    • [info] [selblocks] branch => @1: [forXml|file:///C:/testdata.xml]
    • [info] Executing: |forXml | file:///C:/testdata.xml | |
    • [info] Executing: |open | / | |
    • [info] Executing: |clickAndWait | css=div.footer > div.links > ul > li.first > a[title=”My Account”] | |
    • [info] Executing: |clickAndWait | css=a.button > span > span | |
    • [info] Executing: |type | id=firstname | AUTOMATION |
    • [info] Executing: |type | id=lastname | TESTING |
    • [info] Executing: |type | id=email_address | ${Email} |
    • [info] Executing: |type | id=password | ${Password} |
    • [info] Executing: |type | id=confirmation | ${Password} |
    • [info] Executing: |click | id=is_subscribed | |
    • [info] Executing: |clickAndWait | css=div.buttons-set > button.button | |
    • [info] Executing: |waitForText | css=li > span | Thank you for registering with Main Website Store. |
    • [info] Executing: |verifyText | css=li > span | Thank you for registering with Main Website Store. |
    • [info] Executing: |click | css=a.skip-link.skip-account > span.label | |
    • [info] Executing: |clickAndWait | link=Log Out | |
    • [info] Executing: |endForXml | | |
    • [info] [selblocks] branch => @1: [forXml|file:///C:/testdata.xml]
    • [info] Executing: |forXml | file:///C:/testdata.xml | |
    • [info] [selblocks] branch => @23: [endForXml]
    • [info] Executing: |endForXml | | |
    • [info] Test case passed