HTTP
HTTP是一个协议(服务器传输超文本到浏览器的传送协议)是基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等)
http资源
http请求方式
http状态码
Requests模块
pycharm创建项目并进行接口请求
下载requests,直接导包下载或者在终端使用pip install requests
requests官网
https://requests.readthedocs.io/en/latest/
get请求
编写请求代码:
import requests
r = requests.get("https://api.github.com/events")
print(r.status_code) #接口状态返回码
print(r.json()) #接口返回的json
print(r.text) #接口返回的文本
运行结果:
请求中携带参数代码:
import requests
params = {
"shouji": "13456766448",
"appkey": "0c818521d38759e1"
}
r = requests.get(url="http://api.binstd.com/shouji/query", params=params)
print(r.status_code)
print(r.json())
运行结果:
post请求
params形式:
import requests
params = {
"shouji": "13456766448",
"appkey": "0c818521d38759e1"
}
r = requests.post(url="http://api.binstd.com/shouji/query", params=params)
print(r.status_code)
print(r.json())
运行结果:
json形式:
import requests
json_data = {
"title": "foo",
"body": "bar",
"userId": 1
}
r = requests.post(url="http://jsonplaceholder.typicode.com/posts", json=json_data)
print(r.status_code)
print(r.json())
运行结果:
data形式:
import requests
data = {
"text":"hello"
}
r = requests.post(url="http://dict.youdao.com/keyword/key",data=data)
print(r.status_code)
print(r.json())
运行结果:
requests加入headers:
Pytest
在终端安装pytest
pip install pytest
初体验
def test_one():
expect = 1
actual = 1
assert expect == actual
def test_two():
expect = 1
actual = 2
assert expect == actual
配置运行方式
运行结果:
断言
常用断言类型
示例代码:
pytest+requests练习
import requests
def test_mobile():
params = {
"shouji": "13456755448",
"appkey": "0c818521d38759e1"
}
r = requests.get(url="http://api.binstd.com/shouji/query", params=params)
print(r.status_code)
assert r.status_code == 200
result = r.json()
assert result['status'] == 0
assert result['msg'] == "ok"
assert result['result']["shouji"] == "13456755448"
assert result['result']["province"] == "浙江"
assert result['result']["city"] =="杭州"
assert result['result']["company"] =="中国移动"
assert result['result']["cardtype"] is None
assert result['result']['areacode'] == "0571"
运行结果:
一次执行多个测试方法
if __name__ == '__main__':
pytest.main()
运行结果:
配置项pytest.ini
在目录下新建一个file,命名为pytest.int
[pytest]
testpaths=./test_requests
其中testpaths的路径可以修改成想要检测的文件
然后在终端输入pytest即可得到结果
setup/teardown
模块级
在包含测试方法的.py文件中加入如下代码:
def setup_module():
print("open开开开")
def teardown_module():
print("clear清清关")
运行pytest.main():
函数级
在包含测试方法的.py文件中加入如下代码:
def setup_function():
print("open开开开")
def teardown_function():
print("clear清清关")
运行pytest.main():
类级和方法级区分模块级和函数级的重要一点是,类级和方法级是在类中。在类中的方法括号里要加入self
类级
在包含测试方法的类中加入setup和teardown
class TestSAT:
def setup_class(self):
print("open开开开")
def teardown_class(self):
print("clear清清关")
运行类TestSAT:
方法级
在包含测试方法的类中加入setup和teardown
class TestSAT:
def setup_method(self):
print("open开开开")
def teardown_method(self):
print("clear清清关")
运行类TestSAT:
Fixture
fixture是pytest用于将测试前后进行预备、清理工作的代码处理机制。
fixture相对于setup和teardown来说有以下优势:
1.fixure命名更加灵活,局限性比较小
2.conftest.py配置里面可以实现数据共享,不需要import就能自动找到一些配置
Fixture夹具,@pytest.ficture
fixture作用范围:session>module>class>function
在包含测试方法的.py文件中加入下列代码:
@pytest.fixture(scope="function",autouse="True")
def func():
print("前置")
其中scope可以更换为其他参数,默认是function,autouse默认为false,为false情况下要使用夹具的方法将夹具的方法名写入参数列表,如下图:
结果如图,只有传入夹具方法名的方法才会生效:
为True情况下,默认该文件内所有方法都使用夹具,结果如图:
YAML
yaml语法
新建.yaml文件可以先创建config文件夹然后New一个file,命名为data.yaml
hero:
name: 伽罗
word: 太平无忧
Hp: 440
heros_name:
- 小乔
- 妲己
- 貂蝉
heros_name_list:
- - 法师
- 小乔
- 妲己
- 貂蝉
heros:
- name: 妲己
word: 来和妲己玩耍吧
Hp: 400.8
读取yaml文件
下载第三方包安装
pip install pyyaml
新建一个Python文件夹utils,然后New一个read_data.py文件
import yaml
f = open("../config/data.yaml",encoding="utf8")
data = yaml.safe_load(f)
print(data)
print(data['hero'])
print(data['heros_name'])
print(data['heros'])
print(data['heros_name_list'])
运行结果:
参数化
参数化可以组装测试数据,在测试前定义好测试数据,并在测试用例中使用
单参数
单参数单次循环
import pytest
@pytest.mark.parametrize("name",["鲁班七号"])
def test_parametize(name):
print(name + "智商二百五")
运行结果:
单参数多次循环
import pytest
@pytest.mark.parametrize("name",["鲁班七号","虞姬","伽罗"])
def test_parametize(name):
print(name + "是射手")
运行结果:
多参数
import pytest
@pytest.mark.parametrize("name,word",[["鲁班七号","上上下下左左右右"],["虞姬","想和风比比脚力吗"],["伽罗","比利剑更稳的是我本人"]])
def test_parametrize(name,word):
print(f'{name}:{word}')
内部的中括号也可以使用括号代替,即使用元组
运行结果:
parametrize+yaml
在data.yaml添加如下信息:
mobile_params:
- [ 13456755448,0c818521d38759e1 ]
改装read_data.py
import yaml
def get_data():
f = open("../config/data.yaml",encoding="utf8")
return yaml.safe_load(f)
编写测试代码:
import pytest
import requests
from utils.read_data import get_data
@pytest.mark.parametrize("shouji,appkey", get_data()['mobile_params'])
def test_mobile(shouji,appkey):
r = requests.get(url="http://api.binstd.com/shouji/query",
params={"shouji": shouji,"appkey": appkey})
assert r.status_code == 200
result = r.json()
assert result['status'] == 0
assert result['msg'] == "ok"
assert result['result']["shouji"] == "13456755448"
assert result['result']["province"] == "浙江"
assert result['result']["city"] == "杭州"
assert result['result']["company"] == "中国移动"
assert result['result']["cardtype"] is None
assert result['result']['areacode'] == "0571"
运行结果:
Allure测试报告
配置pytest.ini
安装插件
pip install allure-pytest
在pytest.ini下编写如下代码:
addopts = -vs --alluredir ./report
直接运行一个测试用例,在该测试用例所在文件下生成一个report文件夹,包含内容如下:
在终端输入pytest 路径,代码如下,可以在根目录下生成report
pytest testcases/test_parametrize_01.py
打开报告
首先下载并配置allure环境,可参考以下链接(安装完成后一定要重启pycharm):
!此处推荐使用2.13.9,我下载2.13.10allure显示空白页,把文章中路径改了即可
f1
安装完成后在终端输入以下代码打开auller测试报告
allure serve ./report
f2
先在终端输入下列代码:
allure generate report
文件中多出allure-report文件夹
在终端输入下面代码打开测试报告:
allure open allure-report/
jenkins运行pytest项目
先下载jenkins,参考下面链接:
在jenkins下载alluer插件:
全局配置
创建项目
#!/bin/bash
cd ${WORKSPACE}
pip3 install -r requirements.txt --user
pytest
最后即可在平台查看