一.在我们没有学习过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;
});

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

填写该环境的名称:如测试环境,并在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单元测试框架前言的更多相关文章

  1. unittest单元测试框架总结

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  2. unittest单元测试框架详解

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  3. Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型

    1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

  4. unittest单元测试框架

    unittest单元测试框架 概述: 单元测试框架主要用来完成以下三件事: 提供用例组织与执行:当测试用例只有几条时,可以不必考虑用例的组织,但是当用例达到成百上千条时,大量的用例堆砌在一起,就产生了 ...

  5. unittest单元测试框架简单说明

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  6. Python+selenium之简单介绍unittest单元测试框架

    Python+selenium之简单介绍unittest单元测试框架 一.unittest简单介绍 unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是 ...

  7. unittest单元测试框架总结(转载)

    转载:https://www.cnblogs.com/yufeihlf/p/5707929.html unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该 ...

  8. 四. 引入unittest单元测试框架

    1.   安装 SeleniumIDE(firefox) (1)下载地址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/ (2 ...

  9. unittest 单元测试框架断言方法

    unittest单元测试框架的TestCase类下,测试结果断言方法:Assertion methods 方法 检查 版本 assertEqual(a, b)  a == b assertNotEqu ...

随机推荐

  1. harbor镜像仓库-https访问配置

    1. 证书的生成 在测试或开发环境中,您可以选择使用自签名证书,而不是来自受信任的第三方CA的证书.以下内容将向您展示如何创建自己的CA,并使用您的CA签署服务器证书和客户端证书.   1.1 生成c ...

  2. CentOS 7.5二进制部署Kubernetes1.12(加密通信)(五)

    一.安装方式介绍 1.yum 安装 目前CentOS官方已经把Kubernetes源放入到自己的默认 extras 仓库里面,使用 yum 安装,好处是简单,坏处也很明显,需要官方更新 yum 源才能 ...

  3. POJ 2106 Boolean Expressions

    总时间限制: 1000ms  内存限制: 65536kB 描述 The objective of the program you are going to produce is to evaluate ...

  4. python实践项目九:操作文件-修改文件名

    描述:多个文件,文件名名包含美国风格的日期( MM-DD-YYYY),需要将它们改名为欧洲风格的日期( DD-MM-YYYY) 代码1:先创建100个文件名为美国风格日期的文件(文件路径为项目当前路径 ...

  5. linux中的文件权限chmod

    linux中的文件权限chmod ​ 还是GPU集群那点事儿,集群之间磁盘互相挂载,普通用户也可以操作/cu02_nfs./cu04_nfs文件夹,这就牵扯到权限的问题,去google发现所谓的777 ...

  6. 07 Mybatis的多表查询1----1对多和多对1---@Results注解用法总结

    1.表与表之间的关系及其举例 表之间的关系有4种:一对多.多对一.一对一.多对多. 举例: (1)用户和订单就是一对多 一个用户可以下多个订单 (2)订单和用户就是多对一 多个订单属于同一个用户 (3 ...

  7. Python-10-迭代器

    一.定义 1. 迭代的概念 迭代器即迭代的工具,那什么是迭代呢?迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不是迭 ...

  8. vue+element树组件 实现树懒加载

    本文连接https://www.cnblogs.com/aknife/p/11709255.html 一.页面样式 二.数据库 三.前端页面代码 <template> <el-tre ...

  9. Java 哈希表

    public int firstUniqChar(String s){ int[] freq=new int[26]; for(int i=0;i<s.length();i++){ freq[s ...

  10. 2.5_Database Interface ODBC数据源及案例

    分类 用户数据源 用户创建的数据源,称为“用户数据源”.此时只有创建者才能使用,并且只能在所定义的机器上运行.任何用户都不能使用其他用户创建的用户数据源. 系统数据源 所有用户在Windows下以服务 ...