Python接口自动化之登陆接口测试

VOL 117

29前端

2020-04web

今天距2020年246天数据库

这是ITester软件测试小栈第117次推文json


点击上方蓝字“ITester软件测试小栈“关注我,每周早上 07:30准时推送。后端


微信公众号后台回复“资源测试工具包”领取测试资源,回复“21天打卡”一块儿学习成长,打怪升级。跨域


本文4829字,阅读约需13分钟安全





在上一篇Python接口自动化测试系列文章:Python接口自动化之unittest单元测试主要介绍单元测试,unittest模块特性、大体流程、源码及实战例子微信


如下主要介绍接口概念、接口用例设计及登陆接口测试实战。cookie


                                            


01session

什么是接口?


接口:检测外部系统与系统之间以及内部各个子系统之间的交互点。


通俗来讲,接口就是链接先后端的桥梁,接口测试能够简单理解为脱离了前端的功能测试。一个又一个的接口就对应功能测试内一个又一个的功能。但注意,一个功能有可能不是一个接口就能实现。


那么,接口测试和功能测试的区别在哪呢?其实功能测试就是在页面上输入咱们的参数值,点点点;而接口测试没有前端,而是经过接口文档上的调用地址、请求参数等,校验返回的结果值,也就是说,接口能够当作没有界面的功能测试


所以,能够分析,系统间的接口包含三部分:输入处理逻辑输出





02

如何开展接口测试?

接口测试流程以下:

1.需求评审,熟悉业务和需求;

2.开发提供API接口文档;

3.根据开发交付的接口文档,编写接口测试用例;

4.接口测试用例评审;

5.开始执行接口测试;

6.提交测试报告;




03

如何设计接口用例?


1.获取接口文档

通常公司的开发会提供接口文档,没有接口文档的自行抓包吧(摸摸头),不知道怎么抓包的小伙伴,能够看看公众号的Fiddler系列文章。


接口文档是咱们测试时最重要的一个依据,一个规范的接口文档至少包括

1.接口说明;

2.调用URL;

3.请求方法(get、post等);

4.请求参数、参数类型、请求参数说明等;

5.返回参数说明;

以下为一个简单的登陆接口文档:


2.分析接口文档的接口,提取测试点

接口测试用例跟常规的功能测试用例基本同样,能够从接口功能测试、接口业务测试、接口性能测试、接口安全测试等角度考虑。


接口的逻辑校验,能够参照接口流程图来进行设计,一个分支须要做为一个场景去进行测试,须要覆盖到流程图里面全部的逻辑分支。


接口的参数校验,能够参照接口文档中的参数定义去进行验证,须要覆盖到全部参数对应的枚举值以及错误码等信息。



3.接口测试用例设计思路

接口功能的关注点是:

1.接口参数正确与否:接口传入的参数是否有正确填写;

2.接口参数缺失:接口参数有必填、选填参数,传参时,测试参数缺失对结果的影响;

3.接口参数边界值:好比用户名、密码有长度限制,须要测试不一样长度的参数对结果的影响;

4.接口参数类型:好比接口文档中用户名为String类型,测试传入其余数据类型对结果的影响。


4.接口测试其余范围

  • 接口业务测试

主要是从业务的角度出发,把接口组合成一条业务链,好比登陆以后充值,在数据库中金额是否正确等等

                                                 

  • 接口的性能测试

是指接口是否知足业务的要求,好比业务要求系统能够知足50我的同时下单,那么下单这个接口就要能够承担50 TPS,目前业内通常使用JMETER去作接口性能测试,jmeter接口性能后续会单独在Jmeter系列文章里介绍。


  • 接口安全测试

接口的安全性主要围绕TokenTimestampSign三个机制展开设计,保证接口的数据不会被篡改和重复调用。


注意:本文主要涉及接口功能测试,相信作过功能测试的童鞋,设计接口测试用例也是没问题的。




04

接口测试用例实战


如下,咱们以登陆接口进行实战。

随着代码模块愈来愈多,混在一块儿,杂乱无章,这时咱们考虑架构分层了,上篇文章: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数据驱动,减小代码量。


总结:以上主要介绍了接口概念、接口用例设计及登陆接口用例实战。

下一篇:Excel存放用例及封装类读取Excel数据。



以上

That‘s all
更多系列文章
敬请期待


ITester软件测试小栈
往期内容宠幸


1. Python接口自动化-接口基础(一)

2.Python接口自动化-接口基础(二)


3.Python接口自动化-requests模块之get请求


4. Python接口自动化-requests模块之post请求

5.Python接口自动化之cookie、session应用


6.Python接口自动化之Token详解及应用


7.Python接口自动化之requests请求封装


8.Fiddler设置断点(一)


9.Fiddler抓包详解


10.Fiddler跨域调试及Django跨域处理

快来 星标 置顶 关注

<<  滑动查看下一张图片  >>

今日问题:
在接口自动化测试项目中,你是如何设计测试用例的? 
(欢迎在下方留言区发表你的见解)



 后台 回复" 资源" 取干货
回复" 21天打卡" 一块儿打怪升级

测试交流Q群:727998947


点亮一下在看,你更好看

本文分享自微信公众号 - ITester软件测试小栈(ITestingA)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索