示例简介
- 本文示例网站地址为:https://reservation.weihanli.xyz/swagger/index.htm
该web应用主要是用来进行:活动室的预约,主要功能如下:
Notice 公告API
- GET /api/Notice 获取公告列表
- GET /api/Notice/{path} 获取公告详情
ReservationPlaces
- GET /api/ReservationPlaces 预约活动室列表
- GET /api/ReservationPlaces/{placeId}/periods 获取可预约的时间段
Reservations
-
GET /api/Reservations 活动室预约列表
-
POST /api/Reservations 提交预约信息
-
GET /api/Reservations/{id} 获取预约详情
-
DELETE /api/Reservations/{id} 取消预约
-
GET /api/Reservations/user 获取用户预约列表
我们选择如下三个接口组成的流程进行本次讲解:
-
将三个接口整理好,放置在一个集合中,分别调用,以保证这三个接口都可以正常使用。准备工作完成,我们可以愉快地进行本次实战的讲解。
1. postman支持的变量
- postman支持的变量形式很多,我们最需要掌握的有两种类型:全局变量、环境变量,有了变量的支持,会大大简化我们的脚本逻辑。
1.1 全局变量
- 该变量的作用范围最大,一旦设定将会在整个工作空间内生效,我们要测试的三个接口都需要访问:https://reservation.weihanli.xyz/,此时我们可以将URL作为全局变量。设置方式如下:
- 此时我们便得到了一个键为:baseUrl,值为https://reservation.weihanli.xyz/的变量,下面我们在各个接口访问的url使用该变量。
- 接口依然可以成功调通,证明全局变量生效。 注意:postman中引用变量的格式为:{{变量key}}
1.2 环境变量
- 在postman中可以设置环境,这个环境很好理解,我们测试公司内部系统时,一般分为测试、预发等多套环境,这个时候对每个环境特定的变量,我们就可以将其设置为环境变量。
- 注意:
- 环境变量的作用范围是当前环境,切换环境后变量作用域失效
- 环境变量的作用范围小于全局变量,但是优先集高于全局变量
- 在“提交预约信息”的请求入参中有【预约时间-ReservationForTime】字段,该字段必须为Date类型,我们将其设置为环境变量。在Pre-request-Script处添加以下脚本:
var myDate = new Date();
pm.environment.set("day", myDate);
-
该变量的设置方式如下:
-
我们在请求前需要设置的环境变量写在Pre-request-Script处,如果是响应后的数据我们拿出来做环境变量,此时脚本就写在Tests处。
2. 接口间传参
- 完成第一步,下面我们要将调用:“预约活动室列表”接口返回的placeId传到“获取可预约的时间段”接口,我们只需做如下事情:
- 1、 获取到“预约活动室列表”接口返回的placeId。
- 在Tests处写以下脚本:
var uuid = pm.response.json()[0].PlaceId;
pm.environment.set("PlaceId", uuid);
- 上面代码的含义为:
- 第一句pm.response.json()获取到响应体,因为响应体为数组,因此从下标[0]开始,获取到第一个json对象,然后获取到第一个json对象中的PlaceId字段将其赋值给uuid变量。
- 第二句:将uuid变量赋值给环境变量PlaceId。
- 2、将获取的PlaceId设置为环境变量。
- 3、在“获取可预约的时间段”接口引用环境变量即可。
- 综上,即可实现接口间传递参数。
3. 检查点设置
- 检查点在接口的Tests里进行设置,如下图所示:
最常见的检查点如下:
- 检查HTTP请求的状态码是否与预期一致
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
- 检查JSON响应中包含某个字段
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
- 检查响应体中包含某个指定连续字符串的值
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
- 检查响应时间的长短
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
下面我们分别为三个接口设置检查点;
- 接口“预约活动室列表”,检查该接口是否可用,即响应码为200,再判断响应列表是否为空,不为空证明有可预约活动室,脚本如下:
pm.test("check01-检查接口可用-响应码为200", function () {
pm.response.to.have.status(200);
});
pm.test("check01-响应体不为空-json对象不为空", function () {
var jsonData = pm.response.json();
pm.expect(jsonData[0]) != null;
});
- 接口“获取可预约的时间段”,需要检查是否已成功获取到环境变量PlaceId,脚本如下:
pm.test("check03-成功获取变量值PlaceId", function () {
pm.expect(pm.environment.get("PlaceId") != null);
});
pm.test("check04-第一个对象中的PeriodId的值为bac2a0bb-138f-445d-b416-2c90c9c3fa4d", function () {
var jsonData = pm.response.json();
pm.expect(jsonData[0].PeriodId).to.eql("bac2a0bb-138f-445d-b416-2c90c9c3fa4d");
});
- 接口“提交预约信息”,检查响应体是否为200,如果为200则表示预约成功。
4. 通过Runner实现自动批量执行
- 设置全部接口,可通过postman提供的Runner进行批量执行;
- 点击【Run demo】后,等待运行完成即可查看自动化执行结果;
5. 按照指定顺序执行接口调用
-
只需要在Tests处添加脚本:postman.setNextRequest(“下一个要执行的接口名称”);即可。
-
在“预约活动室列表”的Tests处将下一个执行接口指向“提交预约信息”
-
postman.setNextRequest(“third-inter#提交预约信息”);
-
在“提交预约信息”的Tests处将下一个执行接口指向“获取可预约的时间段”,脚本如下:
postman.setNextRequest("second-inter#获取可预约的时间段");
- 在“获取可预约的时间段”的Tests处下一个执行接口指向空(必须设置,否则会进入死循环,不断重复执行上面的接口),脚本如下:
postman.setNextRequest("");
- 运行效果:
6. postman中实现数据驱动
- 会议室会被不同的人预约,那么就会有不同数据“提交预约信息”接口,但是我们不希望程序一个一个地由人工执行,所以需要将数据进行驱动,逐条喂给接口。
postman常见的参数化操作是将参数化列表写入text文档中(不推荐使用csv和JSON,csv每次变更都要对其格式更新,JSON的组织过程繁琐)
“提交预约信息”接口的请求:
{
"ReservationForDate": "2021-04-14T03:50:00.044Z",
"ReservationForTime": "string",
"ReservationForTimeIds": "string",
"ReservationPlaceName": "string",
"ReservationPlaceId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"ReservationUnit": "string",
"ReservationActivityContent": "string",
"ReservationPersonName": "string",
"ReservationPersonPhone": "string"
}
- 将ReservationPersonName和ReservationPersonPhone进行参数化,具体实现过程如下:
- 准备参数化文件,注意文件的格式一定要保存为UTF-8无BOM格式。
PS:首先文件后缀名必须为text,第一行必须为参数名称,文本内容中的标点符号必须是英文,另外文本编码格式必须为UTF-8,最后一行需要需要符号或者字母将其填充,比如为两个-,其作用是为了防止Runner执行参数化迭代的时候,因结尾所加的换行符号导致迭代失败。
- 在“提交预约信息”接口的Pre-request Script处写入如下脚本,读取text参数化文件var.text,代码如下:
//实现数据驱动
var apply = "var.text";
var ReservationPersonName = apply.ReservationPersonName;
pm.environment.set("ReservationPersonName", ReservationPersonName);
var ReservationPersonPhone = apply.ReservationPersonPhone;
pm.environment.set("ReservationPersonPhone", ReservationPersonPhone);
- 将请求报文中的参数进行替换;
-
在Runner中设置迭代次数,比如为5,然后执行;
-
查看执行结果,可以在console控制台查看每次的调用情况;