【质量工程】使用selenium做UI自动化的正确姿势

本文介绍了如何通过结合Selenium、POM设计模式、Pytest和数据驱动的yml文件,提升基于Selenium的UI自动化框架的易用性和可维护性,包括POM分层、配置管理、测试用例执行和框架实战应用。

导读

550ff3f485182dbdaa3ae41a0206f0ad.gif

易用性、可维护性是衡量一款自动化工具/框架是否好用的主要标准,那么针对大多数人着手测试自动化时最先接触到的、基于selenium的UI自动化框架,怎样才能做到这几点呢?下面将结合我们团队在实际项目上的应用和不断打磨沉淀出来的框架做个简要介绍。

整体介绍

73d23ccdd3bc0d16c831f39c99da9232.gif

34dae70e993d3fbf37fbe2256fd2aa40.png

框架结构图

如上图,框架本身是基于Selenium,结合POM设计模式和分层思想,并配套日志、配置等常用模块的封装;用例部分基于Pytest单元测试框架,结合yml用例组织实现数据驱动;报告部分基于allure插件。


各部分主要功能:

POM设计模式

将核心代码分为了四层:元素定位层、页面对象层、测试数据层、测试用例层。其中页面对象层中封装的每个页面类都会继承BasePage,BasePage中封装了页面元素的常用操作,比如:等待元素、查找元素、点击元素、获取元素的文本值、鼠标操作、切换窗口等。

测试用例类

使用pytest,批量执行用例,使用插件allure来生成测试报告、收集日志和报错截图。

Configs

是一个配置文件夹,主要为了区分不同运行环境、存储测试账号及其它全局变量。

Utils

是一个存放常用工具类的文件夹,封装了一些常用方法,比如:配置文件的读取、接口请求、yml文件解析、文件上传、日志收集等。

具体实现

2657af847225b5fb061f2f53a62d2a39.gif

d9617f7a548d891ec9d2b23c3ca4c261.gif

配置文件

使用配置文件的好处?

将所有的代码和配置都变成模块化可配置化,可以提高代码的复用性;这样有数据或代码变动时,不用每次都去修改代码内部。

解决业务场景中的实际问题,比如:我们想实现一套自动化代码在多套测试环境中运行,可以在配置文件中设置全局开关,控制脚本的运行环境;不同配置文件可以管理不同的测试账号、数据库地址等。

全局开关配置文件global.cfg:

c37c56046bcad69a4d08fd91311f6a97.png

ee20672e916c53d4d0d97409508c4b35.gif

yml文件管理用例数据

运行自动化测试用例是关键,存放测试用例的方式有很多,比如Excel表格、xml文件、json文件、py文件等。我们这里用yml文件来管理用例数据,优点是通过key-value方式维护,可读性强,减少后续维护成本。框架中主要涉及如下yml相关处理方法:

f017a288667a7cc7ff964b35af2fd95d.png

171b78bf5e4e569c9e65fb415e5db3e1.png

f4d48f4fc13dc99c7a4a000dedc76594.png

f28dd86a9d641e45589a68a194c08434.png

在编写yml用例文件时,建议一个文件存放一个业务场景的case,正常场景和异常场景分开维护。比如:登录和注册场景,登录的业务场景会有两个yml文件,一个yml文件维护正常场景,一个yml文件维护异常场景;注册场景也同样处理。

753e4f1381be469644cc5cbdbeff18f3.gif

PO设计模式

PO是PageObject的缩写,PO模式是自动化测试项目开发实践的最佳设计模式之一。核心思想是通过对界面元素的封装,减少代码冗余;同时在后期维护中,若元素定位发生变化,则只需要调整页面元素封装的代码即可。这样可提高测试用例的可维护性和可读性。

按照PO设计模式和分层思想,将代码分为四层:

元素定位层:封装页面的元素,注意:不必把页面全部元素封装,封装业务场景使用的即可。

以登录页面为例:

f1d83a985ac186df7d045540cac77522.png

页面对象层:封装页面的业务逻辑,比如:登录页面封装登录功能,注册功能等。

a332d850d1f42b51b8d590c327dbf6c3.png

测试数据层:准备场景的测试数据,yml文件格式存储。以简单的登录场景为例,用例编写如下:

login_success.yml:

7e42faffb1a44e18a648516325f71b22.png

login_fail.yml:

3ff970123b412ddc261dd350c5591257.png

测试用例层:跑业务场景,数据驱动,批量执行,断言。

eb17fb8b5f27e55644f3e3a7d5a97b57.png

29563d3a6a1ef0ca4657ace40c1bf7ee.gif

用例执行

使用pytest来执行测试用例,pytest是一个非常成熟的python单元测试框架,比unittest更灵活,更容易上手。开发web自动化项目,pytest也比unittest更合适。

pytest中自带的有两个文件,一个是pytest.ini,另一个是conftest.py。

pytest.ini是核心配置文件,放在项目根目录下,名称固定,运行时程序自动解析。配置文件中可以改变pytest一些默认的运行方式,如:用例收集规则,标签,命令行参数等等。例如:

9e6ebf2a423897be00f8baff82cffd80.png

conftest.py文件名称固定,不能修改,可放到项目根目录下全局调用,也可放在某个package下,仅在该package内有效。实际测试中,conftest.py文件需要结合fixture来使用,实现用例的前置和后置。例子如下:

de968964c6260fdb86a9221b576e146b.png

37ea1422eaebce2f35d09fa7945f82f2.png

pytest通过命令行运行用例,可以通过给用例打标签的方式,指定用例来运行;可以设置case失败后重跑次数;可以设置并发数;可以设置报告的生成方式等。例如:

5bb2e58e42c7f40316d0dc9a0ed3badc.png

框架实际使用步骤举例

ea97603c9e503483ca320b5f54155c8b.gif

框架的实际使用,以实际项目上的一个页面功能举例如下:

1. 完成元素定位

pages层按照页面功能划分,存放页面元素定位。

6cf68e5e816a7b74c1258504041f8b25.png

项目中每个页面下封装{name}_page_locator.py,覆盖业务场景所需页面元素

4a6fb1b0c6154ad99347c0f6e6affd4e.png

2. 封装页面对象类

导入对应页面的元素定位文件和base_page.py,页面对象类需要结合BasePage中封装的方法完成对页面元素的操作。项目中每个页面下有{name}_page.py,封装页面功能。

73b2ce6eb1b79cae43175d6bf08e1509.png

3.Pytest组织测试用例(操作页面对象类)

testcases层存放各模块下的测试用例,test_xxx.py文件操作页面对象,实现正向和反向业务场景的测试,加上断言,判断用例执行结果。

cc68e0d51b625a8498706e5216476b5e.png

566a3eae135c9e26897479ca152a3935.png

b7ace33828037001811c03c88fa08fcf.png

4. Yml组织用例数据

data层存放用例数据,用例编写格式为yml。正向用例和反向用例分开维护。

a9de73e050b8b76f86317d4a51a8752c.png

5. 用例执行

根目录下的run.py定义了执行用例的方法,可以指定case标签运行。

a2e2e6a51d6bdbad004939232e08866f.png

总结

fb5b4cce49e53a8d0b62b876fa48ed9e.png

按照这样的方式封装,框架使用就变得非常的清晰,易用性大大提高。且日常功能变动,也仅需修改相关POM,不影响其它功能,同样框架应用于其它项目的话,也只需完成POM相关的修改,可扩展性也还是不错的。基于Pytest的用例执行,也便于CI的集成;实际运行中,结合Selenium-Grid,就实现了用例的分布式运行,大大提高执行效率(效率对于UI自动化来说,也还是非常重要的)。

此外,对于项目中非常关键的Pytest主要特性及与Unittest的差异做个补充:

1b60ccbc8c57148edce9dbf62d15cb61.png

e94155bfbb573b1d0fffe37f64b5e6d7.png

125a85e38a2c21f86253957e85ae415a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值