#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-readable
  • log.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 ได้โดยตรง


#แหล่งอ้างอิง