Python+unittestrequest+实现接口测试集成实例

****

1、为什么要写代码实现接口自动化

大家知道很多接口测试工具可以实现对接口的测试,如postman、jmeter、fiddler等等,而且使用方便,那么为什么还要写代码实现接口自动化呢?工具虽然方便,但也不足之处:

测试数据不可控制

接口测试本质是对数据的测试,调用接口,输入一些数据,随后,接口返回一些数据。验证接口返回数据的正确性。在用工具运行测试用例之前不得不手动向数据库中插入测试数据。这样我们的接口测试是不是就没有那么“自动化了”。

无法测试加密接口

这是接口测试工具的一大硬伤,如我们前面开发的接口用工具测试完全没有问题,但遇到需要对接口参 数进行加密/解密的接口,例如 md5、base64、AES 等常见加密方式. 又或者接口的参数需要使用时间戳,也是工具很难模拟的。

扩展能力不足

当我们在享受工具所带来的便利的同时,往往也会受制于工具所带来的局限。例如,我想将测试结果生 成 HMTL 格式测试报告,我想将测试报告发送到指定邮箱。我想对接口测试做定时任务。我想对接口测试做持续集成。这些需求都是工具难以实现的。

2、接口自动化测试设计

1.接口测试调用过程,增加了测试数据库

一般的 接口工具 测试过程:

1、接口工具调用被测系统的接口(传参 username=“zhangsan”)。

2、系统接口根据传参(username=“zhangsan”)向 正式数据库 中查询数据。

3、将查询结果组装成一定格式的数据,并返回给被调用者。

4、人工或通过工具的断言功能检查接口测试的正确性。

接口自动化测试项目,为了使接口测试对数据变得可控,测试过程如下:

1、接口测试项目先向 测试数据库 中插入测试数据(zhangsan 的个人信息)。

2、调用被测系统接口(传参 username=“zhangsan”)。

3、系统接口根据传参(username=“zhangsan”)向测试数据库中进行查询并得到 zhangsan 个人信息。

4、将查询结果组装成一定格式的数据,并返回给被调用者。

5、通过单元测试框架断言接口返回的数据(zhangsan 的个人信息),并生成测试报告。

为了使正式数据库的数据不被污染,建议使用独立的 测试数据库 。

2.requests库

Requests 使用的是 urllib3,因此继承了它的所有特性。Requests 支持 HTTP 连接保持和连接池 ,支持 使用cookie保持会话 ,支持 文件上传 ,支持 自动确定响应内容的编码。具体可看官方文档:http://2.python-requests.org/zh_CN/latest/user/quickstart.html

3、接口测试代码示例

下面以之前用 python+django 开发的用户签到系统为背景,展示接口测试的代码。

为什么开发接口?开发的接口主要给谁来用?

前端和后端分离是近年来 Web 应用开发的一个发展趋势。这种模式将带来以下优势:

1、后端可以不用必须精通前端技术(HTML/JavaScript/CSS),只专注于数据的处理,对外提供 API 接口。

2、前端的专业性越来越高,通过 API 接口获取数据,从而专注于页面的设计。

3、前后端分离增加接口的应用范围,开发的接口可以应用到 Web 页面上,也可以应用到移动 APP 上。

在这种开发模式下,接口测试工作就会变得尤为重要了。

使用unittest单元测试框架开发接口测试用例

通过POST请求接收发布会参数:设备号、教练id、名字、手机号、城市、地址和 token等参数。

首先,判断appversion、cid、 name、mobile、 city、address、 token等字段均不能为空,否则接口返回相应的状态码和提示。

开发实现的接口代码示例:

#coding=utf-8
#1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

#2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2020-04-15
@author: husilin
Project:使用unittest框架编写测试用例
'''


import requests
import unittest     # 导入unittest模块

class updateaddress(unittest.TestCase):
    # 定义测试类,父类为unittest.TestCase。
    # 可继承unittest.TestCase的方法,如setUp和tearDown方法,不过此方法可以在子类重写,覆盖父类方法。
    # 可继承unittest.TestCase的各种断言方法
    def setUp(self):
        '''定义setUp()方法用于测试用例执行前的初始化工作。'''
        pass


    def tearDown(self):
        '''定义tearDown()方法用于测试用例执行之后的善后工作'''
        pass



    def updateadd(self, appversion, cid, name, mobile, city, address, token):
        '''测试添加或者修改收货地址'''
        realmname = "http://cjjl-test.chelun.com"
        url = "/NewKingCoach/addCoachAddress"
        par = {
            "appversion": appversion,   # 非必填
            "cid": cid,              # 必填
            "name": name,            # 必填
            "mobile": mobile,        # 必填
            "city": city,            # 必填
            "address": address,      # 必填
            "_token": token          # 与cid必须传一个
        }
        res = requests.post(url=realmname + url, params=par)
        # result1 = res.text  # 字节输出
        # print(result1)
        return res.json()

    def test_updateadd1(self):
        '''测试添加或者修改收货地址:不传name'''
        name = ""
        mobile = "17000000002"
        city = '021'
        address = '大飒飒大萨达'
        appversion = "4.6.0"
        cid = ""
        token = ""
        result = self.updateadd(appversion, cid, name, mobile, city, address, token)  #获取状态码
        self.assertEqual(result['msg'], "参数错误")
        print("1、不传name测试通过,测试结果提示:" + result['msg'], result['code'])

    def test_updateadd2(self):
        '''测试添加或者修改收货地址:不传mobile'''
        name = "虎虎虎"
        mobile = ""
        city = '021'
        address = '大飒飒大萨达'
        appversion = "4.6.0"
        cid = ""
        token = ""
        result = self.updateadd(appversion, cid, name, mobile, city, address, token)
        self.assertEqual(result['msg'], "参数错误")
        print("2、不传mobile测试通过,测试结果提示:" + result['msg'], result['code'])

    def test_updateadd3(self):
        '''测试添加或者修改收货地址:不传city'''
        name = "虎虎虎"
        mobile = "17000000002"
        city = ''
        address = '大飒飒大萨达'
        appversion = "4.6.0"
        cid = ""
        token = ""
        result = self.updateadd(appversion, cid, name, mobile, city, address, token)
        self.assertEqual(result['msg'], "参数错误")
        print("3、不传city测试通过,测试结果提示:" + result['msg'], result['code'])

    def test_updateadd4(self):
        '''测试添加或者修改收货地址:不传address'''
        name = "虎虎虎",
        mobile = "17000000002",
        city = '021',
        address = '',
        appversion = "4.6.0",
        cid = ""
        token = ""
        result = self.updateadd(appversion, cid, name, mobile, city, address, token)
        self.assertEqual(result['msg'], "参数错误")
        print("4、不传address测试通过,测试结果提示:" + result['msg'], result['code'])

    def test_updateadd5(self):
        '''测试添加或者修改收货地址:传cid,成功修改'''
        name = "虎虎虎"
        mobile = "17000000003"
        city = '021'
        address = '这是测试的一个脚本'
        appversion = "4.6.0"
        cid = "0d11ba726f797904"
        token = ""
        result = self.updateadd(appversion, cid, name, mobile, city, address, token)
        if result['result']['address']['name'] == name and result['result']['address']['phone'] == mobile:
            print("5、传cid,测试通过,成功修改,测试结果提示:" + result['msg'])
        else:
            print("5、fail,修改失败,测试结果提示:" + result['msg'])





#如果直接运行该文件(__name__值为__main__),则执行以下语句,常用于测试脚本是否能够正常运行
if __name__ == "__main__":
    # unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们。
    # 执行顺序是命名顺序:先执行test_case1,再执行test_case2
    unittest.main()


unittest单元测试框架可以帮助 组织和运行接口测试用例。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值