【建议收藏】自动化测试框架开发教程

在自动化测试项目中,为了实现更多功能,我们需要引入不同的库、框架

首先,你需要将常用的这些库、框架都装上。

pip install requests
pip install selenium
pip install appium
pip install pytest
pip install pytest-rerunfailures
pip install allure-pytest
...

 然后,在项目中使用他们。

import pytest
import yagmail
from selenium import webdriverclass MyTest:def setup(self):self.browser = webdriver.Chrome()def test_case(self):browser.find_element_by_id("user").send_keys("admin")browser.find_element_by_id("pawd").send_keys("admin123")# ...page.close()if __name__ == "__main__":pytest.main(["-s", "-v", "./test_case.py","--html", "./test_report.html","--reruns", "3"])yagmail.SMTP()# ...

设计与封装

例如上面的自动化项目代码,我们写多了之后,就会发现常用的库就是那么几个,而且用法大同小异,俗称样板代码。

这个时候你就可以考虑去做一些封装,然后把那些常用的功能封装成了一堆公共方法,在你的项目代码中调用,这样可以更快速的完成开发任务,并且便于应对需求的变化。

import pytest
from common import mail
from test_data import TestData
from page import LoginPageclass MyTest:def test_case(self, browser):page = LoginPage(browser)page.username.send_keys(TestData.admin)page.passowrd.send_keys(TestData.admin_pawd)# ...page.close()if __name__ == "__main__":pytest.main(["-s", "-v", "./test_case.py","--html", "./test_report.html","--reruns", "3"])mail.SMTP()# ...

自动化测试框架
自动化测试框架和你在项目中封装的公共模块有着一些不同。

它实现的功能更通用:例如,你可以在项目中封装一个登录的公共模块,用于所以用例的登录,但不能在框架里面封装一个登录,因为,你们的项目登录是用账号密码,别人家用的是手机号+验证码,你封装的登录脱离了你的项目就不可用了,显然不应该放到框架里。

它应该是和项目分离:因为它要给更多的人使用,并且不能轻易被修改,因此,它应该是独立安装的,不应该和项目代码混到一起。如果一个框架被使用者轻易的改来改去。请问,如何升级?使用者想体验新的版本怎么办?

它应该有一些设计创新:我可不可以把selenium的get()方法改个名字叫open()封装到自己的框架里。当然可以,如果整个框架都是在把别人的API自己换个名字包一层,这和红芯浏览器有什么区别?

假设我们开发的自动化测试框架叫xtest

首先,需要安装xtest。

pip install xtest

 使用xtest编写测试用例。

import xtest
from xtest import TestData
from page import LoginPageclass MyTest:def test_case(self, browser):page = LoginPage()page.username.send_keys(TestData.user)page.passowrd.send_keys(TestData.pawd)# ...if __name__ == "__main__":xtest.main(mail=True)

它应该以更简单的方式实现更强大的功能。当然,不同类型的框架,难易程度也是不同的,实现一个web框架的所需要知识更多,实现一个机器学习框架就更难了,自动化测试框架是站在一堆人的肩膀上来实现,难度系数要低很多。

最后:【源码领取和还有什么不懂得地方可以点击下方小卡片】

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为GaussDB数据库

Gauss数据库初识_高斯数据库_ygpGoogle的博客-CSDN博客 Redhat 7.6安装GaussDB_100_1.0.1详细攻略_gaussdb_100_1.0.1-database-redhat-64bit.tar.gz dow_博德1999的博客-CSDN博客 https://www.ngui.cc/el/3381579.html?actiononClick 初识GaussDB——GaussDB的发展历程、部…

学习Bootstrap 5的第六天

目录 信息警告框 警告框 实例 警告框链接 实例 关闭警告框 实例 警告框动画 实例 按钮 按钮样式 实例 按钮轮廓 实例 ​编辑按钮尺寸 实例 块级按钮 实例 实例 活动/禁用按钮 实例 加载器按钮 实例 扩展小知识 按钮组 按钮组 实例 实例 垂直按钮组…

python自(2)切片 字典 遍历删除添加修改查询定义函数函数返回值作用域序列化异常报错urllib使用一个类型六个方法下载 视频音频图片

切片 # # 切片# s hello word# # 下标索引为0的 # print(s[0]) #h# # 左闭右开 (左是下标开始的,右是几个索引值)例如从0开始算 4个索引值 # print(s[0:4]) #hell# # 更改起始值的开始位置 # print(s[1:]) #ello word# # 下标结束位置 # p…

DC/DC开关电源学习笔记(七)低压大电流DC/DC变换技术

低压大电流DC/DC变换技术 1. 无暂态要求的低压大电流DC/DC变换技术2. 负载极其快速变化的低压大电流DC/DC变换技术2.1 非隔离型 VRM2.2 隔离型VRM低压大电流高功率 DC/DC 变换技术,已从前些年的 3.3V 降至现在的 1.0V 左右,电流目前已可达到几十安至几百安。同时,电源的输出指标…

动态IP代理是什么?一文看懂动态代理IP

一、什么是动态IP代理? 动态IP代理是一种代理服务,而动态IP是由ISP动态分配给用户的IP地址,这些IP地址会周期性地更改。每次链接互联网时,用户会被分配一个新的IP地址,因而也称为”轮换IP”。 IP地址轮换是一个过程&…

9.8C++作业

1> 自行封装一个栈的类&#xff0c;包含私有成员属性&#xff1a;栈的数组、记录栈顶的变量 成员函数完成&#xff1a;构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 #include <iostream>using namespace std;class…

释放数据价值这道难题,Smartbi V11有解

《未来简史》预言&#xff1a;数据将成为人们未来的信仰。 未来已来&#xff0c;将至已至。如今&#xff0c;数据所扮演的角色与作用超乎想象。从政府将数据要素列入生产要素之中&#xff0c;到数据驱动型业务场景涌现&#xff0c;企业与组织对于数据及其价值的认可度明显提升…

JUC相关面试题

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱发博客的嗯哼&#xff0c;爱好Java的小菜鸟 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;社区论坛&#xff1a;希望大家能加入社区共同进步…

二叉树题目:最大层内元素和

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;最大层内元素和 出处&#xff1a;1161. 最大层内元素和 难度 4 级 题目描述 要求 给定一个二叉树的根结点 ro…

前端vue按钮控制切换按钮是否禁用和颜色和显示隐藏,利用v-if和v-else

效果 未输入input前图片 输入input后图片 html (1) <input type"number" placeholder"请输入分润数量" placeholder-class"shareprofit_placeholder_num" v-model"money"> <!-- 金钱 --> {{money}} <!-- 可提现余额…

Generative Adversarial Nets

Author:龙箬 Computer Application Technology Change the World with Data and Artificial Intelligence ! CSDNweixin_43975035 生命不息&#xff0c;折腾不止 Reference&#xff1a; [1] Goodfellow, I, Pouget-Abadie, J, Mirza, M, Xu, B, Warde-Farley, D, Ozair, S, Co…

【绝㊙️】三年开发内功心得

经典嵌套if-else问题 这个也是老生常谈问题了&#xff0c;不管哪里都能看到。 那如何解决 方法一&#xff08;重要&#xff09;&#xff1a; 如果逻辑分支过多&#xff0c; 即使你不解决嵌套if-slse&#xff0c;至少也要把每个 if的{}里的逻辑抽到一个独立的方法或者工具类…

Vue中extend基本用法

1.Vue.extend(options) 参数: {Object} options用法&#xff1a; 使用基础Vue构造器&#xff0c;创建一个"子类"。参数是一个包含组件选项的对象。 data选项是特例&#xff0c;需要注意&#xff0c;在Vue.extend()中它必须是函数。 <html><head><tit…

Unity中Shader抓取屏幕并实现扭曲效果(优化)

文章目录 前言一、在之前顶点着色器的输入中&#xff0c;放弃了使用结构体传入&#xff0c;而是直接从应用程序阶段传入参数&#xff0c;这样写的话&#xff0c;对于程序来说&#xff0c;不方便扩张&#xff0c;所以需要对其进行修改实现1、定义结构体用于传入顶点坐标系2、因为…

离散数学 学习 之 一阶逻辑基本概念 ( 四 )

好好理解这个 代换实例&#xff0c;每个 谓词公式 都替换一个 命题公式 在蕴含式 中 &#xff0c;只有前式 为 假 &#xff0c;后式 为 真&#xff0c;这个式才是假的 &#xff0c;可以利用 这个进行判断 找个 成真解释 &#xff0c;找个 成假 解释 不能 替换 才去 找 解释 &…

C++信息学奥赛1171:大整数的因子

该程序是一个寻找能够整除输入数字的最小正整数的程序。下面是代码的逻辑解析&#xff1a; #include <iostream> #include <string> #include <cstring>using namespace std;int main() {string n; // 定义一个字符串变量nint fale 0; // 用于标记是否能…

C++学习笔记二(堆栈、指针、命名空间、编译步骤)

C 1、堆和栈2、指针2.1、指针的本质2.2、指针的意义2.3、清空指针2.4、常量指针和指针常量2.4.1、常量指针&#xff08;const int *p;&#xff09;2.4.2、指针常量&#xff08;int *const p;&#xff09; 2.5、C类中的this 3、malloc and new4、命名空间4.1、创建命名空间4.2、…

使用nvm管理node.js

使用nvm管理node.js 一、简介 nvm是一个node的版本管理工具。可以在多种系统上管理Node.js 版本的工具。使用 NVM&#xff0c;可以轻松地切换不同版本的Node.js&#xff0c;并方便地管理不同版本的全局包和本地包。 二、安装与下载 1.删除原有node.js 首先需要卸载已安装的…

[BJDCTF2020]ZJCTF,不过如此 preg_replace /e模式漏洞

目录 preg_replace的/e模式 为什么要变为 {${phpinfo()}} 另一个方法 版本 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream")){echo &qu…

PlantUML——类图(持续更新)

前言 在分析代码流程中&#xff0c;我们常常会使用到各种UML图&#xff0c;例如用例图、时序图和类图等&#xff0c;以往使用ProcessOn或亿图图示等工具&#xff0c;但是这些工具难以规范化&#xff0c;有没有一种用代码来生成图形的工具呢&#xff1f; 刚好在出差的晨会中机缘…