多测师是一家拥有先进的教学理念,强大的师资团队,业内好评甚多的接口自动化测试培训机构!

18529529812

联系电话

您现在所在位置:接口自动化测试培训 > 新闻资讯

接口自动化之登录接口测试

更新时间:2021-10-26 01:28:57 作者:admin 浏览:201

接口自动化之登录接口测试

  什么是接口?

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

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

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

  因此,可以分析,系统间的接口包含三部分:输入、处理逻辑、输出。

  如何开展接口测试?

  (1)接口测试流程如下:

  (2)需求评审,熟悉业务和需求;

  (3)开发提供API接口文档;

  (4)根据开发交付的接口文档,编写接口测试用例;

  (5)接口测试用例评审;

  (6)开始执行接口测试;

  (7)提交测试报告;

接口自动化之登录接口测试

  如何设计接口用例?

  1.获取接口文档

  一般公司的开发会提供接口文档,没有接口文档的自行抓包吧(摸摸头),不知道怎么抓包的小伙伴,可以看看公众号的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三个机制展开设计,保证接口的数据不会被篡改和重复调用。

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

  接口测试用例实战

  以下,我们以登录接口进行实战。

  随着代码模块越来越多,混在一起,杂乱无章,这时我们考虑架构分层了,上篇文章: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://www.aichudan.com/

联系电话

18529529812

返回顶部