曲鸟全栈UI自动化教学(八):框架代码讲解和进一步优化

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 曲鸟全栈UI自动化教学(八):框架代码讲解和进一步优化

一、前言


上一章《曲鸟全栈UI自动化教学(七):使用Pytest来搭建自动化测试框架》 的教学中,我们搭建了一个自动化测试框架的雏形,做到了数据和代码的分离。这篇会为对框架代码进行讲解。

点我或滑至文末获取《21天学通Python》教程<<


二、代码框架讲解


1. 项目目录

项目目录文件就下面五个,核心的主要在test_case.pycomDef.py这两个文件中


image.png


程序运行的入口文件为main.py,当我们运行main.py文件时,会执行pytest.main方法进行测试用例的注册:

import pytest
# 执行测试用例
pytest.main(['test_case.py'])


2. 核心代码讲解

上面的代码等于将test_case.py这个文件中的pytest的测试用例进行执行,test_case.py文件代码如下 (注释是对该行代码的解释说明)

import pytest
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from comDef import parse_case
# 初始化driver
driver = webdriver.Chrome()  # 初始化webdriver,启动谷歌浏览器
driver.implicitly_wait(2)  # 设置元素的全局等待时间为2秒,当操作元素时,元素2秒内未出现就抛出异常
driver.maximize_window()  # 最大化浏览器窗口
# 调用parse_case方法,对文件名为:“自动化测试用例.xlsx”里的数据进行解析,解析为[{},{}]列表的形式,这样pytest才能够识别
@pytest.mark.parametrize("data", parse_case('自动化测试用例.xlsx'))
# data为excel中的每行记录(步骤)转换成的pytest能识别的代码:{'action': 'send_keys', 'location_method': 'XPATH', 'path': '//*[@id="account"]', 'value': 'admin'}
def test_run_case(data):
    path, location_method = data.get('path'), data.get('location_method')  # 获取元素地址、定位方法
    action, value = data.get('action'), data.get('value')  # 获取要执行的操作、和操作的值(例如;send_keys的value)
    if path:
        if location_method:
            _driver = driver.find_element(getattr(By, location_method), path) # 寻找元素对象
            # 下面为封装的具体操作,根据excel表获取的不同则执行不同的操作
            if action == 'click':  # 如果要执行的操作等于click则执行点击事件
                _driver.click()
            elif action == 'send_keys' and value:
                _driver.send_keys(value)
    elif value:  # 没有元素路径则代表执行的操作不需要元素路径,所以下面封装的操作都是不需要元素路径的
        if action == 'sleep':  # 强制等待
            time.sleep(float(value))
        elif action == 'get':
            driver.get(value)
    else:
        return False

上面的代码本身也有缺陷,首先我们封装的操作比较少,只有click、send_keys、get等这几个简单的操作,但如果我们封装的操作多了,按现在这样的代码写法,代码量会成倍的增加 (下面是增加了四个操作后,操作功能部分代码)

        if action == 'click':  # 如果要执行的操作等于click则执行点击事件
                getattr(_driver, action)()
                _driver.click()
            elif action=='clear':
                _driver.clear()
                _driver.is_displayed()
            elif action == 'send_keys' and value:
                _driver.send_keys(value)
        if action == 'sleep':  # 强制等待
            time.sleep(float(value))
        elif action == 'get':
            driver.get(value)
        elif action == 'refresh':
            driver.refresh()
        elif action == 'quit':
            driver.quit()
        elif action == 'close':
            driver.close()

可以看到代码量越来越多,当我们框架越来越完善的时候,增加的操作更多的时候,就会越来越难以维护,所以我们需要换一种更精简的写法来简化代码。


三、代码优化

我们还是可以通过反射来处理这些操作代码:

未使用反射时的执行操作的代码(而且随着操作增多代码量也会增加):

        if action == 'click':  # 如果要执行的操作等于click则执行点击事件
                getattr(_driver, action)()
                _driver.click()
            elif action=='clear':
                _driver.clear()
                _driver.is_displayed()
            elif action == 'send_keys' and value:
                _driver.send_keys(value)


        if action == 'sleep':  # 强制等待
            time.sleep(float(value))
        elif action == 'get':
            driver.get(value)
        elif action == 'refresh':
            driver.refresh()
        elif action == 'quit':
            driver.quit()
        elif action == 'close':
            driver.close()

使用反射时的执行操作的代码:


getattr(_driver, action)(value) if value else getattr(_driver, action)()
        if action == 'sleep':  # 强制等待
            time.sleep(float(value))
        else:
            getattr(driver, action)(value) if value else getattr(driver, action)()

可以看到,代码减少了很多!而且再增加操作也不会增加我们的代码量!

完整test_case.py代码如下:


import pytest
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from comDef import parse_case
# 初始化driver
driver = webdriver.Chrome()  # 初始化webdriver,启动谷歌浏览器
driver.implicitly_wait(2)  # 设置元素的全局等待时间为2秒,当操作元素时,元素2秒内未出现就抛出异常
driver.maximize_window()  # 最大化浏览器窗口
# 调用parse_case方法,对文件名为:“自动化测试用例.xlsx”里的数据进行解析,解析为[{},{}]列表的形式,这样pytest才能够识别
@pytest.mark.parametrize("data", parse_case('自动化测试用例.xlsx'))
# data为excel中的每行记录(步骤)转换成的pytest能识别的代码:{'action': 'send_keys', 'location_method': 'XPATH', 'path': '//*[@id="account"]', 'value': 'admin'}
def test_run_case(data):
    path, location_method = data.get('path'), data.get('location_method')  # 获取元素地址、定位方法
    action, value = data.get('action'), data.get('value')  # 获取要执行的操作、和操作的值(例如;send_keys的value)
    if path:
        if location_method:
            _driver = driver.find_element(getattr(By, location_method), path) # 寻找元素对象
            # 通过反射封装操作,根据excel表获取的不同则执行不同的操作
            getattr(_driver, action)(value) if value else getattr(_driver, action)()
    elif value:  # 没有元素路径则代表执行的操作不需要元素路径,所以下面封装的操作都是不需要元素路径的
        if action == 'sleep':  # 强制等待
            time.sleep(float(value))
        else:
            # 通过反射封装操作,根据excel表获取的不同则执行不同的操作
            getattr(driver, action)(value)
    else:
        getattr(driver, action)()


四、测试用例填写优化


我们之前测试用例在excel中编写的,指定操作步骤和定位方法都是输入进去,其实我们可以做一个下来菜单来选择:

下拉选择定位方式:

d146929d8d5e42169d653dc49794880e.png

下拉选择操作方式:

c81bd1c8fa5e40678f6a3cf26f7e8158.png


甚至我们还可以改成中文 (相应的解析代码需要做修改(根据/分割,取最前)):

1ec49fa9098341b694c3166394766a2a.png

这样写起来就方便一些了,能够提升一些我们的编写效率。


五、总结


其实我们常说的自动化测试平台,最直观的也就是将编写编写用例这部分操作放在了平台上进行 (下图是我们自建的自动化测试平台编辑用例的截图):

a9056b33497e4d0f9abc4a3bbeda7cf3.png

将各个操作元素、类型以及填写的值都都通过图形化操作的方法进行编辑,而用例、页面元素都通过平台进行管理:


139dc8a5032740de8cf7c5c56a903486.png


执行操作和结果验证、生成测试报告、定时执行、元素维护等,甚至是失败重跑、重试这些机制都交由后台服务处理。


让编写自动化用例的过程更纯粹,只需要通过“点点点”的方式就能够实现,以至于让完全不懂代码的用户也能够编写自动化测试用例。但构建自动化测试平台的成本是极高的! 所以是选择构建自动化测试平台、还是excel驱动或者其他方式的自动化测试需要根据公司对自动化这一块投入的占比来选择。


另外,无论是我们说的关键字驱动、数据代码分离,还是本教程所建立的框架,都是为了让自动化测试变得简单高效,但在个人接触中发现,有些同行业的小伙伴,花了不少精力去使用各种各样的框架,感觉很高端、很厉害、但当编写用例的时候维护成本反而越来越高。甚至为了能够上手编写自动化用例,还需要花一周、两周去熟悉框架、代码。本来是化繁为简的过程反而弄的越来越复杂,这是得不偿失的!


自动化测试本就是一个回报与投入比较低的事情,而为了这个事情维护了一套框架,不能够提高自动化用例的编写效率,这也是非常讽刺的一件事情。


这里我想表达的主要意思就是:学习自动化可能不同的企业、不同的小伙伴选择的技术架构、框架都不一样,实际不需要去纠结该如何作选择。无论是pytest、allure、robotframework、selenium、airtest都是辅助你进行自动化的工具。最重要的是自己一定要去思考、自己建立的自动化是不是简单高效,易于维护和上手,以及你的企业需要怎样的自动化、什么样的自动化才适合你们的企业才是关键的

目录
相关文章
|
1月前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
118 8
|
2月前
|
人工智能 前端开发 测试技术
探索软件测试中的自动化框架选择与优化策略####
本文深入剖析了当前主流的自动化测试框架,通过对比分析各自的优势、局限性及适用场景,为读者提供了一套系统性的选择与优化指南。文章首先概述了自动化测试的重要性及其在软件开发生命周期中的位置,接着逐一探讨了Selenium、Appium、Cypress等热门框架的特点,并通过实际案例展示了如何根据项目需求灵活选用与配置框架,以提升测试效率和质量。最后,文章还分享了若干最佳实践和未来趋势预测,旨在帮助测试工程师更好地应对复杂多变的测试环境。 ####
65 4
|
2月前
|
机器学习/深度学习 前端开发 测试技术
探索软件测试中的自动化测试框架选择与优化策略####
本文深入探讨了在当前软件开发生命周期中,自动化测试框架的选择对于提升测试效率、保障产品质量的重要性。通过分析市场上主流的自动化测试工具,如Selenium、Appium、Jest等,结合具体项目需求,提出了一套系统化的选型与优化策略。文章首先概述了自动化测试的基本原理及其在现代软件开发中的角色变迁,随后详细对比了各主流框架的功能特点、适用场景及优缺点,最后基于实际案例,阐述了如何根据项目特性量身定制自动化测试解决方案,并给出了持续集成/持续部署(CI/CD)环境下的最佳实践建议。 --- ####
|
2月前
|
人工智能 监控 测试技术
探索软件测试中的自动化框架选择与优化策略####
【10月更文挑战第21天】 本文深入剖析了软件测试领域面临的挑战,聚焦于自动化测试框架的选择与优化这一核心议题。不同于传统摘要的概述方式,本文将以一个虚拟案例“X项目”为线索,通过该项目从手动测试困境到自动化转型的成功历程,生动展现如何根据项目特性精准匹配自动化工具(如Selenium、Appium等),并结合CI/CD流程进行深度集成与持续优化,最终实现测试效率与质量的双重飞跃。读者将跟随“X项目”团队的视角,直观感受自动化框架选型的策略性思考及实践中的优化技巧,获得可借鉴的实战经验。 ####
46 0
|
30天前
|
人工智能 Linux API
PromptWizard:微软开源 AI 提示词自动化优化框架,能够迭代优化提示指令和上下文示例,提升 LLMs 特定任务的表现
PromptWizard 是微软开源的 AI 提示词自动化优化框架,通过自我演变和自我适应机制,迭代优化提示指令和上下文示例,提升大型语言模型(LLMs)在特定任务中的表现。本文详细介绍了 PromptWizard 的主要功能、技术原理以及如何运行该框架。
161 8
PromptWizard:微软开源 AI 提示词自动化优化框架,能够迭代优化提示指令和上下文示例,提升 LLMs 特定任务的表现
|
26天前
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
233 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
19天前
|
数据挖掘
优化现金流:CRM回款自动化的关键步骤
在当今商业环境中,CRM系统已成为企业与客户互动的核心平台。回款自动化作为其重要功能,通过集成支付平台、自动化发票生成、智能提醒和数据分析等手段,显著减少人工操作错误,加快资金周转,提升现金流管理能力,降低成本并增强客户满意度。这不仅提高了企业的财务效率,还增强了市场竞争力。企业应积极拥抱这一变革,优化CRM系统,实现财务管理的智能化,从而在竞争中占据有利地位。
|
28天前
|
人工智能 搜索推荐 算法
婚恋交友系统UI/UX设计优化 婚恋交友系统用户界面友好性提升 婚恋交友系统用户行为分析与优化 婚恋交友系统用户反馈收集与处理
针对婚恋交友系统的UI/UX设计优化,本文提出多项策略:简化用户界面、提升交互体验、个性化推荐算法;增强用户界面友好性,包括适应性、无障碍及情感化设计;通过数据收集与分析优化用户行为路径;建立多渠道反馈机制,分类处理并及时告知结果。这些措施旨在提高用户体验和满意度,促进平台健康发展。[点击查看完整演示和免费源码](https://gitee.com/duoke-official-open-source/hunlianjiaoyou)
69 4
|
2月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
147 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
2月前
|
监控 安全 测试技术
在实施自动化和持续集成的过程中,如何确保代码的安全性和合规性
在自动化和持续集成中,确保代码安全与合规至关重要。措施包括集成自动化安全工具、执行自动化合规检查、进行代码质量与安全检测、评估开源代码安全、实施基础设施即代码的安全标准、采用多层防御策略、加强安全教育与文化建设、使用合规性检测工具及许可证合规分析等,共同提升代码安全性与合规水平。

热门文章

最新文章