unittest单元测试框架前言
一.在我们没有学习过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]; pm.test('Schema is valid', function() { |
有时需要在不同的环境下跑相同的测试,此时可以通过设置环境变量来动态选择。点击右上角的设置按钮:

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

使用这些键值的时候只需要加上两个花括号引用key
1 {{base_url}}/username
解析完后
建立多个环境时,key通常都是相同的,只是value不同
点击这个位置来新增环境变量

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

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

创建一个集合



1.GET请求参数及header

2.POST请求设置(重要)

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

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

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

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

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

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

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

四。设置断言
Postman的Tests标签可以用来写测试:

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


这就是postman给我们带来的好处,他可以收集所有接口请求,进行结果断言,在我们需要的时候他可以成批的进行运行。
但是postman的缺点也是十分明显的,他是一个固定的工具,只能满足一部分接口请求的要求,但是有很多接口的请求参数需求他就无法实现了,比如说在请求参数了需要时间戳,需要一个MD5加密的字段,需要从数据库里查询一个id键值,再比如说需要获取返回中的参数这些都无法实现,只能通过手动去获取,那这样自动化的意义也就不存在了,所以最靠谱的实现自动化还是需要使用python来开发一个脚本,按照接口文档的要求开发出相应的接口请求脚本。
二.当我们学习过python中的request模块我们可以发送接口请求,发送get,post,put,delete等请求,同时可以发送字典格式的,json格式的,发送文件等类型数据,也可以操作session,cookie,并对接口返回进行操作,如获取返回内容,并对返回内容格式化,获取返回的状态码,获取请求时间等功能呢。
下面 我们就用request的模块进行一个简单的接口测试
#导入requests模块
import requests def 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','需要登录')
结果如下:

我们的入参需要一个时间戳并且需要一个数据库字段
#导入requests模块
import requests
import pymysql
import time
def 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()
结果如下:

我们可以看到因为每一个接口的请求方式都是不一样的,传参也不一样,返回结果的校验字段与校验值也是不一样的,所以我们需要一个接口请求写一个方法,这样做好处是清晰方便,便于代码检查,但缺点也同样是异常明显的。首先代码冗余,重复性代码过多,不便于维护而且我们做接口测试,不能只是把接口测通就算通过了,我们还需要进行接口的正反用例,对接口进行边界值测试,传参类型测试,传参合法性测试等等,那就需要我们频繁的修改传参和断言字段与断言字段值,而且我们进行结果断言的时候不能只是用等于来进行校验,因为有的返回字段我们需要对他的类型就行校验,返回的结果的范围进行校验,所以我们要写多个断言判断的方法,这么来看 接口测试用代码来实现 还真不是那么简简单单 so easy的事啊!!!
我们仅仅用requests模块进行简单的接口测试是行得通的,但是要只有requests模块给整个公司上百个接口进行测试的话显然这是很难实现地,那么有没有一个更好的方法或者说有一个现成的框架供我们使用呢?答案当时是有的,这就是unittest框架,今天我们来介绍一下他
三。unittest框架简介
unittest单元测试框架不仅可以适用于单元测试和接口自动化测试用例的开发与执行,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成HTML格式的测试结果,便于查看,这么看来unittest框架简直就是自动化测试人员必须掌握的技能之一。
unittest单元测试框架前言的更多相关文章
- unittest单元测试框架总结
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- unittest单元测试框架详解
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型
1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...
- unittest单元测试框架
unittest单元测试框架 概述: 单元测试框架主要用来完成以下三件事: 提供用例组织与执行:当测试用例只有几条时,可以不必考虑用例的组织,但是当用例达到成百上千条时,大量的用例堆砌在一起,就产生了 ...
- unittest单元测试框架简单说明
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- Python+selenium之简单介绍unittest单元测试框架
Python+selenium之简单介绍unittest单元测试框架 一.unittest简单介绍 unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是 ...
- unittest单元测试框架总结(转载)
转载:https://www.cnblogs.com/yufeihlf/p/5707929.html unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该 ...
- 四. 引入unittest单元测试框架
1. 安装 SeleniumIDE(firefox) (1)下载地址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/ (2 ...
- unittest 单元测试框架断言方法
unittest单元测试框架的TestCase类下,测试结果断言方法:Assertion methods 方法 检查 版本 assertEqual(a, b) a == b assertNotEqu ...
随机推荐
- Apache JMeter 做接口并发测试
获知来源:查找如何使用Postman进行接口并发测试时,在StackOverflow上看到,说postman只能做串行测试,而且postman并不是被设计做这种测试的:而jmeter就是为了测试而开发 ...
- leetcode 55 Jump Game 三种方法,回溯、动态规划、贪心
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- LeetCode 290. 单词规律(Word Pattern) 41
290. 单词规律 290. Word Pattern 题目描述 给定一种规律 pattern 和一个字符串 str,判断 str 是否遵循相同的规律. 这里的 遵循 指完全匹配,例如,pattern ...
- Apache ZooKeeper在Kafka中的角色 - 监控和配置
1.目标 今天,我们将看到Zookeeper在Kafka中的角色.本文包含Kafka中需要ZooKeeper的原因.我们可以说,ZooKeeper是Apache Kafka不可分割的一部分.在了解Zo ...
- MySql 、Oracle 获取表结构和字段信息
1.MySql获取表结构信息 SELECT TABLE_NAME, TABLE_COMMENT FROM information_schema.`TABLES` WHERE TABLE_SCHEMA ...
- Django框架之DRF 基于mixins来封装的视图
基础视图 示例环境搭建:新建一个Django项目,连接Mysql数据库,配置路由.视图函数.序列化单独创建py文件 # 配置路由 from django.conf.urls import url fr ...
- python爬虫-喜马拉雅_晚安妈妈睡前故事
这里先说下思路: 1.首先要获取当前书的音频信息 '''获取当前书的音频信息''' all_list = [] for url in self.book_url: r = requests.get(u ...
- jedis参数不当引发的问题总结
jedis参数不当引发dubbo服务线程池耗尽异常 现象:一个dubbo服务偶发性的出现个别机器甚至整个集群大量报线程池耗尽的问题.一开始对问题的处理比较粗暴,直接增加了10倍的线程数.但是问题依然偶 ...
- [高清] Java编程思想第四版完整中文高清版
------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...
- java第三次面试总结
这次面试是二面,由于自己的经验不足,面试的结果不是很令人满意,所以与这家公司失之交臂,在这里记录一下经历,吸取教训. 之前的一面是笔试+面试,面试是主管,今天的面试是总监.在前台招待我的时候,还跟我说 ...