Manage data for testing - up1/course-robotframework GitHub Wiki
- Test data in Robot framework
- Microsoft Excel (XLS/XLSX)
- Working with Database
- Working with Test template
*** 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
2. Working with DataDriver for Robot Framework
- Working with file XLS/XLSX
# Windows
$pip install --upgrade robotframework-datadriver
$pip install robotframework-datadriver[XLS]
# Mac
$pip install --upgrade robotframework-datadriver
$pip install robotframework-datadriver\[XLS]
*** 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
$pip list openpyxl
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)
$python update_excel.py Register-data-test.xlsx "Case 01" pass
$python update_excel.py Register-data-test.xlsx "Case 02" failure
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
$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}")
$pip install robotframework-databaselibrary -U
$pip install psycopg2-binary
*** 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