unittest单元测试框架前言

Wesley13
• 阅读 580

一.在我们没有学习过python语言的时候领导让我们做接口测试 我们都使用工具来做测试,一般常用的如jemeter,postman这些个工具,我来推荐使用postman

这个工具来进行接口测试,有的小伙伴们说Fiddler或Charles抓接口,然后进行测试不也成吗?成是成,但是接口测试往往优先于客户端测试并且postman这个工具方便用来模拟异常请求,并且postman这个工具还带有验证功能,提高我们接口测试的效率

我们来用postman来进行一个简单的自动化

1.发送一个get请求

2.发送一个post请求

3.设置检查点,检验请求的返回值

验证包含哪些内容

postman断言是JavaScript语言编写的,在postman客户端指定区域编写即可。

clear a global variable

清除全局变量

pm.globals.unset("variable_key");

Clear an environment variable

清除一个环境变量

pm.environment.unset("variable_key");

get a global variable

得到一个全局变量

pm.globals.get("variable_key");

get a variable

得到一个变量

pm.variables.get("variable_key");

Get an environment variable

得到一个环境变量

pm.environment.get("variable_key");

response body:contains string

检查response body包含字符串

pm.test("Body matches string", function () {
    pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});

response body:convert XML body to a JSON object

response body:将XML转换为JSON对象

var jsonObject = xml2Json(responseBody);

response body:is equal to a string

检查响应体等于一个字符串

pm.test("Body is correct", function () {
    pm.response.to.have.body("response_body_string");
});

response body:JSON value check

检查response body中JSON某字段值

pm.test("Your test name", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.value).to.eql(100);
});

response headers:content-Type header check

检查content-Type是否包含在header返回

pm.test("Content-Type is present", function () {
    pm.response.to.have.header("Content-Type");
});

response time is than 200ms

响应时间超过200ms

pm.test("Response time is less than 200ms", function () {
    pm.expect(pm.response.responseTime).to.be.below(200);
});

send s request

发送一个请求

pm.sendRequest("https://postman-echo.com/get", function (err, response) {
    console.log(resp  onse.json());
});

set a global variable

设置一个全局变量

pm.globals.set("variable_key", "variable_value");

set an environment variable

设置一个环境变量

pm.environment.set("variable_key", "variable_value");

status code:Code is 200

状态码:代码是200

pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

status code:code name has string

状态码:代码中有指定字符串

pm.test("Status code name has string", function () {
    pm.response.to.have.status("Created");
});

status code:successful POST request

状态码:成功的post请求

pm.test("Successful POST request", function () {
    pm.expect(pm.response.code).to.be.oneOf([201,202]);
});

use tiny validator for JSON data

为json数据使用tiny验证器

var schema = {
  "items": {
    "type": "boolean"
  }
};

var data1 = [true, false];
var data2 = [true, 123];

pm.test('Schema is valid', function() {
  pm.expect(tv4.validate(data1, schema)).to.be.true;
  pm.expect(tv4.validate(data2, schema)).to.be.true;
});

 有时需要在不同的环境下跑相同的测试,此时可以通过设置环境变量来动态选择。点击右上角的设置按钮:

unittest单元测试框架前言

填写该环境的名称:如测试环境,并在key和value中填写需要的键值

unittest单元测试框架前言

使用这些键值的时候只需要加上两个花括号引用key

1 {{base_url}}/username

解析完后

建立多个环境时,key通常都是相同的,只是value不同

点击这个位置来新增环境变量

unittest单元测试框架前言

创建好所有环境后,在跑用例的时候在右上角下拉列表选择需要的环境就好

unittest单元测试框架前言

二。请求

postman界面分为两部分:左边的sidebar 右边的request builder:快速创建几乎所有的请求

unittest单元测试框架前言

创建一个集合

unittest单元测试框架前言

 unittest单元测试框架前言

unittest单元测试框架前言

1.GET请求参数及header

unittest单元测试框架前言

2.POST请求设置(重要)

unittest单元测试框架前言

不同的body editor 分为4个区域,根据body类型有不同的控制。

unittest单元测试框架前言

mutipart/form-data是网页表单用来传输数据的默认格式。可以模拟填写表单,并且提交表单。

unittest单元测试框架前言

可以上传一个文件作为key的value提交(如上传文件)。但该文件不会作为历史保存,只能在每次需要发送请求的时候,重新添加文件。

unittest单元测试框架前言

2 urlencoded

同前面一样,注意,你不能上传文件通过这个编码模式。
该模式和表单模式会容易混淆。urlencoded中的key-value会写入URL,form-data模式的key-value不明显写入URL,而是直接提交。

unittest单元测试框架前言

3 raw

raw request可以包含任何东西。所有填写的text都会随着请求发送。

unittest单元测试框架前言

4 binary

图片,音频,视频,文件都可以 。 也不能保存历史,每次选择文件,提交。

unittest单元测试框架前言

三 响应

保证API响应的正确性,就是你需要做的大部分工作。postman的response viewer部分会协助你完成该工作且使其变得简单。
一个API的响应包含body,headers,响应状态码。postman将body和headers放在不同的tabs中。响应码和响应时间显示在tabs的旁边。将鼠标悬停在响应码上面可以查看更详细的信息。

unittest单元测试框架前言

四。设置断言

Postman的Tests标签可以用来写测试:

unittest单元测试框架前言

五 运行Collections

postman允许你运行collection,你可以运行任意的次数。 最后会给出一个整体运行的结果。会保存每一次运行的结果,提供给你比较每一次运行结果的不同。
选择collection,选择环境。点击运行按钮。

unittest单元测试框架前言

unittest单元测试框架前言

这就是postman给我们带来的好处,他可以收集所有接口请求,进行结果断言,在我们需要的时候他可以成批的进行运行。

但是postman的缺点也是十分明显的,他是一个固定的工具,只能满足一部分接口请求的要求,但是有很多接口的请求参数需求他就无法实现了,比如说在请求参数了需要时间戳,需要一个MD5加密的字段,需要从数据库里查询一个id键值,再比如说需要获取返回中的参数这些都无法实现,只能通过手动去获取,那这样自动化的意义也就不存在了,所以最靠谱的实现自动化还是需要使用python来开发一个脚本,按照接口文档的要求开发出相应的接口请求脚本。

二.当我们学习过python中的request模块我们可以发送接口请求,发送get,post,put,delete等请求,同时可以发送字典格式的,json格式的,发送文件等类型数据,也可以操作session,cookie,并对接口返回进行操作,如获取返回内容,并对返回内容格式化,获取返回的状态码,获取请求时间等功能呢。

下面 我们就用request的模块进行一个简单的接口测试

#导入requests模块import requestsdef test(url,data,check_key,check_value):    rep=requests.post(url=url,data=data).json()    print(rep)    assertion=rep[check_key]    if assertion == check_value:        print("豆瓣发布接口测试通过")    else:        print("豆瓣发布接口测试不通过")test('https://api.douban.com/shuo/statuses/',"{'media': [{'imgsrc': 'http://icanhascheezburger.files.wordpress.com/2009/04/funny-pictures-hairless-cat-phones-    home.jpg', 'src': 'http://www.mapsofwar.com/photos/EMPIRE17.swf', 'type': 'flash'}]}", \     'msg','需要登录')

结果如下:

unittest单元测试框架前言

我们的入参需要一个时间戳并且需要一个数据库字段

#导入requests模块import requestsimport pymysqlimport timedef test():    # 获取13位时间戳    millis = int(round(time.time() * 1000))    print("时间戳:%s"%millis)    # 创建连接    conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root123', db='autotest',charset='utf8')    # 创建游标    cursor = conn.cursor()    # 执行SQL,并返回受影响行数    cursor.execute("select * from autotest_input WHERE id=1")    results = cursor.fetchall()    print(results)    print(results[0][1])    # 提交,不然无法保存新建或者修改的数据    conn.commit()    # 关闭游标    cursor.close()    # 关闭连接    conn.close()    url = 'http://ios.wecash.net/biz/wallet/amount'    data = 'CUSTOMER_ID=56256A951F81F0BCA10780AD02139B29'    rep = requests.get(url=url, data=data).json()    print(rep)    errorDescription = rep['errorDescription']    if errorDescription == '查询成功':        print("红包查询接口测试通过")    else:        print("红包查询接口测试不通过")test()

结果如下:

unittest单元测试框架前言

我们可以看到因为每一个接口的请求方式都是不一样的,传参也不一样,返回结果的校验字段与校验值也是不一样的,所以我们需要一个接口请求写一个方法,这样做好处是清晰方便,便于代码检查,但缺点也同样是异常明显的。首先代码冗余,重复性代码过多,不便于维护而且我们做接口测试,不能只是把接口测通就算通过了,我们还需要进行接口的正反用例,对接口进行边界值测试,传参类型测试,传参合法性测试等等,那就需要我们频繁的修改传参和断言字段与断言字段值,而且我们进行结果断言的时候不能只是用等于来进行校验,因为有的返回字段我们需要对他的类型就行校验,返回的结果的范围进行校验,所以我们要写多个断言判断的方法,这么来看 接口测试用代码来实现 还真不是那么简简单单 so easy的事啊!!!

我们仅仅用requests模块进行简单的接口测试是行得通的,但是要只有requests模块给整个公司上百个接口进行测试的话显然这是很难实现地,那么有没有一个更好的方法或者说有一个现成的框架供我们使用呢?答案当时是有的,这就是unittest框架,今天我们来介绍一下他

三。unittest框架简介

unittest单元测试框架不仅可以适用于单元测试和接口自动化测试用例的开发与执行,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成HTML格式的测试结果,便于查看,这么看来unittest框架简直就是自动化测试人员必须掌握的技能之一。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
5个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这