在API的自动化测试维度中,测试维度分为两个维度,一个是单独的对API的验证,客户端发送一个请求后,服务端得到客户端的请求并且响应回复给客户端;

另外一个维度是基于业务场景的测试,基于业务场景的也就是说编编写的API的测试用例是基于产品的业务逻辑。

抛开两个维度的思考点,作为测试团队的工作内容,首先要保障产品的业务逻辑是可以使用的,只要这样,产品才能够给客户带来价值,

在基本的业务逻辑稳定的基础上,再一步需要思考的是整个系统的稳定性,抗压性和系统的承载负载的能力。

那么在工程效率的角度上来思考,使用代码或者工具都不是核心,核心是如何使用这些工具或者代码来提升测试的效率,

优化研发的流程,并持续的改进,从而达到过程中的改进。不管工具还是代码,对产品完整性的测试,

都要考虑产品的业务逻辑,也就是产品的场景,而如何通过API的自动化测试方式来达到产品的业务场景的测试。

如下的案例代码业务为依据接口可以获取到所有的书籍信息,可以创建数据,查看某一本书的信息,修改它的信息和删除书籍,案例代码为:

  1. #!/usr/bin/env python
  2. # -*-coding:utf-8 -*-
  3. from flask import Flask,redirect,render_template,url_for,request,jsonify,abort,make_response
  4. from flask_restful import Resource,Api
  5. from flask_httpauth import HTTPBasicAuth
  6.  
  7. app=Flask(__name__)
  8. api=Api(app=app)
  9.  
  10. auth=HTTPBasicAuth()
  11.  
  12. @auth.get_password
  13. def get_password(name):
  14. if name=='wuya':
  15. return 'admin'
  16. @auth.error_handler
  17. def authorized():
  18. return make_response(jsonify({'error':'请认证'}),401)
  19.  
  20. books=[
  21. {
  22. 'id':1,
  23. 'author':'无涯',
  24. 'name':'Python自动化测试实战',
  25. "done":True
  26. },
  27. {
  28. 'id': 2,
  29. "aurhor":"无涯",
  30. 'name': 'Python测试开发实战',
  31. "done":False
  32. }
  33. ]
  34.  
  35. class BooksApi(Resource):
  36. def get(self):
  37. return jsonify(books)
  38.  
  39. def post(self):
  40. if not request.json or not 'author' in request.json:
  41. abort(400)
  42. book={
  43. 'id': books[-1]['id'] + 1,
  44. # 'author':request.json['author'],
  45. 'author': request.json.get('author'),
  46. 'name': request.json.get('name'),
  47. 'done': False
  48. }
  49. books.append(book)
  50. return jsonify({"status":0,'msg':'创建书籍成功','datas':book})
  51.  
  52. class BookApi(Resource):
  53. def get(self,book_id):
  54. book=list(filter(lambda t:t['id']==book_id,books))
  55. if len(book)==0:
  56. abort(400)
  57. else:
  58. return jsonify({'status':0,'msg':'ok','datas':book})
  59.  
  60. def put(self,book_id):
  61. book=list(filter(lambda t:t['id']==book_id,books))
  62. if len(book)==0:
  63. abort(404)
  64. elif not request.json:
  65. abort(400)
  66. elif 'author' not in request.json:
  67. abort(400)
  68. elif 'done' not in request.json and type(request.json['done']) is not bool:
  69. abort(400)
  70. book[0]['author']=request.json.get('author',book[0]['author'])
  71. book[0]['name'] = request.json.get('name', book[0]['name'])
  72. book[0]['done'] = request.json.get('done', book[0]['done'])
  73. return jsonify({'status':0,'msg':'修改成功','datas':book})
  74.  
  75. def delete(self,book_id):
  76. book = list(filter(lambda t: t['id'] == book_id, books))
  77. if len(book)==0:
  78. abort(404)
  79. books.remove(book[0])
  80. return jsonify({'status':1001,'msg':'删除成功'})
  81.  
  82. api.add_resource(BooksApi,'/v1/api/books',endpoint='/v1/api/books')
  83. api.add_resource(BookApi,'/v1/api/book/<int:book_id>')
  84.  
  85. if __name__ == '__main__':
  86. app.run(debug=True)

依据上面的信息,涉及到的测试点非常多,但是主要可以考虑这么几点,分别是创建书籍信息,查看创建的书籍信息,对创建的书籍信息进行修改,和最后删除创建的书籍信息,

那么编写这样的API测试用例的编写,也可以从两个维度思考,第一个维度是基于业务场景,也就是说编写的API测试使例它是有顺序的,分别是创建,查看,修改,和删除,见API的测试代码:

  1. #!/usr/bin/python3
  2. #coding:utf-8
  3. import pytest
  4. import requests
  5.  
  6. def writeBook(bookID):
  7. with open('bookID','w') as f:
  8. f.write(bookID)
  9.  
  10. def readBookID():
  11. with open('bookID','r') as f:
  12. return int(f.read())
  13.  
  14. def test_001_addBook():
  15. '''创建书籍'''
  16. dict1={"author":"无涯","name":"Python自动化测试实战","done":True}
  17. r=requests.post(
  18. url='http://127.0.0.1:5000/v1/api/books',
  19. json=dict1)
  20. writeBook(str(r.json()['datas']['id']))
  21. assert r.json()['datas']['author']=='无涯'
  22. def test_002_queryBook():
  23. '''查看创建的书籍信息'''
  24. r=requests.get(
  25. url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()))
  26. assert r.json()['datas'][0]['id']==readBookID()
  27.  
  28. def test_003_setBook():
  29. '''修改书籍信息'''
  30. dict1 = {"author": "无涯课堂", "name": "Python自动化测试实战", "done": True}
  31. r=requests.put(
  32. url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()),
  33. json=dict1)
  34. assert r.json()['datas'][0]['author']=='无涯课堂'
  35. def test_004_delBook():
  36. '''删除书籍信息'''
  37. r=requests.delete(
  38. url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()))
  39. assert r.json()['status']==1001

查看如上的测试代码后,可以看到刚才说的测试场景都已包含进去。

依据执行后输出的结果信息,可以看到它是按我们设计的顺序的,这样的测试点符合我们的设计思路,

但是存在的缺点也是,比如业务逻辑发生变化,可以批量添加课程,那么这个测试点应该放在哪里了?

按照之前的设计思路,只能放在第二位,因为测试用例它是按顺序执行的,很显然它会打乱已经有的执行顺序,

当然对链路很长的测试点来说,这样写也没什么错误。

下面再看另外一种思路,就是测试用例之间是没有顺序的,这样就可以很好的解决上面说的,

批量增加,批量修改或者批量删除也好,测试点是无顺序的,所以增加或者建=减少测试点,也是无所谓的。

修改后的测试点见如下:

  1. #!/usr/bin/python3
  2. #coding:utf-8
  3. import pytest
  4. import requests
  5.  
  6. def writeBook(bookID):
  7. with open('bookID','w') as f:
  8. f.write(bookID)
  9.  
  10. def readBookID():
  11. with open('bookID','r') as f:
  12. return int(f.read())
  13.  
  14. def addBook():
  15. dict1={"author":"无涯","name":"Python自动化测试实战","done":True}
  16. r=requests.post(
  17. url='http://127.0.0.1:5000/v1/api/books',
  18. json=dict1)
  19. writeBook(str(r.json()['datas']['id']))
  20. return r
  21.  
  22. def queryBook():
  23. r=requests.get(
  24. url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()))
  25. return r
  26.  
  27. def setBook():
  28. dict1 = {"author": "无涯课堂", "name": "Python自动化测试实战", "done": True}
  29. r=requests.put(
  30. url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()),
  31. json=dict1)
  32. return r
  33.  
  34. def delBook():
  35. r=requests.delete(
  36. url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()))
  37. return r
  38.  
  39. def test_addBook():
  40. '''创建书籍'''
  41. r=addBook()
  42. delBook()
  43. assert r.json()['datas']['author']=='无涯'
  44. def test_queryBook():
  45. '''查看创建的书籍信息'''
  46. addBook()
  47. r=queryBook()
  48. delBook()
  49. assert r.json()['datas'][0]['id']==readBookID()
  50.  
  51. def test_updateBook():
  52. '''修改书籍信息'''
  53. addBook()
  54. r=setBook()
  55. delBook()
  56. assert r.json()['datas'][0]['author']=='无涯课堂'
  57. def test_delBook():
  58. '''删除书籍信息'''
  59. addBook()
  60. r=delBook()
  61. assert r.json()['status']==1001

修改后的测试用例之间执行是无顺序的,我们并不在乎哪个测试点先执行,哪个后执行,

每个测试点之间都是独立的,也不互相依赖同时也是基于业务场景的测试。

api测试用例(编写思路)的更多相关文章

  1. API接口测试用例编写规则(转载)

    API接口测试用例编写规则 (1)必需参数覆盖.对于接口的参数,接口文档一般都会说明哪些儿是必需的,哪儿是非必需的.对于必需的参数,一定要测试传参数和不传参数接口是否报错? (2)必需的参数各种情况覆 ...

  2. TestNG使用教程详解(接口测试用例编写与断言)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/sinat_34766121/artic ...

  3. python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

    经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路. 我们在百度搜索天气查询,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接 ...

  4. Effective Java 第三版——56. 为所有已公开的API元素编写文档注释

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  5. AngularJS使用OData请求ASP.NET Web API资源的思路

    本篇整理AngularJS使用OData请求ASP.NET Web API资源的思路. 首先给ASP.NET Web API插上OData的翅膀,通过NuGet安装OData. 然后,给control ...

  6. API Studio 5.1.2 版本更新:加入全局搜索、支持批量测试API测试用例、读取代码注解生成文档支持Github与码云等

    最近在EOLINKER的开发任务繁重,许久在博客园没有更新产品动态了,经过这些日子,EOLINKER又有了长足的进步,增加了更多易用的功能,比如加入全局搜索.支持批量测试API测试用例.读取代码注解生 ...

  7. Shell编程——脚本编写思路与过程

    Linux系统Shell编程——脚本编写思路与过程 “ 前段时间有小伙伴问我一些问题,涉及到shell脚本的编写问题,事后,我深入思考了下,实际生产环境的确也会经常用到,因此如何写这个脚本?它的思路在 ...

  8. 这可能是你少有的能get到测试用例编写精髓的机会!

    自动化测试用例的编写是实现项目自动化的核心,合理的用例设计是保证自动化效益和实用性的关键,也直接决定了自动化脚本是否具备可扩展和可维护性.由此,本篇文章主要为大家介绍了测试用例编写的规范和注意事项. ...

  9. 调用手机话费充值API的SDK编写思路

    思路 通过将SDK方法中返回的数据划分为正常返回数据以及错误返回的数据两部分,让调用者更简单的对接口调用错误进行处理. 将SDK调用第三方服务接口的流程划分为: 数据准备,http请求,结果处理三部分 ...

随机推荐

  1. Java中如何调用静态方法

    Java中如何调用静态方法: 1.如果想要调用的静态方法在本类中,可直接使用方法名调用 2.调用其他类的静态方法,可使用类名.方法名调用 关于静态方法能被什么调用 1.实例方法 2.静态发放

  2. mac 中使用git 和pycharm提交项目

    一.安装Git 1.验证git是否安装: 终端中输入: git 如果安装过出现: 2.安装git: 进入https://git-scm.com: 点击 Download 2.23.0 for Mac ...

  3. RbbitMQ详解

    高性能消息队列RabbitMQ 1.为什么要使用mq 主要解决应用解耦,流量削峰,异步消息,实现高性能,可升缩,最终一致性的架构. 2.activeMq的通讯模式 基于队列(点对点)与发布订阅(有多个 ...

  4. Day20-tomcat

    tomcat 一.Java及tomcat简介 二.安装JDK及tomcat 1.安装jdk 安装jdk很简单,首先下载网上的jdk安装包,我这边下载的是jdk-8u221-linux-x64.tar. ...

  5. mysql慢查询分析工具比较与实战

    00 前言 在进行mysql性能优化的时候,第一个想到的便是查看慢sql. 但是对于慢sql有没有什么好的工具进行分析呢? 推荐两个工具mysqldumpslow及pt-query-digest. m ...

  6. mysql清空表后id重1开始

    通过"truncate table 表名"方式重置清空id,让id从1开始自动递增,

  7. jdk1.8 新特性之Stream

    --------------------- 作者:码农农码一生 来源:CSDN 原文:https://blog.csdn.net/chenhao_c_h/article/details/8069128 ...

  8. CentOS 7 Docker安装

    1. uname -a 查询机器信息,确保CPU为64位,且Linux内核在3.10版本以上 2. 更新yum包: yum update 3. 在 /etc/yum.repos.d下创建 docker ...

  9. 天天写order by,你知道Mysql底层执行原理吗?

    前言 文章首发于微信公众号[码猿技术专栏]. 在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求,但是你真的理解order by在 Mysql 底层是如何执行的吗? 假设你要查询城市是苏州 ...

  10. 使用tap、Fragment等相关相关知识点。实现类似微信的界面

    实验结果,可以实现通过左右活动来切换不同的界面.也可以通过点击不同的下方按钮来实现切换不同的界面. 自己也添加了相关的自己编写的小页面来展示相关的效果.主要的是对于碎片Fragment对于tap的相关 ...