python自动化测试(4)-使用第三方python库技术实现

python自动化测试(4)-使用第三方python库技术实现

1   概述

关于测试的方法论,都是建立在之前的文章里面提到的观点:

  • 功能测试不建议做自动化
  • 接口测试性价比最高
  • 接口测试可以做自动化
  • 做好接口自动化,一定要有透过界面看到数据本质的能力

后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。

2   可测试架构

目前互联网行业流行的“一服务,多客户端”的架构是一种 可测试性好 的架构,架构图如下:

  1. 服务器和客户端采用Http(或者WebSocket)的方式进行通讯
  2. 数据交换的格式一般是Json(或者XML)
  3. 因为下游设备众多,所以服务端接口有很强的稳定性要求

3   自动化技术实现

基于如上特点,此系统的接口自动化测试简化表述,就是需要做如下事情:

  1. 使用脚本对接口进行Http请求
  2. 对返回值解析
  3. 按照设计文档进行判定
  4. 以项目的方式组织测试脚本形成自动化测试项目

当然,以上纯粹是从技术的角度来阐述问题,如果要和具体的项目结合起来 ,还需要设计不同的步骤和数据来满足不同的业务逻辑需求。

对于如上4个目的,有如下几个框架或者工具可以实现:

  1. requests 一个Http请求库,号称是让Http的请求对人更友好,此框架也确实达到此目的了。
  2. json python提供的对json和python数据类型的转化库
  3. pyunit pyunit自动化框架提供了大量的assert断言方法来自动化进行数据逻辑判定
  4. pycharm 作为一个强大的IDE,其在项目组织方面的表现也同样是极其出色的

关于 pyunit 和 pycharm 在本系列文章的上一节里面已经进行了介绍,此处不再重复介绍,本文的重点则是python的两个和http通讯及数据解析相关的库:requests库 和 json库 。

4   json

4.1   基本介绍

中文官方主页:

http://www.json.org/json-zh.html

关于JSON的使用介绍,目前已经不言而喻。虽然在好多年前,曾经有XML和JSON在 数据编解码 领域平分秋色的说法,但是这么多年过去后,JSON的势头越来越好,而XML的声音则越来越小。

关于JSON的定义,引用官网的原文 [1]

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

目前JSON显然已经成为了互联网上字符型数据交换的标准编解码的中坚力量,作为互联网的开发人员,是很有必要了解它,运用它的。

JSON作为一种字符串的编码和解码规划,是和语言无关的,JSON官网 [1] 上有各种语言的。各种语言(Java/Php/C#/C/C++/Python/R/Ruby等等)都有自己的实现方式,这些也都可以参考

4.2   python库

本文的主打语言是Python语言,所展开的内容也是和Python语言相关,在JSON官网 [1] 上提供了如下几种Python语言的JSON库:

  • The Python Standard Library.
  • simplejson.
  • pyson.
  • Yajl-Py.
  • ultrajson.
  • metamagic.json.

一般情况下,都使用第一个: The Python Standard Library(Python标准库)

官方文档地址:

https://docs.python.org/2/library/json.html

主要的功能就是:JSON编码和解码。

主要函数:

  • 解码函数(装载):将字符流转化为json对象
    • loads: 载入字符串变量
    • load:载入文件流
  • 编码函数(卸载):将json对象转化为字符流
    • dumps:输出到字符串变量
    • dump:输出到文件流

以上的几个接口容易混淆记忆,引处提供一个辨识技巧:后面带有s结尾(loads,dumps),都是对字符串变量 str 的处理。

一般情况下,loads,dumps使用得最多,因为大部分的程序运算都是内存运算,即主要是对字符串变量进行处理,以下是官网的示例。

字符串解码:

>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
>>> json.loads('"\\"foo\\bar"')
u'"foo\x08ar'

字符串编码:

>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> print json.dumps("\"foo\bar")
"\"foo\bar"
>>> print json.dumps(u'\u1234')
"\u1234"

关于python标准数据类型和Json的数据类型之间转化的对应关系请见官网 [2]

[1]

(1, 2, 3) JSON官网

[2]

Python的Json编码解码数据对应表

5   requests

5.1   基本介绍

官方主页:

http://docs.python-requests.org/en/master/

requests库是一个专门封装的,对用户极其友好的一个Http请求库,其目的就是为了让python下面的Http请求变得更简单,而且它确实也达到它的目的了。

安装方法:

pip install requests

5.2   使用示例

目前的一般的Web应用程序都是基于get或者post请求,对于这两种Http请求,requests库都提供了十分优雅的解决方案。

最基本的get请求

# coding:utf-8
import requests

__author__ = 'harmo'


def get_demo():
    """
    requests 的get方法演示,不带参数
    by:Harmo
    :return:
    """
    url = 'http://www.baidu.com'
    res = requests.get(url)
    print res.url
    print res.status_code


if __name__ == '__main__':
    get_demo()

运行结果:

http://www.baidu.com/
200

带参数的get请求:

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get('http://httpbin.org/get', params=payload)

带参数的post请求:

>>> payload = {'key1': 'value1', 'key2': 'value2'}

>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print(r.text)
{
  ...
  "form": {
    "key2": "value2",
    "key1": "value1"
  },
  ...
}

6   综合示例

再结合一下pyunit的判断库,就可以根据如下流程,做一个最简单的接口自动化测试脚本:

  1. 根据文档准备好请求参数
  2. 对指定的http接口进行requests请求
  3. 对返回的字符串进行json解析
  4. 使用pyunit的assert函数进行判定
  5. 生成相应的测试报告,导出或者和信息系统对接

下面是对一个用户登录的接口进行测试,按照设计文档,此接口如果登录成功,则返回的字符格式是:

{
    "code":200,
    "msg":"",
    "data":{
        "token": "382998dafa5143fd8a38c535be0d1502"
    }
}

如果登录失败,则返回如下值:

{"code":403,"msg":"forbidden","data":""}

则相应的测试脚本代码为

def test_admin_user_login(self):
    """
    测试用户登录
    by:Harmo
    :return:
    """

    url = "%s%s" % (self.base_url, '/task/admin-user-login/')

    params = dict(
        user='admin',
        password='222222',

    )

    res = requests.post(url, data=params)
    print res.text

    res_dict = json.loads(res.text)
    self.assertEqual(res_dict['code'], 200)

运行结果:

通过上面运行结果的提示,我们可以看出,指定的数据输入经过服务端接口后,并没有返回我们期望的值。这个时候,我们就可以排查是不是服务端的接口出问题了,或者是谁修改了测试数据,导致结果不符合预期。

7   小结

本小部分的内容,主要是讲如何利用 requests库 和 json库 来轻松构建Http接口自动化测试的项目。基本上如果掌握了如上技能,测试开发人员就具备了自动化脚本开发的能力了,后面主就是结合具体的项目需求来进行逻辑设计和数据准备了。

只需要这一步,你就迈入了自动化测试之门了,恭喜。

聚沙成塔,无数的上文提到的接口自动化测试脚本,就可以汇集成一个自动化化测试项目,而此自动化测试项目则是 持续集成,快速迭代必备条件,最后作为测试人员也能成为整个项目推进中很重要的一环了。

作者:

Harmo哈莫

作者介绍:

https://zhengwh.github.io

Email:

dreamzsm@gmail.com

QQ:

1295351490

时间:

2016-02

版权声明:

欢迎以学习交流为目的读者随意转载,但是请 【注明出处】

支持本文:

如果文章对您有启发,可以点击博客右下角的按钮进行 【推荐】

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏魏艾斯博客www.vpsss.net

修改 WordPress 文章默认排序的方法

27750
来自专栏小尘哥的专栏

小程序(1)-入坑

老板想要一个小程序的东西,作为实诚却又没干过小程序开发的程序猿,二话不说,撸起袖子,开整。

16750
来自专栏SeanCheney的专栏

深入理解Python异步编程(上)

彻底理解异步编程是什么、为什么、怎么样。深入学习asyncio的基本原理和原型,了解生成器、协程在Python异步编程中是如何发展的。

96220
来自专栏Python小屋

Python计算前n个自然数的阶乘和

本文来源于粉丝私信的问题,目的在于计算result = 1!+2!+3!+...+n!,因为代码比较简单,没加注释,有问题可以留言交流。文中给出了2段代码,在实...

55150
来自专栏腾讯NEXT学位

《Node.js在CLI下的工程化体系实践》成都OSC源创会分享总结

14320
来自专栏互联网杂技

前端面试题整理

交互设计前端开发 前言: 现在前端面试主要考察以下几个方面: 初级的:html、css、js,jquery,开发工具git的使用,对其他框架稍微了解; 中级的:...

50190
来自专栏nothing

游戏服务端开发的逻辑解耦思路

最开始的代码库中,主循环收到协议后,通过手写的路由关系转交给对应的业务逻辑类实现。

26430
来自专栏运维技术迷

Redis单线程架构

redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。 引出单线程模型 开启三个redis-cli客户端同时执行命令 客户端1设置一个字...

55580
来自专栏C++

python笔记:#014#综合应用

22470
来自专栏Crossin的编程教室

答同学问(三)

Git课程因为有些事耽搁了,会尽快更新。今天先来说几个之前有人问过的关于Python的几个小问题。 1. 如何查看异常处理时except里的出错信息? 给ex...

31160

扫码关注云+社区

领取腾讯云代金券