基本使用

requests可以模拟发送网络请求。

发送get 请求

使用 requests 库进行模拟发送请求。

  1. 需要注意, 函数名以 test_ 开始,pycharm 会自动识别为 pytest的单元测试用例。 ```python

    导入包

    import requests

所有的测试用例 函数名都以 test_ 开始

def test_home_topic():

  1. # 请求的url
  2. home_url = "http://47.100.175.62:3000/api/v1/topics"
  3. # 发送get请求
  4. r = requests.get(url=home_url)
  5. # 打印 服务器返回状态码 status_code
  6. print(r.status_code)
  7. # 打印 服务器返回的结果
  8. print(r.json())
在pycharm 中执行。可以看到对应的效果。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/87080/1653025500460-d59b4fc6-a78b-43c9-9860-5405b49bfac2.png#clientId=u2930c723-ed1e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=722&id=u32e26709&margin=%5Bobject%20Object%5D&name=image.png&originHeight=902&originWidth=1670&originalType=binary&ratio=1&rotation=0&showTitle=false&size=195184&status=done&style=none&taskId=uaaf55e8c-2e15-4948-ad3b-5f78513d303&title=&width=1336)<br />pycharm 正常情况下会自动识别 test_ 开头的函数名作为测试用例来执行。 如果你的pycharm 没有识别出来。
<a name="GI3aF"></a>
## 命令行运行
命令行使用pytest 命令来执行。<br />点击 【Terminal  命令行】<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/87080/1653026246126-d8ee6857-6295-4648-aba4-dca59f692cb9.png#clientId=u2930c723-ed1e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=589&id=u197c19ea&margin=%5Bobject%20Object%5D&name=image.png&originHeight=736&originWidth=1544&originalType=binary&ratio=1&rotation=0&showTitle=false&size=89377&status=done&style=none&taskId=u2cb1104c-3669-4c4b-b47e-fd55ad01f6b&title=&width=1235.2)
```python
 pytest .\testcases\test_demo.py -s -v
  • testcases\test_demo.py 文件路径
  • -s 显示代码中打印的内容
  • -v 日志的级别

image.png
执行之后,可以在pytest 中看到对应的执行结果。
image.png

在命令行中执行 和 在 pycharm 执行 最终的结果都是一样的。同学们可以根据自己喜好选择运行,能运行就可以了。

发送post请求

# 导入包
import requests

# 所有的测试用例 函数名都以 test_ 开始

def test_create_topic():
    create_url = "http://47.100.175.62:3000/api/v1/topics"
    body_data = {
        "accesstoken":"e18de36f-d9ce-47e6-a2aa-1cf6508ec10b",
        "title":"hell000o",
        "tab":"ask",
        "content":"123456"
    }
    # 发送post请求  json=body_data 传入数据。
    r = requests.post(url=create_url,json=body_data)
    # 打印 返回结果的状态码
    print(r.status_code)
    # 打印 服务器返回的结果
    print(r.json())

get 请求参数

get请求有参数的时候,需要添加对应的请求参数。

# 导入包
import requests


def test_get_home_page():
    homeurl = "http://47.100.175.62:3000/api/v1/topics"
    querydata = {
        "page":1,
        "limit":1
    }
    # 发送get请求, params表示请求的参数
    resp = requests.get(url=homeurl,params=querydata)
    # 断言  状态码为 200
    assert resp.status_code == 200
    # 打印 服务器返回结果
    print(resp.json())
    # 断言 服务器返回结果只有1条数据

添加请求参数。

  1. 定义请求数据为字典格式。

    querydata = {
         "page":1,
         "limit":1
     }
    
  2. 在get() 函数中传参 params=querydata

  • assert resp.status_code == 200 添加状态码断言

断言练习


def test_get_home_page2():
    homeurl = "http://47.100.175.62:3000/api/v1/topics"
    querydata = {
        "page": 1,
        "limit": 20,
        "tab": "ask"
    }
    # 发送get请求, params表示请求的参数
    resp = requests.get(url=homeurl, params=querydata)
    # 断言  状态码为 200
    assert resp.status_code == 200
    # 打印 服务器返回结果
    print(resp.json())
    # 添加断言 服务器会返回20条数据
    alltopics = resp.json()["data"]
    assert len(alltopics) == 20
    # 添加断言 返回的结果中 话题,20个话题,每个话题的 tab 值都是 ask
    # 循环列表,获取每个话题
    for topic in alltopics:
        # 打印
        print(topic["tab"])
        # 进行断言
        assert topic["tab"] == "ask"

post请求两种数据格式:表单格式、json格式

比如在postman 中发送post请求,一般两种格式。

发送表单格式

数据类型选择 x-www-form-urlencoded 的时候 ,数据类型为表单格式。
image.png
python中发送表单格式,在post 请求中将值传递给 data.
image.png发送表单数据。


def test_post_form_data():
    create_url = "http://47.100.175.62:3000/api/v1/topics"
    body_data = {
        "accesstoken": "e18de36f-d9ce-47e6-a2aa-1cf6508ec10b",
        "title": "hell000o",
        "tab": "ask",
        "content": "123456"
    }
    # 发送post请求  json=body_data 传入数据。
    r = requests.post(url=create_url, data=body_data)
    # 打印 返回结果的状态码
    print(r.status_code)
    assert r.status_code == 200
    # 打印 服务器返回的结果
    print(r.json())
    assert r.json()["success"] == True
    # 查看请求头信息
    print(r.request.headers)

image.png
同样的,在Python中可以看到发送出去的请求格式
image.png

发送json格式

如果发送的请求数据格式为json, 那么我们就将数据传递给json.
image.png
image.png
对应的代码。

import requests
def test_post_json():
    create_url = "http://47.100.175.62:3000/api/v1/topics"
    body_data = {
        "accesstoken": "e18de36f-d9ce-47e6-a2aa-1cf6508ec10b",
        "title": "hell000o",
        "tab": "ask",
        "content": "123456"
    }
    # 发送post请求  json=body_data 传入数据。
    r = requests.post(url=create_url, json=body_data)
    # 打印 返回结果的状态码
    print(r.status_code)
    assert r.status_code == 200
    # 打印 服务器返回的结果
    print(r.json())
    assert r.json()["success"] == True
    # 查看请求头信息
    print(r.request.headers)

可以看到结果, 请求使用的数据格式为json 格式。
image.png
对于我们编写测试用例的时候,接口使用 表单格式还是使用 json 格式。取决于公司的开发,根据开发的定义,选择对应的格式。

发送带有信息头headers 的请求

新建一个文件, testcases/test_shopping.py 编写新丰商城接口


"""
接口地址: http://49.233.108.117:28019/swagger-ui.html#/
"""
import requests

base_url = "http://49.233.108.117:28019"

def test_register():
    """
    测试注册用户
    :return:
    """
    register_url = base_url+"/api/v1/user/register"
    jsondata = {
      "loginName": "13310001229",
      "password": "123456"
    }
    # 发送json格式数据
    r = requests.post(url=register_url,json=jsondata)
    # 打印状态码
    print(r.status_code)
    # 打印返回结果
    print(r.json())
    # 添加对应的断言
    assert r.status_code == 200
    assert r.json()["message"] == 'SUCCESS'

def test_login():
    """
    测试登录
    :return:
    """
    login_url = base_url+"/api/v1/user/login"
    login_data = {
      "loginName": "13310001229",
      "passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"
    }
    r = requests.post(url=login_url,json=login_data)
    print(r.status_code)
    print(r.json())

现在可以进行注册登录。但是有个问题, 注册的账号 每次都要手动修改。

GET请求带有信息头

根据接口文档,接口文档中 header 表示信息头。 在做这个接口的时候,需要将token值放在信息头中。
image.png
将token放在信息头中。
image.png

在发送请求的时候,将 token放在信息头中,发送。
使用 python requests 来实现。

import requests

def test_search():
    search_url = base_url+"/api/v1/search"
    # 定义信息头
    header_data ={
        "token":"8139786fb78d31d570b81437b5f20f6c"
    }
    # 请求参数
    query_data={
        "keyword":"iphone"
    }
    # 发送get请求  params 请求参数,  headers 信息头
    r = requests.get(url=search_url,params=query_data,headers=header_data)
    # 状态码
    print(r.status_code)
    # 返回结果
    print(r.json())

    print(r.request.headers)

可以看到对应的请求头信息

  • headers= 请求头部分

image.png

Post请求带有信息头

post请求和get请求中的信息头 是一样的用法。
也是将数据传递给 headers
image.png

import requests

base_url = "http://49.233.108.117:28019"
def test_add_cart():
    add_cart_url = base_url+"/api/v1/shop-cart"
    header_data = {
        "token":"429054b175e70c0510e55ddaecf5995b",
    }
    post_data = {
      "goodsCount": 1,
      "goodsId": 10278
    }
    # 发送post请求
    r = requests.post(url=add_cart_url,headers=header_data,json=post_data)
    print(r.status_code)
    print(r.json())
    # 查看信息头 ,请求body 数据 r.request.body
    print(r.request.headers,r.request.body)

不管是 是get 还是 post ,或者 put 这些方法,传入信息头时 值都传给 headers。