Python自动化测试框架封装和调用
- ?📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ?留言 📝 如有错误敬请指正!
- 📢交流讨论:欢迎加入我们一起学习!
- 📢资源分享:耗时200+小时精选的「软件测试」资料包
- 📢 软件测试学习教程推荐:火遍全网的《软件测试》教程
封装与调用
函数与参数化
前言
面实现了参数的关联,那种只是记流水账的完成功能,不便于维护,也没什么可读性,接下来这篇可以把每一个动作写成一个函数,这样更方便了。
参数化的思维只需记住一点:不要写死
登录函数
1.s 参数是 session 的一个实例类,先放这里,方便写后面代码
登录函数传三个参数,s 是需要调用前面的session 类,所以必传,可以传个登录的 url,然后 payload 是账号和密码
保存草稿
-
编辑内容的标题 title 和正文 body_data 参数化了,这样后面可以方便传不同值
-
这里返回了获取到新的 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 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便。
接口封装
有些接口经常会用到比如登录的接口,这时候我们可以每个接口都封装成一个方法,如: 登录、保存草稿、发帖、删帖,这四个接口就可以写成四个方法
接口封装好了后,后面我们写用例那就直接调用封装好的接口就行了,有些参数,可以参数化,如保存草稿的 title 和 body 两个参数是动态的。
像这种流程类的接口,后面的会依赖前面的,就可以用 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()
用例导入接口
-
导入上面 login.py 模块写的接口
?
-
用例自己随便设计,参考如下:
# 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.运行结果:
?
最后我邀请你进入我们的软件测试学习交流群:785128166, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
?
这些资料,对于从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
关注【公众号:豆子熊】免费领取!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!