Python自动化测试框架封装和调用

news2024/11/24 22:30:43

封装与调用

函数与参数化

前言

面实现了参数的关联,那种只是记流水账的完成功能,不便于维护,也没什么可读性,接下来这篇可以把每一个动作写成一个函数,这样更方便了。

参数化的思维只需记住一点:不要写死

登录函数

1.s 参数是 session 的一个实例类,先放这里,方便写后面代码

  1. 登录函数传三个参数,s 是需要调用前面的session 类,所以必传,可以传个登录的 url,然后 payload 是账号和密码

保存草稿

  1. 编辑内容的标题 title 和正文 body_data 参数化了,这样后面可以方便传不同值

  1. 这里返回了获取到新的 url 地址,因为后面的 postid 参数需要在这里提取

提取 postid

1.这里用正则表达式提取url 里面的 postid

删除草稿

1.传个 url 和postid 就可以了

参考代

# coding:utf-8 import requests 
 

 
def login(s, url, payload): '''登录''' 
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0", 
               "Accept": "application/json, text/javascript, */*; q=0.01", 
               "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", 
               "Accept-Encoding": "gzip, deflate, br", 
               "Content-Type": "application/json; charset=utf-8", 
               "X-Requested-With": "XMLHttpRequest", 
               "Content-Length": "385", 
               "Cookie": "xxx 已省略", 
               "Connection": "keep-alive" 
               } 
    r = s.post(url, json=payload, headers=headers, verify=False) 
    result = r.json() 
  print result 
    return result['success'] # 返 回 True 或 False def save_box(s, url2, title, body_data): 
    '''# 获取报存之后url 地址''' 
    body = {" VIEWSTATE": "", 
        " VIEWSTATEGENERATOR": "FE27D343", 
        "Editor$Edit$txbTitle": title, 
        "Editor$Edit$EditorBody": "<p>"+body_data+"</p>", 
        "Editor$Edit$Advanced$ckbPublished": "on", 
        "Editor$Edit$Advanced$chkDisplayHomePage": "on", 
        "Editor$Edit$Advanced$chkComments": "on", 
        "Editor$Edit$Advanced$chkMainSyndication": "on", 
        "Editor$Edit$lkbDraft": "存为草稿", 
        } 
 r2 = s.post(url2, data=body, verify=False) 
    print r2.url 
    return r2.url def get_postid(u): 
    '''正则提取 postid''' 
    import re 
    postid = re.findall(r"postid=(.+?)&", u) 
    print postid # 这里是 list 
    if len(postid) < 1: 
        return '' 
    else: 
        return postid[0] 
def delete_box(s,url3, postid): 
    '''删除草稿箱'''   json3 = {"postId": postid} 
r3 = s.post(url3, json=json3, verify=False) 
    print r3.json() 
if name == " main ": 
    url = "https://passport.cnblogs.com/user/signin" 
    payload = { 
                "input1": "xxx", 
                "input2": "xxx", 
                "remember": True 
               } 
    s = requests.session() 
    login(s, url, payload) 
    url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1" 
    u = save_box(s, url2, "标题", "正文内容") 
 postid = get_postid(u) 
    url3 = "https://i.cnblogs.com/post/delete" 
    delete_box(s, url3, postid) 

流程类接口关联

前言:

流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便。

接口封装

  1. 有些接口经常会用到比如登录的接口,这时候我们可以每个接口都封装成一个方法,如: 登录、保存草稿、发帖、删帖,这四个接口就可以写成四个方法

  1. 接口封装好了后,后面我们写用例那就直接调用封装好的接口就行了,有些参数,可以参数化,如保存草稿的 title 和 body 两个参数是动态的。

  1. 像这种流程类的接口,后面的会依赖前面的,就可以用 session 关联起来4.保存以下脚本login.py

# coding:utf-8 import requests 
# 禁用安全请求警告 

from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning)  class Blog(): 
   def init (self, s): 

# s = requests.session() # 全局参数 

       self.s = s 

   def login(self): 

       '''登录接口''' 

       url = "https://passport.cnblogs.com/user/signin" 

       header = {#"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0", 
       # "Accept": "application/json, text/javascript, */*; q=0.01", 

       # "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", 

       # "Accept-Encoding": "gzip, deflate, br", 

               # "Content-Type": "application/json; charset=utf-8", 

               #"VerificationToken": "xxx 已省略", 
 

 
               "Cookie":"xxx 已省略", 

               "X-Requested-With":"XMLHttpRequest", # "Connection":"keep-alive", 
               # "Content-Length":"385" 

       } 

       json_data = {"input1":"账号", 

               "input2":"密码", 

               "remember": False} 

       res = self.s.post(url, headers=header, json=json_data, verify=False) 

       result1 = res.content # 字节输出 

       print result1 

       return res.json() 

   def save(self, title, body): 

       '''保存草稿箱: 

       参数 1:title # 标题 

       参数 2:body # 中文''' 

       url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1" 

       d = {" VIEWSTATE": "", 

           " VIEWSTATEGENERATOR":"FE27D343", 

           "Editor$Edit$txbTitle":title, 

           "Editor$Edit$EditorBody":"<p>%s</p>"%body, 

           "Editor$Edit$Advanced$ckbPublished":"on", 

           "Editor$Edit$Advanced$chkDisplayHomePage":"on", 

           "Editor$Edit$Advanced$chkComments":"on", 

           "Editor$Edit$Advanced$chkMainSyndication":"on", 

           "Editor$Edit$lkbDraft":"存为草稿", 

            } 

       r2 = self.s.post(url2, data=d, verify=False) #保存草稿箱 

       print r2.url 
 

 
return r2.url 

   def get_postid(self, r2_url): 

       '''正则表达式提取''' 

       import re 

       postid = re.findall(r"postid=(.+?)&", r2_url) 

       print postid # 这里是 list [] 

       #  提取为字符串 

       print postid[0] 

       return postid[0] 

   def del_tie(self, postid): 

       '''删除帖子''' 

       del_json = {"postId": postid} 

       del_url = "https://i.cnblogs.com/post/delete" 

       r3 = self.s.post(del_url, json=del_json, verify=False) 

 print r3.json()["isSuccess"] 

       return   r3.json() if name == " main ": 
   s = requests.session() 

   Blog(s).login()

用例导入接口

  1. 导入上面 login.py 模块写的接口

  1. 用例自己随便设计,参考如下:

# coding:utf-8 import unittest import requests 
from blog.login import Blog class Test(unittest.TestCase): 
   def setUp(self): 

       s = requests.session() 

       self.blog = Blog(s) 

   def test_login(self): 

       result = self.blog.login() 

       print result 

       print type(result) 

       print result["success"] # 登录,获取结果 

       self.assertEqual(result["success"] , True)  # 拿结果断言def test_del(self): 
       # 第一步:登录 

       self.blog.login() 

       # 第二步:保存 
 

 
       r2_url = self.blog.save(title="12121", body="WQASDAS") 

       pid = self.blog.get_postid(r2_url) 

       # 第三步:删除 

       result = self.blog.del_tie(pid) 

       self.assertEqual(result["isSuccess"], True) if name == " main ": 
  unittest.main() 

3.运行结果:

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

电商项目实战

web测试项目

web+App+h5+小程序 测试项目

接口自动化测试实战项目

Linux实战项目

面试资料

我们进阶学习自动化测试必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

以上资料,对于想要测试进阶的朋友们来说应该会很有帮助,需要的小伙伴可以后台私信找我免费领取。

总结

我见过很多leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了好几年,更夸张的是7、8年工作内容的重复性比较高,没有什么技术含量的工作。

凡事要趁早,特别是技术行业,一定要提升技术功底,丰富自动化项目实战经验,这对于你未来几年职业规划,以及测试技术掌握的深度非常有帮助。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[黑马程序员SSM框架教程]04 IOC-入门案例

1.IOC入门案例思路分析 管什么?管bean&#xff08;service和dao&#xff09;如何将被管理的对象告知IOC容器?&#xff08;配置&#xff09;被管理的对象交给IOC容器&#xff0c;如何获取到IOC容器&#xff1f;(提供了个接口)如何获取到IOC中的bean&#xff1f;&#xff08;接…

Kubernetes Nginx 发布

kubernetes发布nginx 目录 Nginx Pod启动Service访问Nginx 2.1. NodePort访问Nginx 2.2. ClusterIP访问Nginx 2.3. LoadBalancer访问Nginx 2.4. ExternalName访问NginxDeployment方式部署Nginx 3.1 Nginx Replicas Nginx Pod 启动 nginx-v1.yaml apiVersion: v1 kind: Pod…

基于SPI的增强式插件框架设计

很久之前&#xff0c;为了诊断线上的问题&#xff0c;就想要是能有工具可以在线上出问题的时候&#xff0c;放个诊断包进去马上生效&#xff0c;就能看到线上问题的所在&#xff0c;那该是多么舒服的事情。后来慢慢的切换到 java 领域后&#xff0c;这种理想也变成了现实&#…

Maven中开源的报表平台组件(自带页面+直连数据库)

借鉴的网址&#xff1a;https://www.w3cschool.cn/ureport/

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。

前言 秒杀和高并发是面试的高频考点&#xff0c;也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目&#xff0c;提交PR&#xff0c;提高竞争力。早日上岸&#xff0c;升职加薪。 知识点详解 秒杀系统架构图 秒杀流程图 秒杀系统设计 这篇文章一万多字&#xff0c;…

PDMS二次开发(一)——PML类型程序类型与概念

目录前言一、PML类型与概念基础知识变量函数小例子注释PML表达式条件判断语句循环skip和break窗口程序在PDMS菜单栏中添加程序窗口自动定位PML常见控件前言 PDMS二次开发需要.net 有自带的PML语言和C# .net一般通常泛指的是C#语言 模型数据借助.NET的接口可以转换成数据库中的…

达梦8数据守护动态增加实时备库

实时主备环境 类型 业务IP 库名 实例名 PORT_NUM MAL_HOST MAL_INST_DW_PORT MAL_PORT MAL_DW_PORT 主库dm8p 192.168.1.223 DAMENG GRP1_RT_01 5236 10.0.0.223 45101 55101 65101 备库dm8s 192.168.1.224 DAMENG GRP1_RT_02 5236 10.0.0.224 45121…

模拟电路知识点总结(详细版)-- PN结

一、半导体&#xff1a;介于绝缘体和导体之间 二、本征半导体&#xff1a;纯净的半导体 1.晶体结构&#xff1a;正四面体 2.载流子&#xff1a; 本征激发:逃离共价键的束缚&#xff0c;成为自由电子 (本征半导体的本征激发&#xff0c;通常是由温度引起的晶体结构内部的共价键断…

免费基于springboot的OA自动化办公系统,挺漂亮的

大家好&#xff0c;我是锋哥&#xff0c;看到一个不错的springboot的OA自动化办公系统&#xff0c;分享下哈。 项目介绍 这是一个OA办公自动化系统&#xff0c;使用Maven进行项目管理&#xff0c;基于springboot框架开发的项目&#xff0c;mysql底层数据库&#xff0c;前端采…

GEE学习笔记 五十五:GEE编辑器绘制样本点的一个bug(官方在5.1给出反馈已经修复相关bug)

在做地物分类的时候我们会采用GEE在线采集样本方式&#xff0c;但是这个有一个问题需要注意&#xff0c;如果直接使用绘制矩形和点会将点变为 ee.Geometry.Point([xxx], null, false) 这种形式。出现的问题步骤如下&#xff1a; 1、绘制一个点和一个矩形 2、修改geometry为fea…

持续事务管理过程中的事件驱动

比较官方的定义&#xff1a;事件驱动是指在持续事务管理过程中&#xff0c;进行决策的一种策略&#xff0c;即跟随当前时间点上出现的事件&#xff0c;调动可用资源&#xff0c;执行相关任务&#xff0c;使不断出现的问题得以解决&#xff0c;防止事务堆积。在计算机编程、公共…

WPF五种布局

GridGrid为WPF中最常用的布局容器, 作为View中的主要组成部分, 负责框架中整体的页面布局。标签含义ShowGridLines可以设置行业的边距线的显示Grid. RowDefinitions可以创建任意行, 进行固定高度与百分比高度设置Grid. ColumnDefinitions可以创建任意列, 进行固定宽度与百分宽度…

二氧化碳地质封存技术应用前景及模型构建实践方法与讨论

2022年七月七日&#xff0c;工业和信息化部、发展改革委、生态环境部关于印发工业领域碳达峰实施方案的通知落地。全国各省份积极响应&#xff0c;纷纷出台地方指导文件&#xff0c;标志着我国碳减排事业的全面铺开。二氧化碳地质封存技术作为实现我国“双碳”目标的重要一环&a…

量化策略——准备4 python量化因子测算绘图

文章目录因子测算框架1. 预处理股票数据2. 指标测算3. 测算结果整理4. 结果绘图量化因子的测算通常都是模拟交易&#xff0c;计算各种指标&#xff0c;其中&#xff1a;测算需要用到的第三方库&#xff1a;numpy&#xff0c;pandas&#xff0c;talib绘图需要用到的第三方库&…

研报精选230223

目录 【行业230223开源证券】计算机&#xff1a;政策节奏超预期&#xff0c;数据要素市场加速发展【个股230223光大证券_鲁商发展】投资价值分析报告&#xff1a;剥离地产业务、战略转型大健康产业&#xff0c;化妆品“国货之光”待发力【个股230223华安证券_国际医学】综合医疗…

数据库恢复技术

一&#xff0c;事务的基本概念 1.事务 事物是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的工作单位。 事物和程序是两个概念。一般的讲&#xff0c;一个程序中包含多个事物。 事物的开始与结束可以由用户…

瓴羊Quick BI智能报表,轻松搞定复杂“中国式报表”

随着企业的不断成长&#xff0c;内部管理、运营所需的报表往往越做越复杂。不管是对一个职场新人&#xff0c;还是专业的数据分析人员来说&#xff0c;制作复杂的“中国式报表”都是一件让人很痛苦的事。正因如此&#xff0c;越来越多的企业开始使用瓴羊Quick BI智能报表&#…

FPGA纯verilog代码实现H.264/AVC视频解码,提供工程源码和技术支持

目录1、前言2、硬件H.264/AVC视频解码优势3、vivado工程设计架构4、代码架构分析5、vivado仿真6、福利&#xff1a;工程代码的获取1、前言 本设计是一种verilog代码实现的低功耗H.264/AVC解码器(baseline )&#xff0c;硬件ASIC设计&#xff0c;不使用任何GPP/DSP等内核&#…

最新Python异步编程详解

我们都知道对于I/O相关的程序来说&#xff0c;异步编程可以大幅度的提高系统的吞吐量&#xff0c;因为在某个I/O操作的读写过程中&#xff0c;系统可以先去处理其它的操作&#xff08;通常是其它的I/O操作&#xff09;&#xff0c;那么Python中是如何实现异步编程的呢&#xff…

Python每日一练(20230223)

目录 1. 合并区间 2. 单词接龙 3. N皇后 附录&#xff1a;回溯算法 基本思想 一般步骤 1. 合并区间 难度&#xff1a;★★ 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回…