自动化测试:PO模式设计框架详解

引言

你是否曾经因为每次更新功能都要重新写一堆自动化测试代码而感到疲惫不堪?

或者因为页面元素的频繁变动而不得不持续地修复测试脚本?

如果你也有这些苦恼,那么PO模式设计框架可能是解决之道。它可以让你以更简单、更高效的方式编写自动化测试代码,减少反复劳动和错误率。

在本文中,我们将介绍如何采用PO模式设计框架来秒杀繁琐的自动化测试操作,让你轻松应对变化万千的测试环境。

po模式

在UI级的自动化测试中,对象设计模式表示测试正在交互的web应用,程序用户界面中的一个区域,这个是减少了代码的重复,也就是说,如果用户界面发生了改变,只需要在一个地方修改程序就可以了。

在这我准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看,或者直接关注VX公众号:互联网杂货铺这份测试文档资料也打包在里面啦,免费领取!

软件测试视频教程观看处:

2023完整版阿里大牛7天软件测试零基础速成内部教程,从基础到项目实战学完即入职。

优势

1、创建可以跨越多个测试用例共享的代码

2、减少重复代码的数量

3、如果用户界面发生变更后,只需要在一个地方维护就可以了。

创建ui,在ui的工程中创建对应的包和目录。utils   最后一个包的名称

各个目录详解

(1)base:基础层,主要编写底层定位元素的类,它是一个包。

(2)common:公共类,里面编写公共使用到的方法。

(3)config:配置文件存储目录。

(4)data:存储测试使用到测试数据。

(5)page:对象层,编写具体的业务逻辑,把页面每一个操作行为单独的写一个方法或者是函数。

(6)report:测试报告目录,主要用来存放测试报告。

(7)test:测试层,里面主要是测试模块,也可以说是每个测试的场景的代码。

(8)utils:工具类,存放工具,如文件处理、说明文档等。

(9)run:运行层:整个自动化测试的运行目录。

页面对象设计模式

base基础层

在该层中主要编写了基础代码。在该层主要定义了类WebUI,在这个类中编写了单个元素和多个元素定位的方法。

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:张红
 
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import NoSuchElementException
import time as t
 
class WebUI(object):
    def __init__(self,driver):
        #webdriver实例化后的对象
        self.driver=driver
 
    def findElement(self,*args):
        '''
        单个元素定位的方式
        :param args:
        :return: 它是一个元组,需要带上具体什么方式定位元素属性以及元素属性的值
        '''
        try:
            return self.driver.find_element(*args)
        except NoSuchElementException as e:
            return e.args[0]
 
    def findsElement(self,*args,index):
        '''
        多个元素定位的方式
        :param args:
        :param index: 被定位的目标索引值
        :return: 它是一个元组,需要带上具体什么方式定位元素属性以及元素属性的值
        '''
        try:
            return self.driver.find_elements(*args)[index]
        except NoSuchElementException as e:
            return e.args[0]

page对象层

在这一层的类直接继承了基础层的类,以类属性的方法指明每个操作元素属性的值,然后依据操作步骤编写对应的方法,(比如关于登录的操作:输入用户名、输入密码,点击登录,获取文本的信息操作会在实例中实现的登录操作,然后把每个登录操作封装成一个方法,这样实现登录测试用例直接调用,返回失败信息---其中形式参数会在测试层赋值)

注意:获取文件信息的方法,要有return返回值否则在测试层断言时获取不到文本信息,数据属性和方法名字不要一样

test:测试层

在这里首先需要导入对象层中的类和unittest单元测试框架,在测试类中,继承了unittest.TestCase和对象层中的类,TestCase是由于在编写自动化测试的用例中,用到的测试固件、测试断言和测试执行都是需要它中的方法,而对象层中的类包含对象层中的测试操作步骤的方法,继承后可以直接进行调用。

注意事项:

1、在编写用例的时候需要添加备注信息,明确表示该用例是测试的哪个点,验证的哪个场景.

2、测试模块都是以test_开头,测试方法也是以test_开头的


#! /usr/bin/env python

# -*- coding:utf-8 -*-

# author:张红

from page.sina import *

import  unittest

from selenium import  webdriver

import time as t

from page.init import *

class SinaTest(Init,Sina):

    def test_username_null(self):

        self.login(username='',password='12345')

        t.sleep(3)

        # 验证邮箱名为空

        self.assertEqual(self.getUserError(),'请输入邮箱名')

        t.sleep(3)

    def test_username_supportChinese(self):

        self.login(username='中国',password='12345')

        t.sleep(3)

        # 验证邮箱名不支持中文

        self.assertEqual(self.getUserError(),'邮箱名不支持中文')

        t.sleep(3)

    def test_username_formatError(self):

        self.login(username='123',password='12345')

        t.sleep(3)

        # 验证邮箱名格式不正确

        self.assertEqual(self.getUserError(),'您输入的邮箱名格式不正确')

    def test_password_null(self):

        self.login(username='15102903662@sina.com',password='')

        t.sleep(3)

        # 验证密码为空

        self.assertEqual(self.getPassError(),'请输入密码')

        t.sleep(3)

    def test_login_error(self):

        self.login(username='15102903662@sina.com',password='724225')

        t.sleep(3)

        # 验证用户名错误

        self.assertEqual(self.getUserError(),'登录名或密码错误')

        t.sleep(3)

data数据层

春初测试使用到的测试数据(主要是把数据写入json文件,yaml文件)

在data下创建json文件

common层

common:公共层,里面编写公共使用到的文件(处理路径---重点处理的是json文件或者yaml文件)一般时定义基础路径的

1、在这个层创建public.py  文件

导入os库,定义基础路径(也就是把基础路径处理为将要读取文件所在文件夹的路径,这样方便使用的时候做路径拼接)

untils

工具层:基本上是对data里面的(json yaml文件的读取)

在untils下创建模块:operationJson.py,设置方法readJson()来读取数据

在这个模块我们需要导入os来进行路径拼接,Json反序列化用来读取文件,还有就是导入公共层下的基础路径

config层

配置文件存储目录

run层

运行层,主要是运行测试用例的目录,我们可以根据测试模块来运行,也可以运行所有的模块,该层的内容也适用于所有场景(适用的前提是po设计模式的目录结构如上所示)

测试报告:

 1 import time
 2 # 时间
 3 import unittest
 4 # 加载测试模块
 5 import os
 6 # 处理路径
 7 import HTMLTestRunner
 8 # 生成测试报告必须要用的库
 9 def getSuite():
10     # start_dir=加载所有的测试模块来执行,pattern=通过正则的模式加载所有的模块
11     '''获取所有执行的测试模块'''
12     suite = unittest.TestLoader().discover(
13         start_dir=os.path.dirname(__file__),
14         pattern='test_*.py'
15     )
16     return suite
17 
18 # 获取当前时间
19 def getNowtime():
20     return time.strftime("%y-%m-%d %H_%M_%S",time.localtime(time.time()))
21 
22 # 执行获取的测试模块,并获取测试报告
23 def main():
24     filename=os.path.join(os.path.dirname(__file__),'report',getNowtime()+"report.html")
25     # 把测试报告写入文件中,b是以二进制的方式写入
26     fp=open(filename,"wb")
27     # HTMLTestRunner实例化的过程,stream是流式写入,title是测试报告的标题,description是对测试报告的描述
28     runner=HTMLTestRunner.HTMLTestRunner(
29         stream=fp,
30         title="UI自动化测试报告",
31         description="UI自动化测试报告"
32     )
33     runner.run(getSuite())
34 if __name__=="__main__":
35     main()

report

主要用于存放测试报告

结语

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。

PS:这里分享一套软件测试的自学教程合集。对于在测试行业发展的小伙伴们来说应该会很有帮助。除了基础入门的资源,博主也收集不少进阶自动化的资源,从理论到实战,知行合一才能真正的掌握。全套内容已经打包到网盘,内容总量接近500个G。如需要软件测试学习资料,关注公众号(互联网杂货铺),后台回复1,整理不易,给个关注点个赞吧,谢谢各位大佬!

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/144116.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SM5203 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器

SM5203 1.2A/18V 锂电池线性充电芯片 简介: SM5203 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器,并带有锂电池正负极反接保护功能,可以保护芯片和用户安全。由于采用了内部 PMOSFET 架构,加上防倒充电路&#xff…

前端开发人员应该知道的低代码系统知识和开源低代码开发平台

前端开发有多重要 前端一般指前端开发,主要是通过各种前端技术及工具进行产品界面开发,制定标准化代码,另外还要在页面增加交互的动态功能,通过技术改善用户体验,使得Web界面可以更友好的与用户互动。 前端开发是创建…

劲松HPV防治诊疗中心谭巍主任建议:这样锻炼可促使hpv转阴

锻炼可以帮助我们提升身体素质,也有利于身体健康,然而锻炼对于促进HPV转阴也有一定帮助,但并不是唯一的有效方法,即便如此锻炼仍然在hpv转阴方面发挥着一定作用。以下是一些建议,希望可以帮助你通过锻炼来促进HPV转阴&…

【python】Django——templates模板、静态文件、django模板语法、请求和响应

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 templates模板按app顺序寻找模板全局模板 静态文件jqueryBootstrap dja…

C语言--数组的长度计算【详细解释】

一.数组的长度计算公式 我们都知道字符串有特定的函数strlen,而数组没有,(虽然字符串也是一种特殊的数组) 但是,类似于这样的数组: int arr[]{12,89,1,5,31,78,45,12,12,0,45,142,21,12}; 我们很难一眼…

浏览器存储(localStorage和sessionStorage)

我们知道 js 写的效果,每次刷新都是从新执行,是不存在记录操作的,主要是大部分的效果不需要这样的处理 (一个 tab 切换,焦点图肯定不需要记住运行到哪里,刷新从新开始就好了)! 在 html5 之前,前…

DDR SDRAM 学习笔记

一、基本知识 1.SDRAM SDRAM : 即同步动态随机存储器(Synchronous Dynamic Random Access Memory), 同步是指其时钟频率与对应控制器(CPU/FPGA)的系统时钟频率相同,并且内部命令 的发送与数据传输都是以该时钟为基准…

gin索引 btree索引 gist索引比较

创建例子数据 postgres# create table t_hash as select id,md5(id::text) from generate_series(1,5000000) as id; SELECT 5000000postgres# vacuum ANALYZE t_hash; VACUUMpostgres# \timing Timing is on. postgres# select * from t_hash limit 10;id | …

八个开源免费单点登录(SSO)系统

使用SSO服务可以提高多系统使用的用户体验和安全性,用户不必记忆多个密码、不必多次登录浪费时间。下面推荐一些市场上最好的开源SSO系统,可作为商业SSO替代。 单点登录(SSO)是一个登录服务层,通过一次登录访问多个应…

做外贸一个小失误可能会带来大的损失

在外贸里,虽然很多事情都是不可控的,但是我们还是需要做好自己该做的事情,将危险和不可控降低到最低的程度。那如何能够降低到最低呢? 比如在做合同,发票或者单据的时候,我们可能会喜欢依照公司固定的模板…

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

【iOS】将网络请求封装在一个单例类Manager中(AFNetworking、JSONModel)

项目开发中会请求大量不同的API,若将网络请求三板斧直接写在Controller中会代码十分冗杂,干脆直接将AFNetWorking和JSONModel封装到一个全局的Manager单例类中,在Manager类中进行网络请求和数据解析 导入AFNetworking和JSONModel 参考【iOS…

linux查看端口占用情况

lsof命令 lsof(list open files)命令可以列出当前系统中打开的所有文件,包括网络端口。可以使用lsof命令查看某个端口被哪个进程占用。 具体的命令为:sudo lsof -i :端口号,其中端口号为需要查询的端口号。 netstat命令 使用netstat命令&a…

很全的家政小程序功能开发攻略;

随着互联网的发展,家政行业也逐步走向数字化。为了满足用户的需求,家政APP的开发成为了热门趋势。那么,如何定制开发一款家政APP呢?下面将为大家详细介绍。 1. 明确需求:首先需要明确家政APP的功能,包括预约…

SAP 事件:SET PF-STATUS 和AT LINE-SELECTION共用

Write List中,如果同时使用了SET PF-STATUS 和 AT LINE-SELECTION,会发现双击的时候不好用了! 怎么办?其实,只要设置F2功能键”PICK”就OK了。 2007年12月11日修改: 如图: 例: REPORT z_barry_test_pic…

中海达为第七届全国水文勘测技能大赛保驾护航

11月6日至11日,第十届全国水利行业职业技能竞赛暨第七届全国水文勘测技能大赛在广东韶关成功举办。作为本次大赛相关设备技术保障团队,中海达积极提供全方位的技术支持和保障服务,助力大赛顺利进行。 ▲开幕式现场 全国水文勘测技能大赛自199…

【入门Flink】- 11Flink实现动态TopN

基本处理函数(ProcessFunction) stream.process(new MyProcessFunction())方法需要传入一个 ProcessFunction 作为参数,ProcessFunction 不是接口 , 而是一个抽象类 ,继承了AbstractRichFunction,所有的处…

墓园殡仪馆服务预约小程序的作用

生老病死是人之常情,也是每个人需要面对的,墓园作为生活服务行业里特殊的细分类别,往往不被人提起,但又有很高的需求度,几乎可以说每天都有大小生意,比如殡葬用品、祭扫预约、位置服务等。 对墓园管理公司而…

新能源充电桩物联网应用之工业4G路由器

新能源充电桩是智慧城市建设中不可缺少且可持续发展的重要设施,而工业4G路由器物联网应用为其提供了更加高效、智能、实时的管理方式。充电桩通过工业4G路由器可以与充电运营商的管理中心建立稳定的连接,实现双向数据传输,为用户提供优质的充…

深度学习 机器视觉 车位识别车道线检测 - python opencv 计算机竞赛

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) …