api测试用例(编写思路)
在API的自动化测试维度中,测试维度分为两个维度,一个是单独的对API的验证,客户端发送一个请求后,服务端得到客户端的请求并且响应回复给客户端;
另外一个维度是基于业务场景的测试,基于业务场景的也就是说编编写的API的测试用例是基于产品的业务逻辑。
抛开两个维度的思考点,作为测试团队的工作内容,首先要保障产品的业务逻辑是可以使用的,只要这样,产品才能够给客户带来价值,
在基本的业务逻辑稳定的基础上,再一步需要思考的是整个系统的稳定性,抗压性和系统的承载负载的能力。
那么在工程效率的角度上来思考,使用代码或者工具都不是核心,核心是如何使用这些工具或者代码来提升测试的效率,
优化研发的流程,并持续的改进,从而达到过程中的改进。不管工具还是代码,对产品完整性的测试,
都要考虑产品的业务逻辑,也就是产品的场景,而如何通过API的自动化测试方式来达到产品的业务场景的测试。
如下的案例代码业务为依据接口可以获取到所有的书籍信息,可以创建数据,查看某一本书的信息,修改它的信息和删除书籍,案例代码为:
#!/usr/bin/env python
# -*-coding:utf-8 -*-
from flask import Flask,redirect,render_template,url_for,request,jsonify,abort,make_response
from flask_restful import Resource,Api
from flask_httpauth import HTTPBasicAuth app=Flask(__name__)
api=Api(app=app) auth=HTTPBasicAuth() @auth.get_password
def get_password(name):
if name=='wuya':
return 'admin'
@auth.error_handler
def authorized():
return make_response(jsonify({'error':'请认证'}),401) books=[
{
'id':1,
'author':'无涯',
'name':'Python自动化测试实战',
"done":True
},
{
'id': 2,
"aurhor":"无涯",
'name': 'Python测试开发实战',
"done":False
}
] class BooksApi(Resource):
def get(self):
return jsonify(books) def post(self):
if not request.json or not 'author' in request.json:
abort(400)
book={
'id': books[-1]['id'] + 1,
# 'author':request.json['author'],
'author': request.json.get('author'),
'name': request.json.get('name'),
'done': False
}
books.append(book)
return jsonify({"status":0,'msg':'创建书籍成功','datas':book}) class BookApi(Resource):
def get(self,book_id):
book=list(filter(lambda t:t['id']==book_id,books))
if len(book)==0:
abort(400)
else:
return jsonify({'status':0,'msg':'ok','datas':book}) def put(self,book_id):
book=list(filter(lambda t:t['id']==book_id,books))
if len(book)==0:
abort(404)
elif not request.json:
abort(400)
elif 'author' not in request.json:
abort(400)
elif 'done' not in request.json and type(request.json['done']) is not bool:
abort(400)
book[0]['author']=request.json.get('author',book[0]['author'])
book[0]['name'] = request.json.get('name', book[0]['name'])
book[0]['done'] = request.json.get('done', book[0]['done'])
return jsonify({'status':0,'msg':'修改成功','datas':book}) def delete(self,book_id):
book = list(filter(lambda t: t['id'] == book_id, books))
if len(book)==0:
abort(404)
books.remove(book[0])
return jsonify({'status':1001,'msg':'删除成功'}) api.add_resource(BooksApi,'/v1/api/books',endpoint='/v1/api/books')
api.add_resource(BookApi,'/v1/api/book/<int:book_id>') if __name__ == '__main__':
app.run(debug=True)
依据上面的信息,涉及到的测试点非常多,但是主要可以考虑这么几点,分别是创建书籍信息,查看创建的书籍信息,对创建的书籍信息进行修改,和最后删除创建的书籍信息,
那么编写这样的API测试用例的编写,也可以从两个维度思考,第一个维度是基于业务场景,也就是说编写的API测试使例它是有顺序的,分别是创建,查看,修改,和删除,见API的测试代码:
#!/usr/bin/python3
#coding:utf-8
import pytest
import requests def writeBook(bookID):
with open('bookID','w') as f:
f.write(bookID) def readBookID():
with open('bookID','r') as f:
return int(f.read()) def test_001_addBook():
'''创建书籍'''
dict1={"author":"无涯","name":"Python自动化测试实战","done":True}
r=requests.post(
url='http://127.0.0.1:5000/v1/api/books',
json=dict1)
writeBook(str(r.json()['datas']['id']))
assert r.json()['datas']['author']=='无涯'
def test_002_queryBook():
'''查看创建的书籍信息'''
r=requests.get(
url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()))
assert r.json()['datas'][0]['id']==readBookID() def test_003_setBook():
'''修改书籍信息'''
dict1 = {"author": "无涯课堂", "name": "Python自动化测试实战", "done": True}
r=requests.put(
url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()),
json=dict1)
assert r.json()['datas'][0]['author']=='无涯课堂'
def test_004_delBook():
'''删除书籍信息'''
r=requests.delete(
url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()))
assert r.json()['status']==1001
查看如上的测试代码后,可以看到刚才说的测试场景都已包含进去。
依据执行后输出的结果信息,可以看到它是按我们设计的顺序的,这样的测试点符合我们的设计思路,
但是存在的缺点也是,比如业务逻辑发生变化,可以批量添加课程,那么这个测试点应该放在哪里了?
按照之前的设计思路,只能放在第二位,因为测试用例它是按顺序执行的,很显然它会打乱已经有的执行顺序,
当然对链路很长的测试点来说,这样写也没什么错误。
下面再看另外一种思路,就是测试用例之间是没有顺序的,这样就可以很好的解决上面说的,
批量增加,批量修改或者批量删除也好,测试点是无顺序的,所以增加或者建=减少测试点,也是无所谓的。
修改后的测试点见如下:
#!/usr/bin/python3
#coding:utf-8
import pytest
import requests def writeBook(bookID):
with open('bookID','w') as f:
f.write(bookID) def readBookID():
with open('bookID','r') as f:
return int(f.read()) def addBook():
dict1={"author":"无涯","name":"Python自动化测试实战","done":True}
r=requests.post(
url='http://127.0.0.1:5000/v1/api/books',
json=dict1)
writeBook(str(r.json()['datas']['id']))
return r def queryBook():
r=requests.get(
url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()))
return r def setBook():
dict1 = {"author": "无涯课堂", "name": "Python自动化测试实战", "done": True}
r=requests.put(
url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()),
json=dict1)
return r def delBook():
r=requests.delete(
url='http://127.0.0.1:5000/v1/api/book/{0}'.format(readBookID()))
return r def test_addBook():
'''创建书籍'''
r=addBook()
delBook()
assert r.json()['datas']['author']=='无涯'
def test_queryBook():
'''查看创建的书籍信息'''
addBook()
r=queryBook()
delBook()
assert r.json()['datas'][0]['id']==readBookID() def test_updateBook():
'''修改书籍信息'''
addBook()
r=setBook()
delBook()
assert r.json()['datas'][0]['author']=='无涯课堂'
def test_delBook():
'''删除书籍信息'''
addBook()
r=delBook()
assert r.json()['status']==1001
修改后的测试用例之间执行是无顺序的,我们并不在乎哪个测试点先执行,哪个后执行,
每个测试点之间都是独立的,也不互相依赖同时也是基于业务场景的测试。
api测试用例(编写思路)的更多相关文章
- API接口测试用例编写规则(转载)
API接口测试用例编写规则 (1)必需参数覆盖.对于接口的参数,接口文档一般都会说明哪些儿是必需的,哪儿是非必需的.对于必需的参数,一定要测试传参数和不传参数接口是否报错? (2)必需的参数各种情况覆 ...
- TestNG使用教程详解(接口测试用例编写与断言)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/sinat_34766121/artic ...
- python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)
经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路. 我们在百度搜索天气查询,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接 ...
- Effective Java 第三版——56. 为所有已公开的API元素编写文档注释
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- AngularJS使用OData请求ASP.NET Web API资源的思路
本篇整理AngularJS使用OData请求ASP.NET Web API资源的思路. 首先给ASP.NET Web API插上OData的翅膀,通过NuGet安装OData. 然后,给control ...
- API Studio 5.1.2 版本更新:加入全局搜索、支持批量测试API测试用例、读取代码注解生成文档支持Github与码云等
最近在EOLINKER的开发任务繁重,许久在博客园没有更新产品动态了,经过这些日子,EOLINKER又有了长足的进步,增加了更多易用的功能,比如加入全局搜索.支持批量测试API测试用例.读取代码注解生 ...
- Shell编程——脚本编写思路与过程
Linux系统Shell编程——脚本编写思路与过程 “ 前段时间有小伙伴问我一些问题,涉及到shell脚本的编写问题,事后,我深入思考了下,实际生产环境的确也会经常用到,因此如何写这个脚本?它的思路在 ...
- 这可能是你少有的能get到测试用例编写精髓的机会!
自动化测试用例的编写是实现项目自动化的核心,合理的用例设计是保证自动化效益和实用性的关键,也直接决定了自动化脚本是否具备可扩展和可维护性.由此,本篇文章主要为大家介绍了测试用例编写的规范和注意事项. ...
- 调用手机话费充值API的SDK编写思路
思路 通过将SDK方法中返回的数据划分为正常返回数据以及错误返回的数据两部分,让调用者更简单的对接口调用错误进行处理. 将SDK调用第三方服务接口的流程划分为: 数据准备,http请求,结果处理三部分 ...
随机推荐
- [gcd]Codeforces Common Divisors
Common Divisors time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- PAT 乙级 1007. 素数对猜想 (20) c++ 筛选法求素数
PAT 乙级 1007. 素数对猜想 (20) c++ 筛选法求素数 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数 ...
- Leetcode——二叉树常考算法整理
二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...
- imread()用法|| root权限
1.ushort用法? USHORT is a macro which is not part of the official C++ language (it's probably defined ...
- 成为视频分析专家:自动生成视频集锦(Python实现)
介绍 我是个超级板球迷.从我记事起,我就迷上了这项运动,至今它仍在我的日常生活中起着重要的作用.我相信很多读到这篇文章的人都会点头! 但是自从我开始工作以来,要跟上所有的比赛就成了一件棘手的事.我不能 ...
- centos7单机安装kafka
基础要求操作系统:CentOS 7x 64位 kafka版本:kafka_2.11-0.8.2.1 #安装使用的jdk以及kafka的包我放到百度云了,需要自取. # 链接:https://pan.b ...
- 【python系统学习11】循环语句里的F4
循环语句里的F4 深入了解下四个新语句,分别是:continue.break.pass.else以及他们搭配for.while循环等语句时,所产生的化学反应. else 由于continue.brea ...
- element的多文件上传
项目需求: 可上传多个文件 可删除 文件过大时用户输入可上传至其他网站,并将文件名和地址上传至本网站 问题点: 大文件用户输入内容无法合并到已上传文件的列表进行展示 上传多个大文件地址时前面已上传的大 ...
- NKOJ3775 数列操作
问题描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. 输入格式 第一行包含三个整数n ...
- Java并发基础01. 传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...