1、测试框架的基本功能
项目管理:pip、virtualenv
用例编写:pytest
领域能力:app、web、http
执行调度:pytest、pycharm、shell、Jenkins
测试报告:allure2
2、http测试能力
请求方法构造:get、post、put、delete、head
请求体构造:form、json、xml、binary
响应结果分析:status code、response body、json path、XPath
3、requests的特点
功能全面:http/https支持全面
使用简单:简单易用,不需要关心底层细节
定制性高:借助hook机制完成通用处理
4、简单测试用例举例
import requests
# https://httpbin.testing-studio.com/
class TestDemo:
def test_get(self):
r = requests.get("https://httpbin.testing-studio.com/get")
print(r.text)
print(r.json())
print(r.status_code)
assert r.status_code == 200
5、构造一个完整的请求
(1)请求目标构造
r = requests.get("http://httpbin.testing-studio.com/get")
(2)请求参数构造
get query:path query
post body:form、结构化请求JSON、binary二进制
举例见下方代码
举例1:get query
举例2:form请求参数构造
举例3:文件上传
files={'file':open('1.text','rb')} r.requests.post(url,files=file)
def test_file(self): file={"file":open('1.text','rb')} r=requests.post("https://httpbin.testing-studio.com/post",files=file) print(r.text)
(3)请求体
(4)请求头
普通header:
headers={'user-agent':'my-app/0.0.1'}
r=requests.get(url,headers=headers)
cookie:
cookies=dict(cookies_are='working')
r=requests.get(url,cookies=cookies)
import requests # https://httpbin.testing-studio.com/ class TestDemo: def test_get(self): r = requests.get("https://httpbin.testing-studio.com/get") print(r.text) print(r.json()) print(r.status_code) assert r.status_code == 200 # get query请求构造 def test_get_query(self): payload = { "level": 1, "name": "seveniruby" } r = requests.get("https://httpbin.testing-studio.com/get", params=payload) print(r.text) assert r.status_code == 200 # form请求参数构造 def test_post_form(self): payload = { "level": 1, "name": "seveniruby" } r = requests.post("https://httpbin.testing-studio.com/post", data=payload) print(r.text) assert r.status_code == 200 def test_headers(self): headers = { "h": "demo" } r = requests.get("https://httpbin.testing-studio.com/get", headers=headers) print(r.text) print(r.json()) print(r.status_code) assert r.status_code == 200 assert r.request.headers["h"] == "demo"
6、响应结果断言
r.url 响应的URL
r.status_code 响应的状态码
r.headers 响应头
r.cookies cookies信息
r.text=r.encoding+r.content
r.json()=r.encoding+r.content+content type json
r.raw.read(10)
对应得请求内容 r.request
7、结构化请求体构造 json
JSON及断言
代码示例
def test_post_json(self): payload = { "level": 1, "name": "seveniruby" } # 会自动转为json格式 # 响应里 "Content-Type": "application/json", r = requests.post("https://httpbin.testing-studio.com/post", json=payload) print(r.text) assert r.status_code == 200 assert r.json()['json']['level'] == 1
jsonpath断言
def test_hog_json(self): r=requests.get('https://ceshiren.com/categories.json') print(r.text) assert r.status_code==200 assert r.json()['category_list']['categories'][0]['name']=='开源项目' print(jsonpath(r.json(),'$..name')) assert jsonpath(r.json(),'$..name')[0]=='开源项目'
8、schema校验
JSON Schema | The home of JSON Schema
自动校验:
- 每次运行会自动保存当前的schema
- 下次运行对比上次的schema如果发现变更就报错
- saveSchema+diffSchema
def test_jsonschema(self): url="https://ceshiren.com/categories.json" data=requests.get(url=url).json() print(data) schema=json.load(open("topic_schema.json")) validate(data,schema=schema)
9、http cookie
cookie使用场景:
需求请求需要cookie,所以在构造接口测试用例时加入cookie
传递cookie的两种方式:
请求体信息:自定义header传递
请求关键字cookies传递
代码示例:
import requests def test_cookie(): url="https://httpbin.testing-studio.com/cookies" header={"Cookie":"hoo=school",'User-Agent': 'python-requests'} r=requests.get(url=url,headers=header) print(r.request.headers) def test_cookie1(): url="https://httpbin.testing-studio.com/cookies" header={'User-Agent': 'python-requests'} cookie_data={"hog":"12345"} r=requests.get(url=url,headers=header,cookies=cookie_data) print(r.request.headers) print(r.request.headers["Cookie"])
10、http认证体系
http basic
基本认证 是允许http用户代理在请求时,提供用户名和密码的一直方式
主要是认证
Authorization:Basic xxxxxxxxxxxxxxxxxx
代码示例
import requests from requests.auth import HTTPBasicAuth def test_auth(): url = "https://httpbin.testing-studio.com/basic-auth/demaxiya/111" r = requests.get(url=url, auth=HTTPBasicAuth("demaxiya", "111")) print(r.text)
加密接口
创建json文件
{ "topics": { "orange": "movie", "shool": "testing-studio", "president": "seveniruby" } }
对文件进行base64加密
ew0KICAidG9waWNzIjogew0KICAgICJvcmFuZ2UiOiAibW92aWUiLA0KICAgICJzaG9vbCI6ICJ0ZXN0aW5nLXN0dWRpbyIsDQogICAgInByZXNpZGVudCI6ICJzZXZlbmlydWJ5Ig0KICB9DQp9
使用Python命令行创建一个http地址
python -m http.server 9999
处理加密接口的原理或方法
1、已知加密算法,使用对应解密算法
2、未知加密算法,需要研发提供加解密的lib
3、如果不是通用加密算法,研发也无法提供,那么让加密发提供远程解析服务,算法依然保密
多环境的接口测试
实现原理
在请求之前,对请求的URL进行替换
1、需要二次封装requests,对请求进行定制化
2、将请求的结构体的URL参数化
3、使用env配置文件
4、将请求体的URL替换成env配置文件中个人选择的URL
5、将env配置文件使用yaml进行管理
算法测试脚本(待定)