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

简介: 曲鸟全栈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都是辅助你进行自动化的工具。最重要的是自己一定要去思考、自己建立的自动化是不是简单高效,易于维护和上手,以及你的企业需要怎样的自动化、什么样的自动化才适合你们的企业才是关键的

目录
相关文章
|
11月前
|
人工智能 Ubuntu 前端开发
Dify部署全栈指南:AI从Ubuntu配置到HTTPS自动化的10倍秘籍
本文档介绍如何部署Dify后端服务及前端界面,涵盖系统环境要求、依赖安装、代码拉取、环境变量配置、服务启动、数据库管理及常见问题解决方案,适用于开发与生产环境部署。
1911 1
|
自然语言处理 安全 JavaScript
HarmonyOsNEXT【ArkUI超全解析】新手必看的方舟UI框架指南!
本文是HarmonyOS NEXT方舟UI框架新手指南,涵盖ArkTS开发核心知识点。从UI与组件基础概念到声明式开发优势,再到ArkTS代码实战,包括组件创建、属性设置、事件绑定等。通过实例解析自定义组件开发流程,提供避坑技巧与代码风格建议,助你快速掌握ArkUI框架精髓,轻松构建高效、美观的HarmonyOS应用界面。适合初学者及希望转型声明式开发的开发者学习参考。
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
4558 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
Android开发 UED iOS开发
Harmony os next~UI开发与ArkUI框架
鸿蒙OS的UI开发基于ArkUI框架,采用声明式编程,简化开发流程。五大核心组件(Text、Button、List、Grid、Flex)助力高效布局,支持数据绑定与动态更新。事件响应机制灵敏,适合构建交互丰富的应用。实战技巧包括规范命名、样式复用和调试方法。掌握这些,轻松开发鸿蒙应用。下期预告:分布式开发,记得带上烤冷面!
629 0
|
前端开发 数据安全/隐私保护 开发者
FirstUI:Deepseek能帮我们做很多事情,而这款开源框架专为开发者设计的开源UI框架,让你的项目加速起飞
嗨,大家好,我是小华同学。今天为大家介绍一个轻量级、响应式的前端UI框架——FirstUI。它提供丰富的组件库,包括按钮、输入框、下拉菜单等,帮助开发者快速构建美观、功能丰富的用户界面。FirstUI的核心理念是“简单、快速、高效”,适合各种Web应用开发,如企业网站、电商平台和个人博客。其体积小、加载快,支持响应式设计,并且易于定制。FirstUI拥有活跃的社区支持,开发者可以轻松找到帮助并分享经验。欢迎关注我们,获取更多优质开源项目和高效工作学习方法。
745 0
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
525 15
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
512 11
|
11月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
728 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1163 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex

热门文章

最新文章