python自动化笔记

一、Request库使用

1、概述

进行接口测试需要发送HTTP请求,python最基础的HTTP库有Urllib、Httplib2、Requests、Treq等,这里我们推荐使用Request库来进行接口测试。
Requests基于urllib,采用Apache2 Licensed开源协议的HTTP库。它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求,目前很多python爬虫也使用Requests库。
功能特性

  • keep-Alive & 连接池
  • 国际化域名和URL
  • 带持久Cookie的会话
  • 浏览器式的SSL认证
  • 自动内容解码
  • 基本/摘要式的身份认证
  • 优雅的key/value Cookie
  • 自动解压
  • Unicode响应体
  • HTTP(S)代理支持
  • 文件分块上传
  • 流下载
  • 连接超时
  • 分块请求
  • 支持.netrc(用户配置脚本文件)

2、Requests安装

使用pip安装命令如下:

pip install requests

安装检测
打开cmd窗口,输入python然后导入requests如果安装成功没有任何提示

import requests

3、Requests基础应用

发送不同类型HTTP请求
requests库内置了不同的方法来发送不同类型的http请求,用法如下图所示:
request_basic.py

import requests

base_url='http://httpbin.org/'

#发送GET类型的请求
r=requests.get(base_url+'/get')
print(r.status_code)

#发送post类型的请求
r=requests.post(base_url+'/post')
print(r.status_code)

#发送put类型的请求
r=requests.put(base_url+'/put')
print(r.status_code)

#发送delete类型的请求
r=requests.delete(base_url+'/delete')
print(r.status_code)

执行结果,200是状态码表示发送请求成功。

4、参数传递

传递URL参数
一般在GET请求中我们使用查询字符串(query string)来进行参数传递,在requests库中使用方法如下:
request_basic.py

import requests

base_url='http://httpbin.org'

param_data={'user':'zxw','password':'6666'}
r=requests.get(base_url+'/get',params=param_data)
print(r.url)
print(r.status_code)

执行结果
在这里插入图片描述
传递body参数
在post请求中,一般参数都在请求体中(request body)中传递,在Requests中用法如下:

form_data={'user':'zxw','passwd':'8888'}
r=requests.post(base_url+'/post',data=form_data)
print(r.text)

执行结果:
在这里插入图片描述

5、请求头设置

如果你想为请求头添加HTTP头部,只要简单地传递一个dict给header参数就可以了。
用法如下:

form_data={'user':'zxw','passwd':'8888'}
header={"user-agent":"Mozilla/5.0"}
r=requests.post(base_url+'/post',data=form_data)
print(r.text)
  • Accept ,请求报头域,用于指定客户端可接受哪些类型的信息。
  • Accept-Language,指定客户端可接受的语言类型。
  • Accept-Encoding,指定客户端可接受的内容编码。
  • Host,用于指定请求资源的主机IP和端口号,其内容为请求URL的原始服务器或网关的位置。从HTTP1.1 版本开始,Request必须包含此内容。
  • Cookie,也常用复数形式Cookie,是网站为了辨别用户进行Session跟踪而储存在用户本地的数据。Cookies的注意功能就是维持当前访问会话。
  • Referer ,此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计,做防盗链处理等。
  • User-Agent,简称UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息可以伪装为浏览器,如果不加很可能会被识别出为爬虫。
  • Content-Type,即Internet Media Type,互联网媒体类型,也叫做MIMI类型,在HTTP协议消息头中,使用它来代表具体请求中的媒体类型信息。例如application/x-www-form-urlencoded表示表单数据,text/html代表HTML格式,image/gif代表GIF图片,application/json代表JSON类型。

6、Cookie设置

通过Cookie参数可以设置Cookie
request_advance.py

import requests

cookie= {'user':'admin'}
r=requests.get(base_url+'/cookie',cookies=cookie)
print(r.text)

获取cookie
请求百度首页,然后获取cookie,实现如下:

#获取cookie
r=requests.get('http://www.baidu.com')
print(type(r.cookies))
print(r.cookies)
for key,value in r.cookies.items():
	print(key+':'+value)

在这里插入图片描述

7、超时

你可以让requests在经过以timeout参数设定的秒数时间之后停止等待响应,防止某些请求没有响应而一直处于等待状态。

r=requests.get(base_url+'cookies',cookies=sookies,timeout=0.01)
print(r.text)

8、文件上传

Requests可以使用参数files模拟提交一些文件数据,加入有的接口需要我们上传文件,我们同样可以利用它来上传,实现非常简单,实例如下:

#上传文件
file={'file':open('logo.png','rb')}#r:resd b:是以二进制方式阅读
r=requests.post(base_url+'/post',files=file)
print(r.test)

9、会话对象

在计算机中,尤其是在网络应用中,称之为“会话控制”,Session对象储存特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
比如你先进行了登录操作,然后打开个人中心详情页面,个人中心详情页面如何知道展示的是刚刚登录的这个用户的信息,那么这里就需要使用Session来存储相关信息。
在接口测试过程中接口之间经常有依赖关系,比如下面这两个请求一个是设置Cookie,另外一个是获取cookie,在没有Session保存机制的情况下,第二个接口无法获取第一个接口设置的Cookie值。

#设置cookie
r=requests.get(url+'/cookies/set/user/zxw')
print(r.text)

#获取cookie
r=requests.get(url+'/cookie')
print(r.text)

Requests的会话对象让你能够跨请求保持某些参数,它也会在同一个Session实例发出的所有请求之间保持cookie.具体使用如下:

#生成会话对象
s=requests.Session()

#设置Cookie
r=s.get(url+'/cookies/set/user/zxw')
print(r.text)

#获取cookie
r=s.get(url+'/cookies')
print(r.text)

所以,利用Session我们可以做到模拟同一个会话,而且不用担心Cookies的问题,通常用于模拟登录成功之后再进行下一步的操作。

10、SSL证书验证

Requests可以为HTTPS请求验证SSL证书,就像web浏览器一样。SSL验证默认是开启的,如果证书认证失败,Requests会抛出SSLError:如果不想验证SSL则可以使用verify参数关闭验证SSL.
下面是验证12306网站的证书。

r=requests.get('https://www.12306.cn')
#关闭验证SSL
#r=requests.get('https://www.12306.cn',verifg=False)
print(r.text)

tips:12306的证书是自己颁布给自己的,所以会出现认证失败。

11、代理设置

代理,也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。
代理服务器位于客户端和访问互联网之间,服务器接收客户端的请求,然后代替客户端向目标网站发出请求,所有的流量路由均来自代理服务器的ip地址,从而获取到一些不能直接获取的资源。
对于有些接口,在测试的时候请求几次,能正常获取内容。但是一旦开始大规模频繁请求(如性能测试)服务器可能会开启验证,甚至直接把IP给封禁掉。那么为了防止这种情况的发生,我们就需要设置代理来解决这个问题,在Requests中需要用到proxies这个参数,在爬虫中会经常用到代理。
西刺免费代理IP

#代理设置
proxies={'http':'http://219.141.153.41:80'}
r=requests.get(url+'/get',proxies=proxies)
print(r.text)

运行结果如下:可以看到origin参数即为我们设置的代理ip
在这里插入图片描述

12、身份认证

很多接口都需要身份认证:Requests支持多种身份认证,具体使用方法如下:
下面案例主要验证了两种身份类型:BasicAuth 和DigestAuth

from requests.auth import HTTPBasicAuth
from requests.auth import HTTPDigestAuth

#身份认证 BasicAuth
r=requests.get(url+'/basic-auth/admin1/8888',auth=HTTPBasicAuth('admin','8888'))
print(r.text)

#身份认证 DigestAuth
r=requests.get(url+'/digest-auth/admin2/8888',auth=HTTPDigestAuth('admin','8888'))
print(r.text)

运行结果:

{“authenticated”:true,"user":"admin1"}
{“authenticated”:true,"user":"admin2"}

13、流式请求

有一些接口返回值比较特殊,不是单纯返回一个结果,而是多个结果,比如某个查询接口,返回值为排行榜前10的商品信息。
针对这种类型的接口,我们对结果集的处理需要使用迭代方法iter_lines()来处理,具体使用如下:

import json
r=requests.get(base_url+'/staream/10',stream=True)

#如果响应内容没有设置编码,则默认设置为utf-8
if r.encoding is None:
	r.encoding='utf-8'
#对响应结果进行迭代处理
for line in r.iter_lines(decode_unicode=True)
	if line:
		data=json.loads(line)
		print(data['id'])

14、集成到 Unittest

实际的接口测试需要针对不同的参数场景进行测试。另外还需要
设置断言,生成测试报告。
用例设计
在这里插入图片描述
代码实现
text_api_unittest.py

import unittest
import requests
from urllib import parse
from time import sleep
class WeatherTest(unittest.TestCase):#unitest框架语法
	def setUp(self):#等效于init
		 self.url='https://www.sojson.com/open/api/weather/json.shtml'
	 #代理设置,避免 ip 被封
	 # self.proxies={'http':'http://125.118.146.222:6666'}
	def test_weather_beijing(self):
			 '''测试北京天气'''
		 data = {'city': '北京'}
		 city = parse.urlencode(data).encode('utf-8')
		 # r=requests.get(self.url,params=city,proxies=self.proxies)
		 r=requests.get(self.url,params=city)
		 result=r.json()
		 #断言(unitest的内置方法)
		 self.assertEqual(result['status'],200)
		 self.assertEqual(result['message'],'Success !')
		 self.assertEqual(result['city'],'北京')
		 #设置间隔时间,避免 ip 被封
		 sleep(3)#执行完停止3秒
	def test_weather_param_error(self):
	 	'''参数异常'''
		 data={'city':'666'}
		 # r=requests.get(self.url,params=data,proxies=self.proxies)
		 r=requests.get(self.url,params=data)
		 result=r.json()
		 self.assertEqual(result['message'],'Check the parameters.')
		 sleep(3)
	def test_weather_no_param(self):
			 '''参数缺省'''
		 # r=requests.get(self.url,params=data,proxies=self.proxies)
		 r=requests.get(self.url)
		 result=r.json()
		 self.assertEqual(result['message'],'Check the parameters.')
		 self.assertEqual(result['status'],400)
		 sleep(3)
if __name__ == '__main__':
 unittest.main()#unitest框架语法;只执行test开头的函数

在这里插入图片描述

15、生成测试报告

  • 首先创建文件夹commen和reprot
  • 下载HTMLTestRunner,放入commen文件夹下(提取码:520a)
  • 创建run.py模块,跟存放封装接口测试文件的case目录同级

run.py

import unittest,os
from commen import HTMLTestRunner#引入HTMLTestRunner

def all_case():
    dir = os.getcwd()#获取当前路径
    result_path = os.path.join(dir, 'reprot') + '\\reprot.html'#生成测试报告的目录
    fb = open(result_path, "wb")#打开测试报告的html文件
    runner = HTMLTestRunner.HTMLTestRunner(
        stream=fb,
        title="测试报告",#测试报告的标题
        description="自动化测试用例执行情况"#描述
    )
    case_dir=os.path.join(dir,'case')#获取case的路径,即要执行的用例目录
    discover=unittest.defaultTestLoader.discover(
        case_dir,#需要执行的用例文件地址
        pattern='test*.py'#case目录下所有test开头的py文件
    )
    runner.run(discover)#生成测试报告
    fb.close()#关闭文件

if __name__=='__main__':
    #返回实例
    all_case()
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值