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


封装与调用

函数与参数化

前言

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

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

登录函数


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

登录函数传三个参数,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 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便。

接口封装

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

接口封装好了后,后面我们写用例那就直接调用封装好的接口就行了,有些参数,可以参数化,如保存草稿的 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()

用例导入接口

  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.运行结果:

 


最后我邀请你进入我们的软件测试学习交流群:785128166, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

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

这些资料,对于从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

关注【公众号:豆子熊】免费领取!

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值