- Data-Driven Testing with Robot Framework
- 2. สิ่งที่ต้องติดตั้ง
- 3. วิธีที่ 1: Data-Driven ด้วย Test Template
- 4. ใช้ [Template] เฉพาะบาง Test Case
- 5. วิธีที่ 2: Data-Driven ด้วย DataDriver และ CSV
- 6. CSV ทำงานอย่างไร
- 7. Test Case Name แบบ Dynamic
- 8. การใช้ Tags จาก CSV
- 9. Data-Driven ด้วย Excel
- 10. แยก Test Logic ออกจาก Test Data
- 11. เพิ่ม Setup และ Teardown
- 12. ตัวอย่าง Validation Testing
- 13. Boundary Value Testing ด้วย Data-Driven
- 14. รัน Test และดู Report
- 15. รันเฉพาะ Test ด้วย Tag
- 16. ใช้งานร่วมกับ CI/CD
- 17. Test Template vs DataDriver
- 18. Best Practices
- 19. โครงสร้างโครงการที่แนะนำ
- 20. Workflow ที่แนะนำ
- สรุป
#Data-Driven Testing with Robot Framework
Data-Driven Testing (DDT) คือแนวทางการทดสอบที่แยก Test Logic ออกจาก Test Data
แทนที่จะเขียน Test Case ซ้ำหลายชุด เราเขียนขั้นตอนการทดสอบเพียงครั้งเดียว แล้วนำข้อมูลหลายชุดมาป้อนให้ขั้นตอนเดียวกันทำงานซ้ำ
ตัวอย่างเช่น การทดสอบ Login:
| Username | Password | Expected Result |
|---|---|---|
| tomsmith | SuperSecretPassword! | Login สำเร็จ |
| invalid | SuperSecretPassword! | Username ไม่ถูกต้อง |
| tomsmith | invalid | Password ไม่ถูกต้อง |
ถ้าเขียนแบบปกติ เราอาจต้องสร้าง 3 Test Cases ที่มีขั้นตอนซ้ำกัน แต่ Data-Driven Testing ช่วยให้เราเก็บขั้นตอนไว้ใน Keyword เดียว และเปลี่ยนเฉพาะข้อมูลทดสอบ
#1. แนวคิดของ Data-Driven Testing
โครงสร้างพื้นฐานคือ
Test Data
|
v
Test Template / DataDriver
|
v
Reusable Keyword
|
v
System Under Test
|
v
Actual Result
|
v
Assertion
ข้อดีหลัก ได้แก่
- ลดโค้ดซ้ำใน Test Suite
- เพิ่ม Test Data ได้ง่ายโดยไม่แก้ Test Logic มาก
- เหมาะกับ Boundary Value, Equivalence Partitioning และ Validation Testing
- แยกหน้าที่ระหว่างผู้เขียน Test Logic กับผู้เตรียม Test Data ได้
- เก็บข้อมูลทดสอบใน CSV หรือ Excel ได้
- เหมาะกับ Regression Testing ที่ต้องรันทดสอบข้อมูลจำนวนมาก
Robot Framework รองรับ Data-Driven Testing โดยตรงผ่าน Test Template และสามารถใช้ไลบรารีเสริม DataDriver เพื่ออ่านข้อมูลจาก CSV/XLS/XLSX
#2. สิ่งที่ต้องติดตั้ง
ต้องมี Python ก่อน จากนั้นสร้างโฟลเดอร์โครงการ
mkdir robot-data-driven
cd robot-data-driven
แนะนำให้ใช้ Virtual Environment
#Windows
python -m venv .venv
.venv\Scripts\activate
#macOS / Linux
python3 -m venv .venv
source .venv/bin/activate
ติดตั้ง Robot Framework
pip install robotframework
ตรวจสอบเวอร์ชัน
robot --version
สำหรับตัวอย่าง Web Testing ให้ติดตั้ง SeleniumLibrary
pip install robotframework-seleniumlibrary
และสำหรับอ่านข้อมูลจาก CSV/Excel ให้ติดตั้ง DataDriver
pip install robotframework-datadriver
ถ้าต้องการใช้ไฟล์ Excel .xls หรือ .xlsx
pip install "robotframework-datadriver[XLS]"
SeleniumLibrary รุ่นปัจจุบันใช้ Selenium 4 และ Selenium Manager สามารถช่วยจัดการ browser driver ให้โดยอัตโนมัติในสภาพแวดล้อมทั่วไป
#3. วิธีที่ 1: Data-Driven ด้วย Test Template
Robot Framework มี Test Template อยู่แล้ว จึงสามารถเริ่มทำ Data-Driven Testing ได้โดยไม่ต้องติดตั้ง DataDriver
สร้างไฟล์
calculator.robot
เนื้อหา:
*** Settings ***
Test Template Addition Should Be Correct
*** Test Cases *** A B EXPECTED
Add positive numbers 1 2 3
Add zero 5 0 5
Add negative number 5 -2 3
Add two negatives -2 -3 -5
*** Keywords ***
Addition Should Be Correct
[Arguments] ${a} ${b} ${expected}
${result}= Evaluate ${a} + ${b}
Should Be Equal As Numbers ${result} ${expected}
รัน:
robot calculator.robot
แนวคิดสำคัญคือ
Test Template Addition Should Be Correct
ทำให้ข้อมูลในแต่ละ Test Case ถูกส่งเข้า Keyword
Addition Should Be Correct
โดยอัตโนมัติ
#4. ใช้ [Template] เฉพาะบาง Test Case
ไม่จำเป็นต้องกำหนด Template ให้ทั้งไฟล์เสมอไป สามารถกำหนดเฉพาะ Test Case ได้
*** Test Cases ***
Check Addition With Multiple Data
[Template] Addition Should Be Correct
1 2 3
10 20 30
-5 5 0
*** Keywords ***
Addition Should Be Correct
[Arguments] ${a} ${b} ${expected}
${result}= Evaluate ${a} + ${b}
Should Be Equal As Numbers ${result} ${expected}
ในกรณีนี้ Test Case เดียวมีหลาย data rows และ Template จะถูกเรียกหนึ่งครั้งต่อหนึ่งแถวข้อมูล
#5. วิธีที่ 2: Data-Driven ด้วย DataDriver และ CSV
เมื่อ Test Data เริ่มมีจำนวนมาก การเก็บข้อมูลทั้งหมดใน .robot จะดูแลยากขึ้น
โครงสร้างโครงการ:
robot-data-driven/
├── tests/
│ └── login.robot
└── data/
└── login_data.csv
สร้างไฟล์ data/login_data.csv
*** Test Cases ***,${username},${password},${expected}
Valid login,tomsmith,SuperSecretPassword!,You logged into a secure area!
Invalid username,invalid,SuperSecretPassword!,Your username is invalid!
Invalid password,tomsmith,invalid,Your password is invalid!
จากนั้นสร้าง tests/login.robot
*** Settings ***
Library SeleniumLibrary
Library DataDriver file=../data/login_data.csv
Test Template Login Should Show Expected Message
Test Teardown Close All Browsers
*** Variables ***
${URL} https://the-internet.herokuapp.com/login
${BROWSER} chrome
*** Test Cases ***
Login with ${username} and ${password}
${username} ${password} ${expected}
*** Keywords ***
Login Should Show Expected Message
[Arguments] ${username} ${password} ${expected}
Open Browser ${URL} ${BROWSER}
Input Text id=username ${username}
Input Text id=password ${password}
Click Button css=button[type="submit"]
Page Should Contain ${expected}
รัน:
robot tests/login.robot
DataDriver จะอ่านแต่ละแถวจาก CSV แล้วสร้าง Test Case จากข้อมูลเหล่านั้น
#6. CSV ทำงานอย่างไร
ส่วนหัวของ CSV ตัวอย่างนี้
*** Test Cases ***,${username},${password},${expected}
หมายถึง
| Column | ความหมาย |
|---|---|
*** Test Cases *** |
ชื่อ Test Case |
${username} |
ค่า username |
${password} |
ค่า password |
${expected} |
Expected Result |
ข้อมูลหนึ่งแถวจึงเท่ากับหนึ่งชุดการทดสอบ
Invalid password,tomsmith,invalid,Your password is invalid!
DataDriver จะนำค่าดังกล่าวไปแทนตัวแปรใน Test Template
#7. Test Case Name แบบ Dynamic
ข้อดีของ DataDriver คือสามารถตั้งชื่อ Test Case จากข้อมูลได้
*** Test Cases ***
Login: ${username} / ${password}
${username} ${password} ${expected}
เช่นอาจได้ชื่อ Test Case:
Login: tomsmith / SuperSecretPassword!
Login: invalid / SuperSecretPassword!
Login: tomsmith / invalid
ช่วยให้ log.html และ report.html อ่านง่ายขึ้น
ในระบบจริง ไม่ควรใส่รหัสผ่านจริงหรือ secret ลงในชื่อ Test Case เพราะชื่อจะถูกบันทึกในผลการทดสอบและ CI logs
#8. การใช้ Tags จาก CSV
สามารถใส่ Tags ใน Test Data เพื่อแยกประเภทการทดสอบ
ตัวอย่าง:
*** Test Cases ***,${username},${password},${expected},[Tags]
Valid login,tomsmith,SuperSecretPassword!,You logged into a secure area!,positive
Invalid username,invalid,SuperSecretPassword!,Your username is invalid!,negative
Invalid password,tomsmith,invalid,Your password is invalid!,negative
จากนั้นเลือกเฉพาะ negative tests
robot --include negative tests/login.robot
หรือ
robot -i negative tests/login.robot
#9. Data-Driven ด้วย Excel
DataDriver รองรับ .xls และ .xlsx เมื่อ install extra dependencies แล้ว
pip install "robotframework-datadriver[XLS]"
ตัวอย่างไฟล์
data/login_data.xlsx
ตารางใน Excel:
| *** Test Cases *** | ${username} | ${password} | ${expected} |
|---|---|---|---|
| Valid login | tomsmith | SuperSecretPassword! | You logged into a secure area! |
| Invalid username | invalid | SuperSecretPassword! | Your username is invalid! |
| Invalid password | tomsmith | invalid | Your password is invalid! |
เรียกใช้จาก Robot Framework:
*** Settings ***
Library DataDriver file=../data/login_data.xlsx
Test Template Login Should Show Expected Message
หากต้องการเลือก worksheet:
*** Settings ***
Library DataDriver
... file=../data/login_data.xlsx
... sheet_name=LoginData
#10. แยก Test Logic ออกจาก Test Data
เมื่อโครงการใหญ่ขึ้น ควรแยก Keyword ออกจาก Test Suite
โครงสร้าง:
robot-data-driven/
├── data/
│ └── login_data.csv
├── resources/
│ └── login_keywords.resource
└── tests/
└── login.robot
ไฟล์ resources/login_keywords.resource
*** Settings ***
Library SeleniumLibrary
*** Variables ***
${URL} https://the-internet.herokuapp.com/login
${BROWSER} chrome
*** Keywords ***
Open Login Page
Open Browser ${URL} ${BROWSER}
Submit Login
[Arguments] ${username} ${password}
Input Text id=username ${username}
Input Text id=password ${password}
Click Button css=button[type="submit"]
Login Should Show Expected Message
[Arguments] ${username} ${password} ${expected}
Open Login Page
Submit Login ${username} ${password}
Page Should Contain ${expected}
ไฟล์ tests/login.robot
*** Settings ***
Resource ../resources/login_keywords.resource
Library DataDriver file=../data/login_data.csv
Test Template Login Should Show Expected Message
Test Teardown Close All Browsers
*** Test Cases ***
Login: ${username}
${username} ${password} ${expected}
แนวทางนี้ทำให้
.robot= Test Specification.resource= Test Logic / Reusable Keywords.csvหรือ.xlsx= Test Data
#11. เพิ่ม Setup และ Teardown
หากต้องเปิด browser ทุก Test Case สามารถใช้ Test Setup / Test Teardown
*** Settings ***
Test Setup Open Login Page
Test Teardown Close All Browsers
และปรับ Keyword:
*** Keywords ***
Login Should Show Expected Message
[Arguments] ${username} ${password} ${expected}
Input Text id=username ${username}
Input Text id=password ${password}
Click Button css=button[type="submit"]
Page Should Contain ${expected}
ช่วยลดขั้นตอนซ้ำจาก Template Keyword
#12. ตัวอย่าง Validation Testing
สมมติว่าต้องทดสอบฟอร์มสมัครสมาชิก
ข้อมูล CSV:
*** Test Cases ***,${email},${password},${expected}
Valid email,user@example.com,Password123,success
Missing domain,user@,Password123,invalid email
Empty email,${EMPTY},Password123,email required
Short password,user@example.com,123,password too short
Robot Framework:
*** Settings ***
Library DataDriver file=registration_data.csv
Test Template Validate Registration
*** Test Cases ***
Registration validation: ${email}
${email} ${password} ${expected}
*** Keywords ***
Validate Registration
[Arguments] ${email} ${password} ${expected}
Log Email=${email}
Log Expected=${expected}
# ขั้นตอนจริงอาจเป็น Web UI, API หรือ Database Testing
รูปแบบนี้เหมาะมากกับ
- Form Validation
- Login
- Search
- API Request/Response
- Price Calculation
- Business Rules
- Boundary Value Analysis
- Equivalence Partitioning
#13. Boundary Value Testing ด้วย Data-Driven
ตัวอย่างตรวจสอบอายุที่ยอมรับช่วง 18–60 ปี
*** Settings ***
Test Template Age Validation Should Be Correct
*** Test Cases *** AGE EXPECTED
Below minimum 17 False
Minimum 18 True
Normal 30 True
Maximum 60 True
Above maximum 61 False
*** Keywords ***
Age Validation Should Be Correct
[Arguments] ${age} ${expected}
${valid}= Evaluate 18 <= ${age} <= 60
Should Be Equal As Strings ${valid} ${expected}
นี่เป็นตัวอย่างที่ Data-Driven Testing ทำงานร่วมกับ Boundary Value Analysis (BVA) ได้โดยตรง
#14. รัน Test และดู Report
รัน Test Suite
robot tests/
กำหนด output directory
robot --outputdir results tests/
จะได้ไฟล์หลัก:
results/
├── output.xml
├── log.html
└── report.html
output.xml— ผลลัพธ์แบบ machine-readablelog.html— รายละเอียดขั้นตอนการทำงานreport.html— ภาพรวม Pass/Fail
#15. รันเฉพาะ Test ด้วย Tag
robot -i positive tests/
robot -i negative tests/
ไม่รัน slow tests:
robot -e slow tests/
#16. ใช้งานร่วมกับ CI/CD
ตัวอย่าง GitHub Actions:
name: Robot Framework Tests
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install robotframework
pip install robotframework-seleniumlibrary
pip install robotframework-datadriver
- name: Run Robot Framework
run: |
robot --outputdir results tests/
- name: Upload Robot Framework Results
if: always()
uses: actions/upload-artifact@v4
with:
name: robot-results
path: results/
หากใช้ browser บน CI ควรพิจารณา headless mode หรือกำหนด browser options ให้เหมาะกับ runner
#17. Test Template vs DataDriver
| คุณสมบัติ | Test Template | DataDriver |
|---|---|---|
| มีมากับ Robot Framework | ✅ | ❌ |
| ต้องติดตั้ง library เพิ่ม | ❌ | ✅ |
Data อยู่ใน .robot |
✅ | ไม่จำเป็น |
| CSV | ❌ | ✅ |
| Excel | ❌ | ✅ |
| เหมาะกับข้อมูลน้อย | ✅ | ✅ |
| เหมาะกับข้อมูลจำนวนมาก | พอใช้ | ✅ |
| ให้ non-programmer แก้ข้อมูลได้ง่าย | พอใช้ | ✅ |
| แยก Test Logic / Test Data ชัดเจน | ✅ | ✅✅ |
แนวทางเลือกใช้งาน:
ข้อมูลน้อย
|
+--> Test Template
ข้อมูลมาก / แก้บ่อย / มาจาก Excel
|
+--> DataDriver
#18. Best Practices
#18.1 สร้าง High-Level Keyword
หลีกเลี่ยงให้ Test Data ผูกกับ UI implementation มากเกินไป
ควรเขียน:
Login Should Show Expected Message
แทนที่จะกระจาย keyword ระดับ Selenium จำนวนมากอยู่ในแต่ละ data row
#18.2 แยกข้อมูลออกจาก Logic
แนะนำ:
tests/ -> test specification
resources/ -> keywords
data/ -> CSV / Excel
results/ -> execution results
#18.3 ตั้งชื่อ Test Case ให้สื่อความหมาย
ดี:
Invalid Login - Empty Password
ควรหลีกเลี่ยง:
Test 001
#18.4 อย่าเก็บ Secret ใน CSV
ไม่ควร commit:
production_password
api_key
access_token
ควรใช้ Environment Variables หรือ Secret Manager
#18.5 Data แต่ละแถวควรมี Expected Result
Data-Driven Testing ที่ดีไม่ควรมีเฉพาะ input แต่ควรระบุ expected behavior อย่างชัดเจน
#19. โครงสร้างโครงการที่แนะนำ
robot-data-driven/
├── data/
│ ├── login_data.csv
│ └── registration_data.xlsx
│
├── resources/
│ ├── login_keywords.resource
│ └── registration_keywords.resource
│
├── tests/
│ ├── login.robot
│ └── registration.robot
│
├── results/
│
├── requirements.txt
└── README.md
requirements.txt
robotframework
robotframework-seleniumlibrary
robotframework-datadriver
ถ้าใช้ Excel สามารถติดตั้งเพิ่มด้วย:
pip install "robotframework-datadriver[XLS]"
#20. Workflow ที่แนะนำ
1. กำหนด Scenario
|
v
2. ออกแบบ Test Data
|
v
3. สร้าง Reusable Keyword
|
v
4. เลือก Test Template หรือ DataDriver
|
v
5. Execute
|
v
6. Assertion
|
v
7. Report / CI
#สรุป
Data-Driven Testing ช่วยให้ Robot Framework สามารถทดสอบ Scenario เดิมกับข้อมูลจำนวนมากได้โดยไม่ต้องเขียน Test Logic ซ้ำ
สำหรับโครงการขนาดเล็กสามารถเริ่มจาก
Test Template
แต่เมื่อ Test Data มีจำนวนมากหรือทีมต้องการจัดการข้อมูลผ่าน CSV/Excel ควรใช้
DataDriver
สถาปัตยกรรมที่ดูแลรักษาง่ายคือ
CSV / Excel
|
v
DataDriver
|
v
Test Template
|
v
Reusable Keyword
|
v
Selenium / API / Business Logic
|
v
Assertion
|
v
Robot Framework Report
แนวทางนี้เหมาะกับทั้ง Functional Testing, Regression Testing, Web Testing, API Testing และ Validation Testing และสามารถนำไปเชื่อมต่อกับ CI/CD ได้โดยตรง
#แหล่งอ้างอิง
- Robot Framework User Guide: https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide
- Robot Framework Data-Driven Tests: https://docs.robotframework.org/docs/testcase_styles/datadriven
- Robot Framework SeleniumLibrary: https://robotframework.org/SeleniumLibrary/
- DataDriver: https://github.com/Snooz82/robotframework-datadriver