API测试用例的编写

在API的自动化测试维度中,测试维度分为两个维度,一个是单独的对API的验证,客户端发送一个请求后,服务端得到客户端的请求并且响应回复给客户端;另外一个维度是基于业务场景的测试,基于业务场景的也就是说编编写的API的测试用例是基于产品的业务逻辑,关于这点在我出版的书《Python自动化测试实战》测试案例实战中都有丰富的代码案例,

这里就不详细的再说明。抛开两个维度的思考点,作为测试团队的工作内容,首先要保障产品的业务逻辑是可以使用的,只要这样,产品才能够给客户带来价值,在基本的业务逻辑稳定的基础上,再一步需要思考的是整个系统的稳定性,抗压性和系统的承载负载的能力。

那么在工程效率的角度上来思考,使用代码或者工具都不是核心,核心是如何使用这些工具或者代码来提升测试的效率,优化研发的流程,并持续的改进,从而达到过程中的改进。

不管工具还是代码,对产品完整性的测试,都要考虑产品的业务逻辑,也就是产品的场景,而如何通过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

修改后的测试用例之间执行是无顺序的,我们并不在乎哪个测试点先执行,哪个后执行,每个测试点之间都是独立的,也不互相依赖同时也是基于业务场景的测试。

谢谢您的关注和阅读,您也可购买无涯作者得原创书籍或者实战视频课程学习附京东&当当链接

脚本:无涯

图片:无涯

来源:无涯


 / END.

猪圈子

微信号:shichaogg

推荐理由:

致力于python爬虫系列及其他python相关经典好文集中地,以及程序员娱乐生活圈趣事分享(小编从业测试岗位四年SAAS平台+一年电商平台测试相关工作)积极分享趣事的90后免费领取学习资料 ,关注后,后台回复"测试"python"

▼长按下方↓↓↓二维码识别关注

搜索微信:shichaogg 

部分图片来源于网络,如有侵权请联系小编删除


告诉你的朋友分享他人/朋友圈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值