39. 自動化異步測試開發之編寫異步業務函數、測試函數和測試類(函數寫法)

39. 自動化異步測試開發之編寫異步業務函數、測試函數和測試類(函數寫法)

一、異步業務函數解析

1.1 頁面導航函數

async def get(async_driver, url: str = 'http://secure.smartbearsoftware.com/samples/testcomplete12/WebOrders/Login.aspx'):await async_driver.get(url)
  • 功能:導航到指定URL
  • 默認URL:Web Orders登錄頁面
  • 執行效果:瀏覽器打開指定頁面

1.2 登錄功能函數

async def login(async_driver, username: str = 'Tester', password: str = 'test'):await async_driver.send_keys('id', 'ctl00_MainContent_username', text=username)await async_driver.send_keys('id', 'ctl00_MainContent_password', text=password)await async_driver.click('name', 'ctl00$MainContent$login_button')
  • 操作步驟
    1. 在用戶名輸入框輸入用戶名
    2. 在密碼輸入框輸入密碼
    3. 點擊登錄按鈕
  • 默認憑證:用戶名’Tester’,密碼’test’
  • 元素定位:使用ID定位輸入框,Name定位按鈕

1.3 搜索功能函數

async def search(async_driver):await async_driver.click('xpath', '//*[@id="ctl00_menu"]/li[3]/a')  # 點擊搜索菜單await async_driver.send_keys('id', 'ctl00_MainContent_fmwOrder_txtName')  # 輸入搜索內容await async_driver.click('id', 'ctl00_MainContent_fmwOrder_InsertButton')  # 點擊搜索按鈕
  • 操作流程
    1. 點擊菜單中的搜索選項
    2. 在搜索框輸入內容
    3. 點擊搜索按鈕

1.4 登出功能函數

async def logout(async_driver):await async_driver.click('xpath', '//*[@id="ctl00_logout"]')  # 點擊登出鏈接
  • 功能:退出當前登錄狀態
  • 定位方式:使用XPath定位登出鏈接

二、異步測試函數實現

2.1 登錄功能測試

async def test_login(async_driver):await get(async_driver)  # 打開登錄頁面await login(async_driver)  # 執行登錄操作# 驗證登錄成功title_text = await async_driver.text('xpath', '//*[@id="aspnetForm"]//td[1]/h1')assert title_text == 'Web Orders'await logout(async_driver)  # 退出登錄
  • 測試流程
    1. 打開登錄頁
    2. 輸入憑證登錄
    3. 驗證頁面標題
    4. 登出系統
  • 斷言驗證:檢查登錄后頁面標題是否為’Web Orders’

2.2 搜索功能測試

async def test_search(async_driver):await get(async_driver)  # 打開登錄頁await login(async_driver)  # 登錄系統await search(async_driver)  # 執行搜索操作# 驗證錯誤提示error_msg = await async_driver.text('id', "ctl00_MainContent_fmwOrder_RequiredFieldValidator3")assert error_msg == "Field 'Street' cannot be empty."await logout(async_driver)  # 退出登錄
  • 測試流程
    1. 登錄系統
    2. 執行空搜索
    3. 驗證錯誤提示
  • 斷言驗證:檢查是否顯示’Street不能為空’的錯誤提示

三、完整測試執行流程

3.1 測試運行器實現

import asyncio
from chap9.async_browser import AsyncBrowser
from aiohttp import ClientSessionasync def run_tests():async with ClientSession() as session:# 啟動瀏覽器async with AsyncBrowser.start(remote_driver_server='http://localhost:9515',capabilities={'browserName': 'chrome','goog:chromeOptions': {'args': ['--headless']}},http_session=session) as driver:# 執行登錄測試print("執行登錄測試...")await test_login(driver)print("登錄測試通過 ?")# 執行搜索測試print("執行搜索測試...")await test_search(driver)print("搜索測試通過 ?")if __name__ == "__main__":asyncio.run(run_tests())

3.2 預期執行結果

執行登錄測試...
登錄測試通過 ?
執行搜索測試...
搜索測試通過 ?

3.3 實際頁面操作流程

1. 打開登錄頁:http://secure.smartbearsoftware.com/...
2. 輸入用戶名:Tester
3. 輸入密碼:test
4. 點擊登錄按鈕
5. 驗證頁面標題:Web Orders
6. 點擊登出鏈接
7. 重新登錄
8. 點擊搜索菜單
9. 點擊搜索按鈕(不輸入內容)
10. 驗證錯誤提示:Field 'Street' cannot be empty.
11. 點擊登出鏈接

四、設計優勢分析

4.1 業務與測試分離

  • 業務函數:封裝頁面操作邏輯(如login, search)
  • 測試函數:組合業務函數并添加斷言
  • 分離好處:業務變更只需修改一處

4.2 異步執行優勢

操作同步執行時間異步執行時間提升效果
打開頁面2秒0.5秒75%
輸入操作1秒0.3秒70%
多測試并行線性增長并行執行300%+

4.3 可重用性設計

# 在不同測試中重用業務函數
async def test_order(async_driver):await get(async_driver)await login(async_driver)# 添加訂單測試代碼await logout(async_driver)

五、最佳實踐建議

  1. 參數化默認值

    async def login(async_driver, username: str = DEFAULT_USER, password: str = DEFAULT_PASS):
    
  2. 元素定位器集中管理

    USERNAME_FIELD = ('id', 'ctl00_MainContent_username')
    await async_driver.send_keys(*USERNAME_FIELD, text=username)
    
  3. 添加操作等待

    from selenium.webdriver.support.ui import WebDriverWait
    await WebDriverWait(async_driver, 10).until(element_visible(USERNAME_FIELD))
    
  4. 錯誤處理增強

    async def safe_login(async_driver):try:await login(async_driver)except LoginException:await handle_login_failure()
    

這種異步測試開發模式通過將業務操作、測試驗證和測試執行分層設計,顯著提高了測試代碼的可維護性和執行效率。

六、完整代碼

"""
Python :3.13.3
Selenium: 4.31.0async_test_func.py
"""async def get(async_driver,url: str = 'http://secure.smartbearsoftware.com/samples/testcomplete12/WebOrders/Login.aspx'):await async_driver.get(url)async def login(async_driver, username: str = 'Tester', password: str = 'test'):await async_driver.send_keys('id', 'ctl00_MainContent_username', text=username)await async_driver.send_keys('id', 'ctl00_MainContent_password', text=password)await async_driver.click('name', 'ctl00$MainContent$login_button')async def search(async_driver):await async_driver.click('xpath', '//*[@id="ctl00_menu"]/li[3]/a')await async_driver.send_keys('id', 'ctl00_MainContent_fmwOrder_txtName')await async_driver.click('id', 'ctl00_MainContent_fmwOrder_InsertButton')async def logout(async_driver):await async_driver.click('xpath', '//*[@id="ctl00_logout"]')async def test_login(async_driver):await get(async_driver)await login(async_driver)assert await async_driver.text('xpath', '//*[@id="aspnetForm"]//td[1]/h1') == 'Web Orders'await logout(async_driver)async def test_search(async_driver):await get(async_driver)await login(async_driver)await search(async_driver)assert await async_driver.text('id',"ctl00_MainContent_fmwOrder_RequiredFieldValidator3") == "Field 'Street' cannot be empty."await logout(async_driver)

「小貼士」:點擊頭像→【關注】按鈕,獲取更多軟件測試的晉升認知不迷路! 🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83451.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83451.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83451.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt 無邊框窗口實現拖動與窗口控制(最小化/最大化/關閉)

在 Qt 中,使用 Qt::FramelessWindowHint 可以創建無邊框窗口,但這樣會導致窗口無法拖動,并且系統默認的標題欄按鈕(最小化、最大化、關閉)也會消失。本文將介紹如何實現無邊框窗口的鼠標拖動功能,并添加自定…

Linux中的System V通信標準-共享內存、消息隊列以及信號量

在Linux系統中,System V IPC(Inter-Process Communication)提供了一系列進程間通信的機制,包括共享內存、消息隊列和信號量。這些機制在系統中發揮了重要作用,幫助進程之間進行數據交換和同步。本文將詳細介紹這些機制…

postman工具使用

基本功能操作 常用斷言 定義:postman 斷言借助 JavaScript - js 語言編寫代碼,自動判斷預期結果與實際結果是否一致。( 注意斷言 代碼寫在 Tests 的標簽中) 斷言響應狀態碼 斷言響應體是否包含某個字符串(Response bo…

VBA數據庫解決方案二十:Select表達式From區域Where條件Order by

《VBA數據庫解決方案》教程(版權10090845)是我推出的第二套教程,目前已經是第二版修訂了。這套教程定位于中級,是學完字典后的另一個專題講解。數據庫是數據處理的利器,教程中詳細介紹了利用ADO連接ACCDB和EXCEL的方法…

算法-集合的使用

1、set常用操作 set<int> q; //以int型為例 默認按鍵值升序 set<int,greater<int>> p; //降序排列 int x; q.insert(x); //將x插入q中 q.erase(x); //刪除q中的x元素,返回0或1,0表示set中不存在x q.clear(); //清空q q.empty(); //判斷q是否為空&a…

C++文件和流基礎

C文件和流基礎 1. C文件和流基礎1.1 文件和流的概念1.2 標準庫支持1.3 常用文件流類ifstream 類ofstream 類fstream 類 2.1 打開文件使用構造函數打開文件使用 open() 成員函數打開文件打開文件的模式標志 2.2 關閉文件使用 close() 成員函數關閉文件關閉文件的重要性 3.1 寫入…

Maven---配置本地倉庫

目錄 5. 5.1在Maven路徑下新建文件夾用于本地倉庫存儲 5.2 復制本地倉庫路徑 5.3 找到配置文件路徑&#xff0c;使用VSCode方式打開 5.4 新增一行代碼 5.5 復制本地倉庫路徑&#xff0c;設置存儲路徑 5.1在Maven路徑下新建文件夾用于本地倉庫存儲 5.2 復制本地倉庫路徑 5…

Vue3 + Element Plus + TypeScript 中 el-cascader 實現模擬用戶點擊功能

模擬點擊&#xff0c;調用 el-cascader 的公開方法 togglePopperVisible 來展開下拉框 MaterialOut.vue <script setup lang"ts" name"MaterialOut"> ...... import { ElMessage, type ElCascader } from "element-plus";// 級聯組件實例…

新能源汽車與油車銷量

中國油車與新能源車銷量對比&#xff08;2022-2025年&#xff09; ?1. 市場份額演化&#xff08;2022-2025年&#xff09;? ?年份? ?新能源車銷量 &#xff08;滲透率&#xff09;? ?燃油車銷量 &#xff08;滲透率&#xff09;? ?關鍵事件? ?2022? 688.7萬輛…

C++ list代碼練習、set基礎概念、set對象創建、set大小操作

對應力扣&#xff0c;回文鏈表&#xff0c;代碼見下 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, …

前端面試寶典---前端水印

明水印 1. 背景圖 通過css的background-image加載背景圖 2. canvasbackground水印 前端水印實現思路與示例代碼 一、核心實現思路 Canvas動態生成水印 通過Canvas繪制文本或圖案&#xff0c;將生成的圖像轉為Base64格式&#xff0c;作為背景圖重復平鋪到目標元素上。例如&…

惡意軟件清理工具,讓Mac電腦安全更簡單

?你的Mac最近是不是開始表演"電子迷惑行為"&#xff1f;瀏覽器主頁突然變成澳門賭場&#xff0c;風扇轉得比直升機螺旋槳還猛......恭喜你&#xff01;可能中獎獲得"惡意軟件大禮包"&#xff01;別慌&#xff0c;今天就教你用惡意軟件清理工具化身數字特工…

Spring Boot 3.X 下Redis緩存的嘗試(二):自動注解實現自動化緩存操作

前言 上文我們做了在Spring Boot下對Redis的基本操作&#xff0c;如果頻繁對Redis進行操作而寫對應的方法顯示使用注釋更會更高效&#xff1b; 比如&#xff1a; 依之前操作對一個業務進行定入緩存需要把數據拉取到后再定入&#xff1b; 而今天我們可以通過注釋的方式不需要額外…

Deepseek應用技巧-Dify安裝和踩坑指南

前言&#xff1a;Dify的名號是非常大的&#xff0c;作為私有化AI部署中必不可少的一個組件&#xff0c;他的功能和COZE十分相似&#xff0c;可以進行工作流和智能體的搭建&#xff0c;有非常強大的功能&#xff0c;那本節就將來揭開Dify的神秘的面紗&#xff0c;首先看一下Dify…

ubuntu24.04安裝教程(圖文詳解)

Ubuntu 24.04 LTS&#xff0c;代號 Noble Numbat&#xff0c;于 2024 年 4 月 25 日發布&#xff0c;現在可以從 Ubuntu 官方網站及其鏡像下載。此版本將在 2029 年 4 月之前接收為期五年的官方安全和維護更新。 關于 Ubuntu 24.04 LTS 的一些關鍵點&#xff1a; 發布日期&am…

數據綁定頁面的完整的原理、邏輯關系、實現路徑是什么?頁面、表格、字段、屬性、值、按鈕、事件、模型、腳本、服務編排、連接器等之間的關系又是什么?

目錄 一、核心概念:什么是數據綁定頁面? 二、涉及的組件及其邏輯關系 頁面(Page): 表格(Table): 字段(Field): 屬性(Property): 值(Value): 按鈕(Button): 事件(Event): 模型(Model): 腳本(Script): 服務(Service): 服務編排(Se…

【 SpringCloud | 微服務 網關技術 】

單體架構時我們只需要完成一次用戶登錄、身份校驗&#xff0c;就可以在所有業務中獲取到用戶信息。而微服務拆分后&#xff0c;每個微服務都獨立部署&#xff0c;這就存在一些問題&#xff1a; 每個微服務都需要編寫登錄校驗、用戶信息獲取的功能嗎&#xff1f; 當微服務之間調…

python,Dataframe基于所有包含某個關鍵字的列等于某個值過濾

在 Python 中&#xff0c;使用 Pandas 的 DataFrame 丟棄符合特定條件的行&#xff0c;條件為所有包含某個關鍵字的列中&#xff0c;等于某個值&#xff08;即所有包含某個關鍵字的列中等于某個值的行&#xff09;&#xff0c;可用以下方法實現&#xff1a; import pandas as …

50天50個小項目 (Vue3 + Tailwindcss V4) ? | Sound Board(音響控制面板)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— SoundBoard 組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ &#x1f3af; 組件目標 實現一個響應式按鈕面板&#xff0c;點…

在Ubuntu20.04上安裝ROS Noetic

本章教程,主要記錄在Ubuntu20.04上安裝ROS Noetic。 一、添加軟件源 sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list二、設置秘鑰 …