Python接口测试入门

摘要:
PostId=0'#发送请求r=个请求。get#请求的状态代码200表示成功状态=r.status _ code#断言接口的状态代码。如果等于200,则视为通过。如果不是200,则认为通过。如果等于200则不是200。如果不是200,就不是200。如果是请求的内容,j=r.json()#确定接口返回的内容中是否有权证部门的内容。如果是“权证部门”instr:printlse:printprint输出结果:案例5:接口内容断言-异常情况决定了接口返回的内容,是否有链接url='用于“权证部门测试”importRequests#请求的内容https://dgateway.allhome.com.cn/organization/v1/basic/people/position/dictionaryList?
接口测试基础篇

用几个简单的案例,带你轻松了解接口测试

首先了解一下接口测试的重要性:

Python接口测试入门第1张

接口测试有什么要求呢?

首先需要清晰的接口文档,标准如下:

  • 接口名称
  • 接口类型
  • 输入参数
  1. 每个参数名;
  2. 每个参数类型;
  3. 每个参数业务含义;
  4. 每个是否可空;
  5. 每个字段长度(可选,一般需要提供,有严格要求的字段需特别注明);
  • 输出参数

    状态码;

    提示信息;

    每个参数名,每个参数类型;

    每个参数业务含义;

    每个字段长度;

接口通用基本要求:(借鉴别人的总结)

  1. 返回json字段信息,不可出现 关键字类型,如 object,interface,public,java等各类语言代码中关键字类型
  2. 涉及金额等信息时应采取加密方式,后端需进行校验,防止通过接口拦截造成损失
  3. 涉及交易收付款时,后端需进行幂等校验
  4. HTTPS方式传输
  5. 请求方式,一般获取数据是get,提交表单是post
  6. 信息存取可采取对称加密和非对称加密的结合(可选,也可选一种)
  7. 接口进行手机号正则验证,字符串和上传文件图片等提前规划大小限制
  8. 检查数据正确性,每个接口从数据存取数据等是否正确,是否在正确的数据库表取数据等
  9. 为空等验证一定要做,正确状态码和错误状态码一定全部记录下来,状态码代表的意思等

接下来用几个简单的案例开始接口测试之旅

准备工作:

案例一:发送一个get请求

import requests

# 请求的链接
url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/position/dictionaryList?postId=0'
# 发送get请求
r = requests.get(url)
# 请求的状态码 200代表成功
status = r.status_code
print(status)
# 请求的内容
j = r.json()

print(j)

输出结果:

Python接口测试入门第2张

案例二:发送一个post请求

import requests
# 请求的链接
url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/level/list'

# post请求以字典格式传入
data = {
    "pageInfo": {
        "page": 1,
        "size": 3
    },
    "query": {
        "postId": ""
    }
}

# 发送post请求
r = requests.post(url, data)

# 请求的状态码 200代表成功
status = r.status_code
print(status)

输出结果:

Python接口测试入门第3张

import requests
# 请求的链接
url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/level/list'

# post请求以字典格式传入
headers = {"Content-Type": "application/json"}
data = {
    "pageInfo": {
        "page": 1,
        "size": 3
    },
    "query": {
        "postId": ""
    }
}

# 发送post请求
r = requests.post(url, data=json.dumps(data), headers=headers)

# 请求的状态码 200代表成功
status = r.status_code
print(status)

# 请求的内容
print(r.content)

输出结果:

Python接口测试入门第4张

思考:对requests获取的原始数据,有几种形式?

https://www.jianshu.com/p/0e0336b370f3

案例三:接口状态码断言

import requests

# 请求的链接
url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/position/dictionaryList?postId=0'
# 发送请求
r = requests.get(url)

# 请求的状态码 200代表成功
status = r.status_code

# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('用例测试通过')
else:
    print('测试不通过')
    
print(status)
# 请求的内容
j = r.json()
print(j)

输出结果:

Python接口测试入门第5张

案例四:接口内容断言-正常情况

import requests

# 请求的链接
url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/position/dictionaryList?postId=0'
# 发送请求
r = requests.get(url)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('用例测试通过')
else:
    print('测试不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 权证部 内容
if '权证部' in str(j):
    print('存在此数据')
else:
    print('不存在此数据')
print(j)

输出结果:

Python接口测试入门第6张

案例五:接口内容断言-异常情况

判断接口返回内容里面,有没有 ‘权证部测试’ 内容

import requests

# 请求的链接
url = 'https://dgateway.allhome.com.cn/organization/v1/basic/people/position/dictionaryList?postId=0'
# 发送请求
r = requests.get(url)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('用例测试通过')
else:
    print('测试不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 权证部测试 内容
if '权证部测试' in str(j):
    print('存在此数据')
else:
    print('不存在此数据')
print(j)

输出结果:

Python接口测试入门第7张

讲到这里已经知道如何发送请求,如何使用断言;学习完大家还需要多敲多练。
思考:当url、path、data发生变化每次都需要更改代码是不是很麻烦!有什么办法可以解决吗?
案例六:封装接口-将接口和逻辑代码分开控制**

  • 增加config.py存放接口
# baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
baseurl = 'https://dgateway.allhome.com.cn'

# 职级字典表接口
url_dictionaryList = baseurl + '/organization/v1/basic/people/position/dictionaryList?postId=0'
  • 增加testapi.py
# 发送请求 使用config.来调用想要的接口 调用职级字典表
r = requests.get(config.url_dictionaryList)

# 请求的状态码 200代表成功
status = r.status_code

# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('状态码校验过')
else:
    print('状态码校验不通过')
print(status)

# 请求的内容
j = r.json()

# 判断接口返回内容里面,有没有 权证部 内容
# 权证部  增加了一个1
if '权证部' in str(j):
    print('存在此数据')
else:
    print('不存在此数据')
print(j)

输出结果:

Python接口测试入门第8张

练习到这个案例,会发现将接口封装后,每次接口链接变了,只需要修改config文件即可

案例七:封装接口-将接口和逻辑代码分开控制

上面讲到了如何将url与逻辑代码分开控制,但如果是post接口的话,参数也要进行分离

下面我们要对config.py进行修改

# baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
baseurl = 'https://dgateway.allhome.com.cn'

# 职级字典表接口
url_dictionaryList = baseurl + '/organization/v1/basic/people/position/dictionaryList?postId=0'

# 查询职级列表接口
url_list = {
    '接口': baseurl + '/organization/v1/basic/people/level/list',
    'headers': {"Content-Type": "application/json"},
    'data': {
        "pageInfo": {
            "page": 1,
            "size": 3
        },
        "query": {
            "postId": ""
        }
    }
}

testapi.py修改

import requests
# 引入config配置接口的文件
import config
import json

# 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
url = config.url_list['接口']
data = config.url_list['data']
headers = config.url_list['headers']

r = requests.post(url, data=json.dumps(data), headers=headers)

# 请求的状态码 200代表成功
status = r.status_code

# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('状态码校验过')
else:
    print('状态码校验不通过')

# 输出状态码
print(status)

# 因为展示测试的接口没有json,所以只能输出content啦~
print(r.content)

输出结果:

Python接口测试入门第9张

总结:用到了 字典  的小知识点,还用到了 引用包 的小知识点(网上资料特别多,不懂的可以自己查阅资料)

这个案例讲完已经学会了使用 config 分开控制接口和逻辑代码,本次课程也就结束了!大家课后要先复习本次课程讲解的内容,查阅相关的资料进行巩固。感谢大家的捧场,希望大家共同学习共同进步!

温馨提示:下一节我们将会学到如何对接口进行封装、引用unittest测试框架进行断言、生成测试报告

接口测试基础篇(二)

上一讲学会了使用 config 分开控制接口和逻辑代码,下面继续学习接口封装

案例八:封装接口-执行多个接口

修改testapi.py即可

import json
import requests
# 引入config配置接口的文件
import config as j


# 测试查询职级列表接口的函数
def test_list():
    # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
    r = requests.post(url=j.url_list['接口'], data=json.dumps(j.url_list['data']), headers=j.url_list['headers'])
    # 请求的状态码 200代表成功
    status = r.status_code
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('状态码校验过')
    else:
        print('状态码校验不通过')
    # 输出状态码
    print(status)
    print(r.json())


# 测试接口的函数
def test_dictionaryList():
    # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
    r = requests.get(url=j.url_dictionaryList)
    # 请求的状态码 200代表成功
    status = r.status_code
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('状态码校验过')
    else:
        print('状态码校验不通过')
    # 输出状态码
    print(status)
    print(r.json())
    # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
    expected = '权证部'
    # 将接口返回的信息转为字符串类型,in 是判断接口的返回值里面 存不存在 预期结果的值,存在就通过 不存在就不通过
    if expected in str(r.json()):
        print('断言通过')
    else:
        print('断言不通过')


# 调用执行测试接口
test_list()
print('执行了 测试列表接口的函数')
# 调用执行测试接口
test_dictionaryList()
print('执行了 测试字典接口的函数')

输出结果:

Python接口测试入门第10张

总结:本次使用函数体的小知识点,和调用函数的小知识,如果感觉到自己不会学习赶紧去补充下自己的知识吧~

案例九:封装接口-引用unittest测试框架,进行断言

# coding=gbk
import json
import requests
# 引入config配置接口的文件
import config
# 增加单元测试框架
import unittest
"""
注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
"""

# 创建一个类型,执行用例的类,继承unittest的testcase类
class Testcase(unittest.TestCase):

    # 测试注册接口的函数
    def test_list(self):
        print('开始执行测试用例!')
        # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
        r = requests.post(url=config.url_list['接口'], data=json.dumps(config.url_list['data']),
                          headers=config.url_list['headers'])
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)
        print(r.json())
        print(r.text)
        print('测试结束!')

    # 测试登录接口的函数
    def test_dictionaryList(self):
        print('开始执行测试用例!')
        # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
        r = requests.get(config.url_dictionaryList)
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)
        # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
        expected = '权证部'
        # 获取接口的返回信息
        j = r.json()
        # 输出接口的返回信息
        print(j)
        # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
        self.assertEqual(expected, j['result'][0]['label'])
        print(r.text)
        print('测试结束!')

if __name__ == '__main__':

	# 定义测试用例的目录为当前目录
    test_dir = './'

    # 加载测试用例,根据文件路径 执行test开头的py文件
    discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')

输出结果:

Python接口测试入门第11张

看到 Ran 2 tests in 0.397s
意思是执行了两个用例,用时0.397秒

案例十:增加测试报告

注意事项:本次使用HTMLTestRunner,生成测试报告,这个是需要自己安装的哦~

testapi.py修改如下:

# coding=gbk
import HTMLTestReportCN
import json
import time
import unittest
import requests
# 引入config配置接口的文件
import config

# 创建一个类型,执行用例的类,继承unittest的testcase类


class Testcase(unittest.TestCase):

    # 测试注册接口的函数
    def test_list(self):
        print(u'开始执行测试用例!')
        # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
        r = requests.post(url=config.url_list['接口'], data=json.dumps(config.url_list['data']),
                          headers=config.url_list['headers'])
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)
        print(r.json())
        print(r.text)
        print(u'测试结束!')

    # 测试登录接口的函数
    def test_dictionaryList(self):
        print(u'开始执行测试用例!')
        # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
        r = requests.get(config.url_dictionaryList)
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)
        # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
        expected = '权证部'
        # 获取接口的返回信息
        j = r.json()
        # 输出接口的返回信息
        print(j)
        # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
        # j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
        self.assertEqual(expected, j['result'][0]['label'])
        print(u'测试结束!')


if __name__ == '__main__':

    # 定义测试用例的目录为当前目录
    test_dir = './'

    # 加载测试用例,根据文件路径 执行test开头的py文件
    discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
    # 按照一定的格式获取当前的时间
    now = time.strftime("%Y-%m-%d %H-%M-%S")

    # 定义报告存放路径 目前是存在运行的当前目录
    filename = now + 'test_result.html'
    # 打开file文件流
    fp = open('./test_result.html', "wb")
    # 定义测试报告

    runner = HTMLTestReportCN.HTMLTestRunner(stream=fp, title=u"测试报告", description=u"测试用例执行情况")
    # 运行测试
    runner.run(discover)
    # 关闭报告文件
    fp.close()

测试报告:

Python接口测试入门第12张

总结:可能会遇到的小问题:如果是unittest运行的话,不会执行if name == ‘main’:下面的代码,所以要执行当前整个类才行,alt+shift+f10 选择当前py文件执行就能生成测试报告了~

免责声明:文章转载自《Python接口测试入门》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用pycharm创建django项目MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)的真正原因下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HTML5 文件处理之FileAPI简介整理

  在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅长的处理之一。但文件处理,尤其是二进制文件处理,一直是个空白。在一些情况下,我们不得不通过Flash/ActiveX/NP插件或云端的服务器处理较为复杂或底层的数据。今天,HTML5的一系列新规范正在致力于让浏览器具备更强大的文件处理能力。 今天要介绍...

Python自动化学习笔记(1)认识接口测试以及postman、Charles工具简单应用

一、什么是接口? 1)接口主要负责前端(包含客户端)与服务端进行数据通信的一种数据交互方式。最常见的接口协议是HTTP接口,接口会返回通用的数据类型(html/xml/json)。 接口有多种请求方式,最常见的为get和post请求。 2)get请求和post请求区别 get请求多用于从服务端获取数据,通常只需要通过浏览器直接访问,使用"?"来传入参数,使...

【Python学习笔记】之格式化输入输出

1. python3设置print输出不换行 函数原型 print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) 对应参数含义如下 objects -- 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。 sep -- 用来间隔多个对象,默认值是一个空格。 end...

调用webservice接口,报错:(十六进制值0x01)是无效的字符

#事故现场 调用webservice接口,报错:(十六进制值0x01)是无效的字符。如图:意思是webservice返回的信息中包含无效的字符,无法解析成xml; #分析 使用postman向webservice发送请求,请求成功,返回了数据,但在数据中发现了一些莫名其妙的字符,如图:因数据来源数据库,故去数据库中查询,果然又发现,如图:将异常文本复制到...

3、Python字符编码区分utf-8和utf-8-sig

Python 读取文件首行多了"ufeff"字符串 python读取B.txt文件时,控制台打印首行正常,但是若是用首行内容打开文本的话,就会报错: Traceback (most recent call last): A File "E:/python project/multiProcess/test.py", line 32, in <mo...

PyQt学习随笔:QTextEdit和QTextBrowser删除光标所在行内容的方法

专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在使用QTextBrowser用于记录输出日志,并接管了标准输出后,对于某些Python模块输出的反映处理进度的提示内容,在pycharm中显示为一行,但在自己的日志文件中显示为N多行。为此分析了一下这些...