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

目录
相关文章
|
6天前
|
XML 数据管理 测试技术
深入探索软件自动化测试框架的设计与实现
【4月更文挑战第26天】 随着软件开发周期不断缩短,传统的手动测试方法已难以满足快速迭代的需求。本文聚焦于自动化测试框架的构建与优化,旨在提供一种高效、可维护且可扩展的软件测试解决方案。文章从自动化测试的必要性出发,详细阐述了自动化测试框架设计的核心要素,包括模块化设计、数据驱动测试以及关键词驱动测试等概念。同时,结合实例分析了如何利用流行的测试工具进行框架搭建,并提出了针对常见问题的创新解决方法。最后,通过案例研究展示了该框架在实际项目中的应用效果和潜在改进空间。
|
5天前
|
Web App开发 IDE 测试技术
【专栏】深入理解自动化测试框架 Selenium 的核心组件
【4月更文挑战第27天】Selenium 是一款广泛使用的自动化测试框架,核心组件包括 WebDriver(与浏览器交互的接口,支持多浏览器测试),IDE(可视化的测试脚本录制和编辑工具)和 Grid(分布式测试,实现多机器并行测试)。通过这些组件,开发者能高效、稳定地进行自动化测试,但需注意浏览器兼容性、脚本维护和性能问题。理解并掌握这些组件的使用,能提升测试效率和质量。
|
2天前
|
数据管理 测试技术
深入理解自动化测试框架:以Selenium为例
【4月更文挑战第30天】 随着软件开发的快速发展,自动化测试已经成为保证软件质量和提升开发效率的重要手段。本文将深入探讨自动化测试框架的核心概念,并以广泛应用的开源工具Selenium为例,解析其架构、原理及在实际项目中的运用。通过实例分析与性能评估,旨在为读者提供一套系统的自动化测试解决方案,并探讨其在复杂应用场景下的优化策略。
|
2天前
|
敏捷开发 前端开发 JavaScript
深入理解自动化测试框架:以Selenium为例
【4月更文挑战第30天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快市场投放的关键步骤。本文聚焦于流行的自动化测试框架——Selenium,探讨其架构、核心组件以及如何有效地利用Selenium进行Web应用测试。通过分析真实案例,我们将揭示Selenium在实际项目中的应用优势与面临的挑战,并提出优化策略。文章的目的在于帮助测试工程师深入理解Selenium,提升其在复杂项目中的运用效率。
|
2天前
|
前端开发 IDE 数据可视化
深入理解与应用自动化测试框架Selenium的最佳实践
【4月更文挑战第30天】 本文将深入剖析自动化测试框架Selenium的核心原理,并结合最佳实践案例,探讨如何有效提升测试覆盖率和效率。文中不仅涉及Selenium的架构解析,还将提供针对性的策略来优化测试脚本,确保测试流程的稳定性与可靠性。通过实例演示,读者可以掌握如何在不同测试场景中灵活运用Selenium,以及如何处理常见的技术挑战。
|
2天前
|
弹性计算 Shell 开发工具
自动化代码质量检查
【4月更文挑战第30天】
5 0
|
2天前
|
敏捷开发 监控 前端开发
深入理解与应用自动化测试框架:以Selenium为例
【4月更文挑战第30天】 在软件开发的快速迭代周期中,质量保证(QA)团队面临持续的压力,需确保产品在每次发布时都达到预期的质量标准。为了应对这一挑战,自动化测试成为了关键工具,它不仅提高了测试效率,还确保了测试的一致性和可重复性。本文将探讨自动化测试框架Selenium的核心组件、工作原理及其在实际测试中的应用。通过分析Selenium的优势和面临的常见问题,我们将讨论如何有效地集成Selenium到现有的测试流程中,以及如何克服常见的技术障碍。我们的目标是为读者提供一个清晰的指南,帮助他们理解和利用自动化测试框架来优化他们的软件测试实践。
|
3天前
|
机器学习/深度学习 人工智能 数据管理
深入探索自动化测试框架的设计与实践
【4月更文挑战第30天】 随着软件行业的快速发展,传统的手动测试方式在效率和可靠性方面逐渐暴露出不足。本文将重点探讨自动化测试框架的设计理念、关键组成部分以及实际应用中的挑战与解决方案。通过对自动化测试框架的深入研究,我们旨在为读者提供构建高效、可靠的自动化测试系统的指导和启示。文章首先分析了自动化测试的重要性,接着详细介绍了几种流行的自动化测试工具,并以此为基础提出了设计框架的核心原则和架构模式。最后,通过案例研究,展示了如何在实际项目中实施自动化测试框架,并讨论了面临的常见问题及解决策略。
|
3天前
|
机器学习/深度学习 人工智能 机器人
深入理解自动化测试:框架、工具与实践
【4月更文挑战第30天】 在现代软件开发周期中,自动化测试已成为确保产品质量和加速市场交付的关键环节。本文将探讨自动化测试的核心框架、常用工具以及实际应用的最佳实践,旨在为软件测试工程师提供深入的理解和有效的策略,以改进其自动化测试流程。我们将分析几种流行的测试自动化框架,包括Selenium、Appium和JUnit,并讨论如何根据项目需求选择适合的工具。此外,文中还将介绍持续集成(CI)环境下的自动化测试策略,以及如何通过测试结果分析和报告来优化测试过程。目标是帮助读者构建更健壮、更高效的自动化测试系统。
|
3天前
|
开发框架 前端开发 JavaScript
学会Web UI框架--Bootstrap,快速搭建出漂亮的前端界面
学会Web UI框架--Bootstrap,快速搭建出漂亮的前端界面

热门文章

最新文章