Python+Selenium+Unittest+Ddt+HTMLReport分布式數據驅動自動化測試框架結構
1、Business:公共業務模塊,如登錄模塊,可以把登錄模塊進行封裝供調用
------login_business.py
from Page_Object.Common_Page.login_page import Login_Page
from HTMLReport import logger
import time
def login(driver, username, password):
"""
登錄業務
:param driver:瀏覽器驅動
:param username:用戶名
:param password:密碼
:return:None
"""
logger().info(f"使用用戶名:{username},密碼:{password}進行登陸")
login_page = Login_Page(driver)
login_page.send_username(username)
login_page.send_password(password)
login_page.submit()
time.sleep(2)
----Base_url.py:對應的url地址
2、Common:與業務無關的公共模塊,如對Selenium的二次封裝,方便后期的調用,還有一些工具類,如在讀取數據時需要對讀取文件進行封裝
3、PageOBject:這個就應該不用多說了,頁面元素的封裝,這個根據自己公司系統的業務去做分層封裝(不做過多解釋)
4、report:測試報告
5、TestCase:測試用例層,下面以logincase為例子
---logincase.py
import unittest
from Business.Base_url import url_index
import ddt
from Common.tools.read_txt import read_txt
from HTMLReport import logger
from Page_Object.Common_Page.index_page import Index_Page
from Common.selenium_library import SeleniumBase
from Business.login_business import login
@ddt.ddt
class Test_login(unittest.TestCase):
def setUp(self):
self.driver = SeleniumBase().get_web_driver()
def tearDown(self):
SeleniumBase(self.driver).quit()
@ddt.unpack
@ddt.data(*read_txt('TestData/login_user_password.txt'))
def test_login(self, username, password, assert_type):
se = SeleniumBase(self.driver)
se.get(url_index)
login(self.driver, username, password)
se.add_page_screen_shot()
if assert_type == '1':
logger().info("斷言登陸成功")
text = Index_Page(self.driver).login_success()
self.assertIn("測試", text, '登陸成功斷言')
elif assert_type == "2":
text = self.driver.find_element_by_id("submit").text
self.assertIn("立即登錄", text, '登陸失敗斷言')
elif assert_type == "3":
text = self.driver.find_element_by_id("submit").text
self.assertIn("立即登錄", text, '登陸失敗斷言')
elif assert_type == "4":
text = self.driver.find_element_by_id("submit").text
self.assertIn("立即登錄", text, '登陸失敗斷言')
else:
logger().info(f"未知斷言類型{assert_type}")
self.assertTrue(False, "未知斷言類型")
6、TestData:測試數據,對應用例的數據都是在這里去取
7、TestSuite:測試套件,以登錄套件為例
---loginsuite.py
import unittest
from TestCase.LoginCase import login_case
def return_suite():
suite=unittest.TestSuite()
loader=unittest.TestLoader()
suite.addTests(loader.loadTestsFromTestCase(login_case.Test_login))
return suite
8、browser.ini:瀏覽器配置文件
[local]
local_browser = False
wait_time = 10
[browser]
name = chrome
;name = firefox
;name = ie
window_width =
window_height =
[grid]
command_executor = http://127.0.0.1:4444/wd/hub
headless = False
proxy =
9、run.py:整體運行文件
import unittest
from TestSuite.LinesSuite import lines_suite
from TestSuite.LinesSuite import itinerary_suite
import HTMLReport
suite = unittest.TestSuite()
# suite.addTests(login_suite.return_suite())
suite.addTests(lines_suite.return_suite())
suite.addTests(itinerary_suite.return_suite())
HTMLReport.TestRunner(
report_file_name="test",
title='WEB UI 自動化',
description='登陸',
thread_count=3
).run(suite)
10、整體框架結構圖: