Python接口自动化浅析登录接口测试实战
作者:软件测试自动化测试 发布时间:2021-06-06 21:48:13
在上一篇Python接口自动化测试系列文章:Python接口自动化浅析unittest单元测试原理,主要介绍单元测试,unittest模块特性、大致流程、源码及实战例子。
以下主要介绍接口概念、接口用例设计及登录接口测试实战。
1、什么是接口?
接口:检测外部系统与系统之间以及内部各个子系统之间的交互点。
通俗来说,接口就是连接前后端的桥梁,接口测试可以简单理解为脱离了前端的功能测试。
一个又一个的接口就对应功能测试内一个又一个的功能。
但注意,一个功能有可能不是一个接口就能实现。
那么,接口测试和功能测试的区别在哪呢?
其实功能测试就是在页面上输入我们的参数值,点点点;
而接口测试没有前端,而是通过接口文档上的调用地址、请求参数等,校验返回的结果值,
也就是说,接口可以看成没有界面的功能测试。
因此,可以分析,系统间的接口包含三部分:输入、处理逻辑、输出。
2、如何开展接口测试?
接口测试流程如下:
1.需求评审,熟悉业务和需求;
2.开发提供API接口文档;
3.根据开发交付的接口文档,编写接口测试用例;
4.接口测试用例评审;
5.开始执行接口测试;
6.提交测试报告;
3、如何设计接口用例?
1.获取接口文档
一般公司的开发会提供接口文档,没有接口文档的自行抓包吧(摸摸头),不知道怎么抓包的小伙伴,可以看看之前的Fiddler系列文章。
Fiddler
接口文档是我们测试时最重要的一个依据,一个规范的接口文档至少包括:
1.接口说明;
2.调用URL;
3.请求方法(get、post等);
4.请求参数、参数类型、请求参数说明等;
5.返回参数说明;
如下为一个简单的登录接口文档:
2.分析接口文档的接口,提取测试点
接口测试用例跟常规的功能测试用例基本一样,
可以从接口功能测试、接口业务测试、接口性能测试、接口安全测试等角度考虑。
接口的逻辑校验,可以参照接口流程图来进行设计,一个分支需要作为一个场景去进行测试,需要覆盖到流程图里面所有的逻辑分支。
接口的参数校验,可以参照接口文档中的参数定义去进行验证,需要覆盖到所有参数对应的枚举值以及错误码等信息。
3.接口测试用例设计思路
接口功能的关注点是:
1.接口参数正确与否:接口传入的参数是否有正确填写;
2.接口参数缺失:接口参数有必填、选填参数,传参时,测试参数缺失对结果的影响;
3.接口参数边界值:比如用户名、密码有长度限制,需要测试不同长度的参数对结果的影响;
4.接口参数类型:比如接口文档中用户名为String类型,测试传入其他数据类型对结果的影响。
4.接口测试其他范围
接口业务测试
主要是从业务的角度出发,把接口组合成一条业务链,比如登录之后充值,在数据库中金额是否正确等等
接口的性能测试
是指接口是否满足业务的要求,比如业务要求系统可以满足50个人同时下单,那么下单这个接口就要可以承担50 TPS,目前业内一般使用JMETER去做接口性能测试,jmeter接口性能后续会单独在Jmeter系列文章里介绍。
接口安全测试
接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用。
注意:本文主要涉及接口功能测试,相信做过功能测试的童鞋,设计接口测试用例也是没问题的。
4、接口测试用例实战
以下,我们以登录接口进行实战。
随着代码模块越来越多,混在一起,杂乱无章,这时我们考虑架构分层了,上篇文章:Python接口自动化之requests请求封装,封装的requests请求类,每个用例都要调用,可以放在公共模块里。
在项目下新建一个文件夹common
放入请求模块requests_handler.py
requests_handler.py
import requests
class RequestsHandler:
def __init__(self):
"""session管理器"""
self.session = requests.session()
def visit(self, method, url, params = None, data= None, json= None, headers= None):
result = self.session.request(method,url,params=params,data=data,json=json,headers=headers)
try:
# 返回json结果
return result.json()
except Exception:
return 'not json'
def close_session(self):
self.session.close()
编写登录接口用例,调用封装的请求类。
登录用例,新建一个test_cases文件夹,用来存放用例模块。
test_Login.py
import unittest
from common.requests_handler import RequestsHandler
class LoginTest(unittest.TestCase):
def setUp(self):
# 请求类实例化
self.req = RequestsHandler()
def tearDown(self):
self.req.close_session()
def test_login_success(self):
login_url = 'http://127.0.0.1:8000/user/login'
payload = {
"mobile_phone": "1530272****",
"pwd": "12345678"
}
res = self.req.visit('post',login_url,json=payload)
self.assertEqual(0, res['code'])
if __name__ == '__main__':
unittest.main()
运行结果为:
Ran 1 test in 0.213s
OK
对于用例的一些总结:
setUp, tearDown
前置条件,后置条件,setUp实例化,在运行测试用例前获取session管理器, tearDown,在测试用例执行结束后关闭session管理器。
对于断言
小伙伴们可能不知道到底用返回结果中的哪个字段断言。个人意见,如果code、msg比较详细的话,可以利用code、msg其中一个来断言,当然code、msg一起做断言也可以,甚至你觉得返回结果中某个数据符合你的预期,也是可以拿来断言,断言手段是灵活多变的,自行选择最优方案。
小伙伴们看到总结,退出微信,打开王者荣耀,一气呵成,其实还没完呢,我们写了正向用例,还有异常用例也写两条,更多的异常用例可以自行扩展下。
import unittest
from common.requests_handler import RequestsHandler
class LoginTest(unittest.TestCase):
def setUp(self):
# 请求类实例化
self.req = RequestsHandler()
def tearDown(self):
# 关闭session
self.req.close_session()
def test_login_success(self):
"""
正确手机号,正确密码
"""
login_url = 'http://127.0.0.1:8000/user/login'
payload = {
"mobile_phone": "1530272****",
"pwd": "12345678"
}
res = self.req.visit('post',login_url,json=payload)
# 根据请求结果中的code进行断言
self.assertEqual(0, res['code'])
def test_phone_is_null(self):
"""
手机号为空,密码正确
"""
login_url = 'http://127.0.0.1:8000/user/login'
payload = {
"mobile_phone": "",
"pwd": "12345678"
}
res = self.req.visit('post', login_url, json=payload)
# 根据返回结果中的msg进行断言
self.assertEqual("手机号码为空", res['msg'])
def test_pwd_is_null(self):
"""
正确用户名,密码为空
"""
login_url = 'http://127.0.0.1:8000/user/login'
payload = {
"mobile_phone": "1530272****",
"pwd": ""
}
res = self.req.visit('post', login_url, json=payload)
# 根据返回结果中的msg进行断言
self.assertEqual("密码为空", res['msg'])
if __name__ == '__main__':
unittest.main()
测试结果为:
Ran 3 tests in 0.259s
OK
以上代码如下痛点:
用例和数据未分离,维护成本大。可以数据与测试脚本分离,使用Excel存放测试用例,方便维护。
仔细研究发现正向用例、异常用例,只是传入的数据不一样,其他都是通用
这种情况下,我们可以引入ddt数据驱动,减少代码量。
来源:https://blog.csdn.net/ZangKang1/article/details/119426771
猜你喜欢
- 什么是LSTM1、LSTM的结构我们可以看出,在n时刻,LSTM的输入有三个:当前时刻网络的输入值Xt;上一时刻LSTM的输出值ht-1;上
- photoshop快捷键大全: 工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)相关文章:网页设计软件FrontPag
- var a= new Array(new Array(1,2),new Array('b','c')); d
- 工厂方法(Factory Method)模式又称为虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphi
- 本文主要介绍了Python3中PyQt5简单实现文件打开及保存,分享给大家,具体如下:# -*- coding: utf-8 -*-# Fo
- asp之家注:如果你学习过asp,并且在网络公司上过班,一定会接触到网购系统,网购系统可以说是一个典型的程序类型,而其中最重要,也是最关键的
- mktime()方法是localtime()反函数。它的参数是struct_time或全9元组,它返回一个浮点数,为了兼容时ti
- 级联查询在ORACLE 数据库中有一种方法可以实现级联查询select * //要查询的字段from table
- 应用场景:工作中经常遇到大量的数据需要整合、去重、按照特定格式导出等情况。如果用 Excel 操作,不仅费时费力,还不准确,有么有更高效的解
- 对于什么是好设计,一万个人那里至少有一万零一个答案。每个人都有自己的答案,有的人还不止一个答案。老师说,一定要在设计里灌注自己的思想,有了自
- 目录wsgi 相关概念CGIWSGIASGIcgi 示例cgi脚本cgi服务实现wsgirefwsgi 小结小技巧python web开发中
- 内置方法 说明 __init__(self,...) 初始化对象,在创建新对象时调用 __del__(self) 释放对
- 前言:由于公司使用钉钉,之前告警都是使用邮箱,但是这种协同效率比较低,所以调用钉钉机器人来实现实时告警。创建机器人:创建钉钉群,然后添加群机
- TXT文本文件,WORD文档点击后弹出另存为对话框,然后保存下载,而不是在浏览器中打开的asp实现方法,使用了asp中的stream对象,同
- GitHub : https://github.com/jayknoxqu/id-number-util身份组成方式中华人民共和国国家标准G
- 结果然后直接放源码:import cv2 as cvsource = cv.imread("zhaopian.jpg")
- 本文实例讲述了php tpl模板引擎定义与使用。分享给大家供大家参考,具体如下:tpl.php<?phpnamespace tpl;/
- 为cd2sc.com网站功能而开发,代码为本人原创,生成速度一般。 (出于众所周知的原因,涉及到数据库的数据字段名称做了改动,并且为了代码明
- 代码如下:arr = array(12,52,14,43,24,58,15,64,24,57,17,56,45)&nbs
- 近日,朋友写一个关于成绩管理的系统,其中遇到一个小问题。如果按照SQLSERVER的ORDER 排序时,比如遇到两个100分,结果必然是名次