Manage data for testing - up1/course-robotframework GitHub Wiki

Manage data for testing

  • Test data in Robot framework
  • Microsoft Excel (XLS/XLSX)
  • Working with Database

1. Test data in Robot framework

*** Settings ***
Library    SeleniumLibrary
Test Template    Register process

*** Test Cases ***
Case 01   สมเกียรติ   30   0823456789   [email protected]   12345678   กรุงเทพมหานคร   สมัครสมาชิกสำเร็จ
Case 02   somkiat   ${EMPTY}   ${EMPTY}   ${EMPTY}   ${EMPTY}   ${EMPTY}    กรุณากรอกภาษาไทยเท่านั้น


*** Keywords ***
Register process
    [Arguments]    ${name}  ${age}  ${phone}  ${email}  ${password}  ${address}  ${expected result}
    Log to console    ${name} ${age} ${phone} ${email} ${password} ${address}
    ผู้ใช้งานเข้าไปยังหน้า register
    ทำการกรอกข้อมูลที่จำเป็น  ${name}  ${age}  ${phone}  ${email}  ${password}  ${address}
    กดปุ่ม register
    ตรวจสอบผลการ register ต้องแสดงค่า ${expected result}


*** Keywords ***
ตรวจสอบผลการ register ต้องแสดงค่า ${expected result}
    Wait Until Element Is Visible   xpath://*[@id="root"]/div/div
    Wait Until Element Contains     xpath://*[@id="root"]/div/div    ${expected result}

กดปุ่ม register
    Click Element    xpath://*[@id="root"]/div/form/button

ทำการกรอกข้อมูลที่จำเป็น
    [Arguments]    ${name}  ${age}  ${phone}  ${email}  ${password}  ${address}
    Input Text    name:name       ${name}
    Input Text    name:age        ${age}
    Input Text    name:phone      ${phone}
    Input Text    name:email      ${email}
    Input Text    name:password   ${password}
    Input Text    name:address    ${address}

ผู้ใช้งานเข้าไปยังหน้า register
    Open Browser    url=http://188.166.229.149:8000/    
    ...    browser=chrome   
    ...    options=add_experimental_option("detach", True)
    Maximize Browser Window

Install

# Windows
$pip install --upgrade robotframework-datadriver
$pip install robotframework-datadriver[XLS]

# Mac
$pip install --upgrade robotframework-datadriver
$pip install robotframework-datadriver\[XLS]

Example test script

*** Settings ***
Library    SeleniumLibrary
Library    DataDriver    Register-data-test.xlsx
Test Template    Register process


*** Test Cases ***
Register flow


*** Keywords ***
Register process
    [Arguments]    ${name}  ${age}  ${phone}  ${email}  ${password}  ${address}  ${expected result}
    Log to console    ${name} ${age} ${phone} ${email} ${password} ${address}
    ผู้ใช้งานเข้าไปยังหน้า register
    ทำการกรอกข้อมูลที่จำเป็น  ${name}  ${age}  ${phone}  ${email}  ${password}  ${address}
    กดปุ่ม register
    ตรวจสอบผลการ register ต้องแสดงค่า ${expected result}


*** Keywords ***
ตรวจสอบผลการ register ต้องแสดงค่า ${expected result}
    Wait Until Element Is Visible   xpath://*[@id="root"]/div/div
    Wait Until Element Contains     xpath://*[@id="root"]/div/div    ${expected result}

กดปุ่ม register
    Click Element    xpath://*[@id="root"]/div/form/button

ทำการกรอกข้อมูลที่จำเป็น
    [Arguments]    ${name}  ${age}  ${phone}  ${email}  ${password}  ${address}
    Input Text    name:name       ${name}
    Input Text    name:age        ${age}
    Input Text    name:phone      ${phone}
    Input Text    name:email      ${email}
    Input Text    name:password   ${password}
    Input Text    name:address    ${address}

ผู้ใช้งานเข้าไปยังหน้า register
    Open Browser    url=http://188.166.229.149:8000/    
    ...    browser=chrome   
    ...    options=add_experimental_option("detach", True)
    Maximize Browser Window

3. Update test status to Microsoft Excel (XLS/XLSX)

Install

$pip list openpyxl

Code example

from robot.api.deco import keyword

ROBOT_LIBRARY_VERSION = '0.1'
ROBOT_AUTO_KEYWORDS = False

@keyword
def update_test_status(file_name, test_name, status):
    import openpyxl as xl
    wb = xl.load_workbook(file_name)
    sheet = wb.active
    row_number = 1
    for row in sheet.iter_rows(min_row=2, values_only=True):
        if row[0] == test_name:
            sheet.cell(row=row_number + 1, column=11).value = status
            wb.save(file_name)
            break
        row_number += 1
    wb.close()

if __name__ == "__main__":
    import sys
    if len(sys.argv) != 4:
        print("Usage: python update_excel.py <file_name> <test_name> <status>")
        sys.exit(1)
    file_name = sys.argv[1]
    test_name = sys.argv[2]
    status = sys.argv[3]
    update_test_status(file_name, test_name, status)

Run

$python update_excel.py Register-data-test.xlsx "Case 01" pass

$python update_excel.py Register-data-test.xlsx "Case 02" failure

4. Read test result from robot framework and update in excel file

File demo.py

import openpyxl as xl

import xml.etree.ElementTree as ET

def parse_robot_output(xml_file="output.xml"):
    # Parse the XML file
    tree = ET.parse(xml_file)
    root = tree.getroot()
    
    # Find all test elements
    tests = root.findall('.//test')
    
    print("Test Results:")
    print("-" * 50)
    
    # Loop through each test and get name and status
    results = []
    for test in tests:
        test_name = test.get('name')
        status_element = test.find('status')
        status_value = status_element.get('status') if status_element is not None else "UNKNOWN"
        
        print(f"Test: {test_name}")
        print(f"Status: {status_value}")
        print("-" * 50)
        results.append((test_name, status_value))
    return results

def update_test_status(file_name, test_name, status):
    wb = xl.load_workbook(file_name)
    sheet = wb.active
    row_number = 1
    for row in sheet.iter_rows(min_row=2, values_only=True):
        if row[0] == test_name:
            sheet.cell(row=row_number + 1, column=11).value = status
            wb.save(file_name)
            break
        row_number += 1
    wb.close()

if __name__ == "__main__":
    import sys
    if len(sys.argv) != 2:
        print("Usage: python 3-update_test_result.py <file_name>")
        sys.exit(1)
    file_name = sys.argv[1]
    results = parse_robot_output()
    for test_name, status_value in results:
        update_test_status(file_name, test_name, status_value)

Run

$python demo.py Register-data-test.xlsx

5. Create test report with Microsoft Word 2007+

$pip install python-docx

Code example

import xml.etree.ElementTree as ET
from docx import Document
from docx.shared import Pt, RGBColor, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
from datetime import datetime

def create_test_results_doc(xml_file_path, output_doc_path):
    # Parse the XML file
    tree = ET.parse(xml_file_path)
    root = tree.getroot()
    
    # Get suite information
    suite = root.find('.//suite')
    suite_name = suite.get('name')
    
    # Get test information
    tests = suite.findall('.//test')
    
    # Create Document
    doc = Document()
    
    # Add title
    title = doc.add_heading('Robot Framework Test Results', 0)
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    # Add report metadata
    doc.add_paragraph(f'Report generated: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
    doc.add_paragraph(f'Suite: {suite_name}')
    
    # Add summary section
    doc.add_heading('Summary', level=1)
    
    # Count passed and failed tests
    passed = sum(1 for test in tests if test.find('status').get('status') == 'PASS')
    failed = sum(1 for test in tests if test.find('status').get('status') == 'FAIL')
    
    # Create summary table
    summary_table = doc.add_table(rows=1, cols=3)
    summary_table.style = 'Table Grid'
    
    # Add header row
    header_cells = summary_table.rows[0].cells
    header_cells[0].text = 'Total Tests'
    header_cells[1].text = 'Passed'
    header_cells[2].text = 'Failed'
    
    # Add data row
    row_cells = summary_table.add_row().cells
    row_cells[0].text = str(len(tests))
    row_cells[1].text = str(passed)
    row_cells[2].text = str(failed)
    
    # Add space after summary
    doc.add_paragraph()
    
    # Add detailed test results section
    doc.add_heading('Test Details', level=1)
    
    # Create test details table
    details_table = doc.add_table(rows=1, cols=3)
    details_table.style = 'Table Grid'
    
    # Set column widths
    for cell in details_table.rows[0].cells:
        cell.width = Inches(2.0)
    
    # Add header row
    header_cells = details_table.rows[0].cells
    header_cells[0].text = 'Test Name'
    header_cells[1].text = 'Status'
    header_cells[2].text = 'Message'
    
    # Add test rows
    for test in tests:
        test_name = test.get('name')
        status = test.find('status')
        status_value = status.get('status')
        
        # Get error message if any
        message = ""
        if status_value == "FAIL":
            message = status.text
        
        # Add row
        row_cells = details_table.add_row().cells
        row_cells[0].text = test_name
        row_cells[1].text = status_value
        row_cells[2].text = message
        
        # Color code status
        if status_value == "PASS":
            for paragraph in row_cells[1].paragraphs:
                for run in paragraph.runs:
                    run.font.color.rgb = RGBColor(0, 128, 0)  # Green
        else:
            for paragraph in row_cells[1].paragraphs:
                for run in paragraph.runs:
                    run.font.color.rgb = RGBColor(255, 0, 0)  # Red
    
    # Save the document
    doc.save(output_doc_path)
    
    return output_doc_path

if __name__ == "__main__":
    xml_file_path = "output.xml"
    output_doc_path = "test_results.docx"
    
    doc_path = create_test_results_doc(xml_file_path, output_doc_path)
    print(f"Test results document created: {doc_path}")

6. Working with Database

Install

$pip install robotframework-databaselibrary -U
$pip install psycopg2-binary

Connect to PostgreSQL

*** Settings ***
Library       DatabaseLibrary
Test Setup    Connect To PostgreSQL DB
Test Teardown    Disconnect From Database

*** Variables ***
${CREATE_TABLE_SQL}   CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, age INT NOT NULL, phone VARCHAR(15) NOT NULL, email VARCHAR(100) NOT NULL, password VARCHAR(100) NOT NULL, address TEXT NOT NULL);

*** Test Cases ***
Initialize DB
    # Create Table in postgresql
    Execute Sql String    ${CREATE_TABLE_SQL} 
    # Delete Test Data
    Execute Sql String    DELETE FROM users
    # Insert Test Data
    Execute Sql String    INSERT INTO users (name, age, phone, email, password, address) VALUES ('somkiat', 30, '0823456789', 'somkiat', 'password123', 'Bangkok')

Get All users
    Check Row Count    select name, age from users    ==   1
    ${Rows}=    Query    select name, age from users
    Should Be Equal    ${Rows}[0][0]    somkiat    
    Should Be Equal    ${Rows}[0][1]    ${30}

    
*** Keywords ***
Connect To PostgreSQL DB
    Connect To Database
    ...    psycopg2
    ...    db_name=demodb
    ...    db_user=user01
    ...    db_password=password01
    ...    db_host=127.0.0.1
    ...    db_port=5432
    ...    sslmode=disable
⚠️ **GitHub.com Fallback** ⚠️