Web自动化测试框架+PO模式分层实战(超细整理)

前言

PO模式

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

优势:
创建可以跨越多个测试用例共享的代码;
减少重复代码的数量;
如果用户界面发生变更后,只需要在一个地方维护就可以了;

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

 

说明:
base:基础层,主要编写底层定位元素的类,它是一个包。
common:公共类,里面编写公共使用到的方法。
config:配置文件存储目录。
data:存储测试使用到测试数据。
page:对象层,编写具体的业务逻辑,把页面每一个操作行为单独的写一个方法或者是函数。
report:测试报告目录,主要用来存放测试报告。
test:测试层,里面主要是测试模块,也可以说是每个测试的场景的代码。
utils:工具类,存放工具,如文件处理、说明文档等。
run:运行层:整个自动化测试的运行目录。

页面对象设计模式

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

 

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]

2、page对象层
在这一层的类直接继承了基础层的类,以类属性的方法指明每个操作元素属性的值,然后依据操作步骤编写对应的方法。

比如关于登录的操作:输入用户名、输入密码,点击登录,获取文本的信息操作会在实例中实现的登录操作,然后把每个登录操作封装成一个方法,这样实现登录测试用例直接调用,返回失败信息—其中形式参数会在测试层赋值

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

from base.base import *
from selenium.webdriver.common.by import By

class Sina(WebUI):
    username_loc=(By.ID,'freename')
    password_loc=(By.ID,'freepassword')
    login_loc=(By.CLASS_NAME,'loginBtn')
    userError_loc=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
    passError_loc=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[2]')



    def inputUserName(self,username):
        self.findElement(*self.username_loc).send_keys(username)

    def inputPassWord(self,password):
        self.findElement(*self.password_loc).send_keys(password)


    def clickLogin(self):
        self.findElement(*self.login_loc).click()

    def login(self,username,password):
        self.inputUserName(username=username)
        self.inputPassWord(password=password)
        self.clickLogin()

    def getUserError(self):
        return self.findElement(*self.userError_loc).text

    def getPassError(self):
        return self.findElement(*self.passError_loc).text

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

注意:
在编写用例的时候需要添加备注信息,明确表示该用例是测试的哪个点,验证的哪个场景;
测试模块都是以test_开头,测试方法也是以test_开头的;

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)

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

在data下创建json文件

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

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

import os

def base_dir():
	return os.path.dirname(os.path.dirname(__file__))
 	# print(base_dir())

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

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

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

import os
from common.public import base_dir
import json

def readJson():
    return json.load(open(file=os.path.join(base_dir(),'data','sina.json'),encoding='utf-8'))

B6

7、config层
配置文件存储目录

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

测试报告:

import time
# 时间
import unittest
# 加载测试模块
import os
# 处理路径
import HTMLTestRunner
# 生成测试报告必须要用的库
def getSuite():
    # start_dir=加载所有的测试模块来执行,pattern=通过正则的模式加载所有的模块
    '''获取所有执行的测试模块'''
    suite = unittest.TestLoader().discover(
        start_dir=os.path.dirname(__file__),
        pattern='test_*.py'
    )
    return suite

# 获取当前时间
def getNowtime():
    return time.strftime("%y-%m-%d %H_%M_%S",time.localtime(time.time()))

# 执行获取的测试模块,并获取测试报告
def main():
    filename=os.path.join(os.path.dirname(__file__),'report',getNowtime()+"report.html")
    # 把测试报告写入文件中,b是以二进制的方式写入
    fp=open(filename,"wb")
    # HTMLTestRunner实例化的过程,stream是流式写入,title是测试报告的标题,description是对测试报告的描述
    runner=HTMLTestRunner.HTMLTestRunner(
        stream=fp,
        title="UI自动化测试报告",
        description="UI自动化测试报告"
    )
    runner.run(getSuite())
if __name__=="__main__":
    main()

9、report层
主要用于存放测试报告

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

 

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

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

相关文章

快速搭建rtsp server(Ubuntu)

在现代视频监控和实时视频流媒体应用中,实时流协议(RTSP)服务器扮演着至关重要的角色。无论是家庭安防系统、企业级监控还是流媒体服务,RTSP服务器都能提供高效、稳定的解决方案。然而,对于许多初学者或开发者来说&…

【自定义View】Android圆饼进度条

源码 自定义属性 <?xml version"1.0" encoding"utf-8"?> <resources><declare-styleable name"ArcProgressView"><attr name"android:textSize" /><attr name"bgBorderWidth" format"d…

优雅谈大模型10:MoE

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

【Python】教你彻底认识Python中的Web开发

​​​​ 文章目录 一、Web开发的基本概念1. Web服务器2. 客户端-服务器模型3. HTTP协议4. 前端与后端 二、常用的Web开发框架1. Django1.1 安装Django1.2 创建Django项目1.3 定义模型1.4 定义视图1.5 定义URL路由1.6 模板 2. Flask2.1 安装Flask2.2 创建Flask应用2.3 模板2.4…

组装服务器重装linux系统【idrac集成戴尔远程控制卡】

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

学习anjuke的过程

一、抓包 先看看12.25.1版本的APP是不是还能使用&#xff0c;如果还能使用我们就先破解低版本的。打开APP后发现还能正常使用&#xff0c;因为低版本的难度低我们就破解这个版本。低版本和高版本的算法是一样的&#xff0c;算法破解之后我们后续抓包替换接口就行了。手机安装上…

重生之 SpringBoot3 入门保姆级学习(17、整合SSM)

重生之 SpringBoot3 入门保姆级学习&#xff08;17、整合SSM&#xff09; 4、数据访问4.1 整合 ssm 4、数据访问 4.1 整合 ssm pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" …

哪吒监控+cfcdn+ 反代grp端口

哪吒监控cfcdn 反代grp端口 背景&#xff1a; 哪吒监控&#xff1a;感觉VPS线路不稳定&#xff0c;为了打消自己潜意识&#xff0c;希望量化延迟。 cfcdn&#xff1a;隐藏真实站点&#xff0c;保障小鸡隐秘安全 反代grpc端口: 反代grpc到支持https(TLS)的端口&#xff0c;这…

ESP32 Error creating RestrictedPinnedToCore

随缘记&#xff0c;刚遇到&#xff0c;等以后就可能不想来写笔记了。 目前要使用到音频数据&#xff0c;所以去用ESP-ADF&#xff0c;但在使用例程上出现了这个API有问题&#xff0c;要去打补丁。 但是我打补丁的时候git bash里显示not apply&#xff0c;不能打上。 网上看到…

OpenCV学习(4.4) 平滑图像

1.目的 在本教程中将学习&#xff1a; 用各种低通滤波器模糊图像。对图像应用自定义过滤器&#xff08;二维卷积&#xff09;。 在图像处理中&#xff0c;平滑图像是一种去噪和模糊技术&#xff0c;用于减少图像中的噪声和细节&#xff0c;使得图像看起来更加平滑。平滑处理…

2024百度之星 跑步

原题链接&#xff1a;码题集OJ-跑步 题目大意&#xff1a;一个n个人在绕圈跑&#xff0c;第i个人跑一圈的时间是i分钟&#xff0c;每二个人位置相同就会打一次招呼&#xff0c;如果同时来到终点&#xff0c;他们就会停下来&#xff0c;请问会打多少次招呼&#xff1f; 思路&a…

文字生成视频!又一王炸!!!(且免费使用!)

VIVA王炸 开场 “ 生成令人惊叹的AI视频&#xff0c;再加上4K视频增强和初学者友好的自动提示优化&#xff0c;为您提供无与伦比的视频创作体验。” 直抒胸臆 自从sora的出现&#xff0c;开启了人工智能的有一个阶段。VIVA是现在唯数不多的与OpenAI的sora互相抗衡。也是为数…

记录遇见的小问题

1&#xff0c;angularjs 使用bootstrap时&#xff0c;遇见模态框怎么点击空白处不关闭&#xff1b; <div id"dialog-modal" data-backdrop"static" data-keyboard"false"> 但是在实际使用过程中调用了一个html 需要在 js里加 $scope.Up…

C语言杂谈:函数栈帧,函数调用时到底发生了什么

我们都知道在调用函数时&#xff0c;要为函数在栈上开辟空间&#xff0c;函数后续内容都会在栈帧空间中保存&#xff0c;如非静态局部变量&#xff0c;返回值等。这段空间就叫栈帧。 当函数调用&#xff0c;就会开辟栈帧空间&#xff0c;函数返回时&#xff0c;栈帧空间就会被释…

基于SSM的“健身俱乐部网站”的设计与实现(源码+数据库+文档)

基于SSM的“健身俱乐部网站”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 用户注册界面图 系统登录界面 添加管理员账户界面…

RPA-UiBot6.0数据整理机器人—杂乱数据秒变报表(内附RPA师资培训课程)

前言 友友们是否常常因为杂乱的数据而烦恼&#xff1f;数据分类、排序、筛选这些繁琐的任务是否占据了友友们的大部分时间&#xff1f;这篇博客将为友友们带来一个新的解决方案&#xff0c;让我们共同学习如何运用RPA数据整理机器人&#xff0c;实现杂乱数据的快速整理&#xf…

[ZJCTF 2019]NiZhuanSiWei、[HUBUCTF 2022 新生赛]checkin、[SWPUCTF 2021 新生赛]pop

目录 [ZJCTF 2019]NiZhuanSiWei [HUBUCTF 2022 新生赛]checkin 1.PHP 关联数组 PHP 数组 | 菜鸟教程 2.PHP 弱比较绕过 PHP 类型比较 | 菜鸟教程 [SWPUCTF 2021 新生赛]pop [ZJCTF 2019]NiZhuanSiWei BUUCTF [ZJCTF 2019]NiZhuanSiWei特详解&#xff08;php伪…

[word] word怎样转换成pdf #职场发展#经验分享#职场发展

word怎样转换成pdf word怎样转换成pdf&#xff1f;word格式是办公中常会用到的格式&#xff0c;word格式编辑好了要想转换成pdf格式再来传输的话需要怎么操作呢&#xff1f;小编这就给大家分享下操作方法&#xff0c;一起来学习下吧&#xff01; 1、安装得力PDF转换器&#x…

C语言 io-文件拷贝

#include <stdio.h> int main(int argc, const char *argv[]) {//1文件拷贝到2文件FILE* fileAfopen(argv[1],"r");FILE* fileBfopen(argv[2],"w");if(NULLfileA){perror("fopen");return -1;}if(NULLfileB){perror("fopen");re…