# 编写测试
您可以使用JavaScript为Postman API请求编写测试脚本。通过测试,您可以确保您的API能够按预期运行,确定服务之间的集成可靠运行,并验证新开发是否没有破坏任何现有功能。当您的API项目出现问题时,您还可以使用测试代码来帮助调试过程。
> 例如,您可以编写测试以通过发送不完整数据的请求来验证API的错误处理。
您可以将测试添加到单个请求,文件夹和集合。
要将测试添加到请求中,请打开请求,然后在“测试”选项卡中输入代码。测试将在请求运行后执行。您将能够在**测试结果**选项卡中的响应数据旁边看到输出。
![要求测试标签](https://assets.postman.com/postman-docs/request-test-tab.jpg)
## [](https://learning.postman.com/docs/writing-scripts/test-scripts/#writing-test-scripts)编写测试脚本
您的测试脚本可以使用动态变量,对响应数据执行测试断言,并在请求之间传递数据。在**测试**的请求选项卡,您可以手动输入您的JavaScript或使用**片段**,你会看到在代码编辑器的右侧。
测试将在收到响应后执行,因此,当您单击**Send时**,当响应数据从API返回时,Postman将运行您的测试脚本。
> 如果您需要在请求运行之前执行代码,请改用“[请求前脚本”](https://learning.postman.com/docs/writing-scripts/pre-request-scripts/)。有关在请求运行时脚本如何执行的更多信息,请参见[脚本简介](https://learning.postman.com/docs/writing-scripts/intro-to-scripts/)。
要执行测试以验证请求返回的数据,可以使用`pm.response`对象。您可以使用`pm.test`函数定义测试,并提供一个名称和函数,该函数返回一个布尔值(`true`或`false`)来指示测试是通过还是失败。您可以在声明中使用[ChaiJS BDD](https://www.chaijs.com/api/bdd/)语法`pm.expect`来测试响应详细信息。
该`.test`函数的第一个参数是文本字符串,它将出现在测试结果输出中,因此您可以使用它来识别测试,并将测试的目的传达给查看结果的任何人。
例如,在“**测试”**选项卡中为任何请求输入以下内容,以测试响应状态代码是否为`200`。
~~~js
pm.test("Status test", function () {
pm.response.to.have.status(200);
});
~~~
![测试状态示例](https://assets.postman.com/postman-docs/example-test-status.jpg)
单击**发送**以运行您的请求,然后在响应部分中打开**测试结果**。选项卡标题显示通过了多少测试,总共运行了多少。您还可以在通过,跳过和失败的测试结果之间切换。
![测试结果](https://assets.postman.com/postman-docs/test-result-status.jpg)
如果请求返回了`200`状态码,则测试将通过,否则将失败。尝试在测试脚本中更改预期的状态代码,然后再次运行请求。
![测试结果失败](https://assets.postman.com/postman-docs/failed-test-status.jpg)
使用`pm.expect`语法可以为您的测试结果消息提供不同的格式-尝试各种替代方法以获得您认为最有用的输出。
![测试结果失败](https://assets.postman.com/postman-docs/expect-test-syntax.jpg)
> 使用**“**[简介](https://documenter.getpostman.com/view/1559645/RzZFCGFR?version=latest)**”中**的**“在邮递员**中**运行”**按钮[来编写测试集合,](https://documenter.getpostman.com/view/1559645/RzZFCGFR?version=latest)以将包含一些示例测试脚本的模板导入Postman并进行代码试验。
您的代码可以测试请求[环境](https://learning.postman.com/docs/sending-requests/managing-environments/),如以下示例所示:
~~~js
pm.test("environment to be production", function () {
pm.expect(pm.environment.get("env")).to.equal("production");
});
~~~
您可以使用不同的语法变体以您认为可读的方式编写测试,并且适合您的应用程序和测试逻辑。
~~~js
pm.test("response should be okay to process", function () {
pm.response.to.not.be.error;
pm.response.to.have.jsonBody("");
pm.response.to.not.have.jsonBody("error");
});
~~~
测试可以使用适合于响应数据格式的语法来确定请求响应的有效性。
~~~js
pm.test("response must be valid and have a body", function () {
pm.response.to.be.ok;
pm.response.to.be.withBody;
pm.response.to.be.json;
});
~~~
您的脚本可以包含您需要的许多测试,并且当您单击“**保存”**时,这些脚本将与其余的请求详细信息一起**保存**。如果您共享一个收藏集或发布文档/“在邮递员中运行”按钮,则查看或导入模板的任何人都将包含您的测试代码。
### [](https://learning.postman.com/docs/writing-scripts/test-scripts/#using-snippets)使用摘要
你会看到一个选择常用的测试代码摘录的**片段**,以测试编辑器的右侧。单击添加一个,它将出现在编辑器中。代码段可以加快脚本入门的速度-您可以在添加代码段以满足自己的测试要求之后对其进行编辑。
![添加了代码段](https://assets.postman.com/postman-docs/added-test-snippet.jpg)
## [](https://learning.postman.com/docs/writing-scripts/test-scripts/#testing-collections-and-folders)测试集合和文件夹
您可以将测试脚本添加到集合,文件夹或集合中的单个请求中。与集合关联的测试脚本将在集合中的每个请求之后运行。与文件夹关联的测试脚本将在文件夹中的每个请求之后运行。这样,您可以在每个请求之后重用通常执行的测试。
> 将脚本添加到集合和文件夹后,您可以测试API项目中的工作流程。这有助于确保您的请求涵盖典型场景,从而为应用程序用户提供可靠的体验。
您可以通过单击集合或文件夹名称旁边的**查看更多操作**(...),然后选择**编辑**来更新集合和文件夹脚本。选择“**测试”**选项卡以添加或更新脚本。您也可以在首次创建集合时添加集合脚本。
![收集测试](https://assets.postman.com/postman-docs/collection-test-script.jpg)
当你[运行一个集合](https://learning.postman.com/docs/running-collections/intro-to-collection-runs/),你将看到由集合亚军输出的测试结果。
![收集测试](https://assets.postman.com/postman-docs/collection-tests-run.jpg)
## 使用多个断言
您的测试可以在单个测试中包含多个断言,您可以使用此断言将相关断言分组在一起。
~~~js
pm.test("The response has all properties", () => {
//parse the response json and test three properties
const responseJson = pm.response.json();
pm.expect(responseJson.type).to.eql('vip');
pm.expect(responseJson.name).to.be.a('string');
pm.expect(responseJson.id).to.have.lengthOf(1);
});
~~~
如果任何包含的断言失败,则整个测试将失败。所有断言必须成功才能通过测试。
## 解析响应主体数据
为了对响应执行断言,首先需要将数据解析为断言可以使用的JavaScript对象。
要解析JSON数据,请使用以下语法:
~~~js
const responseJson = pm.response.json();
~~~
要解析XML,请使用以下命令:
~~~js
const responseJson = xml2Json(pm.response.text());
~~~
### 测试响应主体
您可以在响应正文中检查特定值:
~~~js
pm.test("Person is Jane", () => {
const responseJson = pm.response.json();
pm.expect(responseJson.name).to.eql("Jane");
pm.expect(responseJson.age).to.eql(23);
});
~~~
### [](https://learning.postman.com/docs/writing-scripts/script-references/test-examples/#testing-status-codes)测试状态码
您可以测试响应状态代码:
~~~js
pm.test("Status code is 201", () => {
pm.response.to.have.status(201);
});
~~~
如果要测试状态码是否为一组,可以将它们全部包含在数组中并使用`oneOf`:
~~~js
pm.test("Successful POST request", () => {
pm.expect(pm.response.code).to.be.oneOf([201,202]);
});
~~~
### 测试头
您可以检查响应头是否存在:
~~~js
pm.test("Content-Type header is present", () => {
pm.response.to.have.header("Content-Type");
});
~~~
您还可以测试具有特定值的响应头:
~~~js
pm.test("Content-Type header is application/json", () => {
pm.expect(pm.response.headers.get('Content-Type')).to.eql('application/json');
});
~~~
### 测试cookie
您可以测试响应中是否存在Cookie:
~~~js
pm.test("Cookie JSESSIONID is present", () => {
pm.expect(pm.cookies.has('JSESSIONID')).to.be.true;
});
~~~
您还可以测试特定的Cookie值:
~~~js
pm.test("Cookie isLoggedIn has value 1", () => {
pm.expect(pm.cookies.get('isLoggedIn')).to.eql('1');
});
~~~
### [](https://learning.postman.com/docs/writing-scripts/script-references/test-examples/#testing-response-times)测试响应时间
您可以测试响应时间是否在指定范围内:
~~~js
pm.test("Response time is less than 200ms", () => {
pm.expect(pm.response.responseTime).to.be.below(200);
});
~~~
### 针对变量声明响应值
您可以检查响应属性是否与变量(在这种情况下为环境变量)具有相同的值。
~~~js
pm.test("Response property matches environment variable", function () {
pm.expect(pm.response.json().name).to.eql(pm.environment.get("name"));
});
~~~
### 断言值类型
您可以测试响应的任何部分的类型。
~~~js
/* response has this structure:
{
"name": "Jane",
"age": 29,
"hobbies": [
"skating",
"painting"
],
"email": null
}
*/
const jsonData = pm.response.json();
pm.test("Test data type of the response", () => {
pm.expect(jsonData).to.be.an("object");
pm.expect(jsonData.name).to.be.a("string");
pm.expect(jsonData.age).to.be.a("number");
pm.expect(jsonData.hobbies).to.be.an("array");
pm.expect(jsonData.website).to.be.undefined;
pm.expect(jsonData.email).to.be.null;
});
~~~
### 断言值在集合中
您可以根据有效选项列表检查响应值。
~~~js
pm.test("Value is in valid list", () => {
pm.expect(pm.response.json().type)
.to.be.oneOf(["Subscriber", "Customer", "User"]);
});
~~~
- 第一章-测试理论
- 1.1软件测试的概念
- 1.2测试的分类
- 1.3软件测试的流程
- 1.4黑盒测试的方法
- 1.5AxureRP的使用
- 1.6xmind,截图工具的使用
- 1.7测试计划
- 1.8测试用例
- 1.9测试报告
- 2.0 正交表附录
- 第二章-缺陷管理工具
- 2.1缺陷的内容
- 2.2书写规范
- 2.3缺陷的优先级
- 2.4缺陷的生命周期
- 2.5缺陷管理工具简介
- 2.6缺陷管理工具部署及使用
- 2.7软件测试基础面试
- 第三章-数据库
- 3.1 SQL Server简介及安装
- 3.2 SQL Server示例数据库
- 3.3 SQL Server 加载示例
- 3.3 SQL Server 中的数据类型
- 3.4 SQL Server 数据定义语言DDL
- 3.5 SQL Server 修改数据
- 3.6 SQL Server 查询数据
- 3.7 SQL Server 连表
- 3.8 SQL Server 数据分组
- 3.9 SQL Server 子查询
- 3.10.1 SQL Server 集合操作符
- 3.10.2 SQL Server聚合函数
- 3.10.3 SQL Server 日期函数
- 3.10.4 SQL Server 字符串函数
- 第四章-linux
- 第五章-接口测试
- 5.1 postman 接口测试简介
- 5.2 postman 安装
- 5.3 postman 创建请求及发送请求
- 5.4 postman 菜单及设置
- 5.5 postman New菜单功能介绍
- 5.6 postman 常用的断言
- 5.7 请求前脚本
- 5.8 fiddler网络基础及fiddler简介
- 5.9 fiddler原理及使用
- 5.10 fiddler 实例
- 5.11 Ant 介绍
- 5.12 Ant 环境搭建
- 5.13 Jmeter 简介
- 5.14 Jmeter 环境搭建
- 5.15 jmeter 初识
- 5.16 jmeter SOAP/XML-RPC Request
- 5.17 jmeter HTTP请求
- 5.18 jmeter JDBC Request
- 5.19 jmeter元件的作用域与执行顺序
- 5.20 jmeter 定时器
- 5.21 jmeter 断言
- 5.22 jmeter 逻辑控制器
- 5.23 jmeter 常用函数
- 5.24 soapUI概述
- 5.25 SoapUI 断言
- 5.26 soapUI数据源及参数化
- 5.27 SoapUI模拟REST MockService
- 5.28 Jenkins的部署与配置
- 5.29 Jmeter+Ant+Jenkins 搭建
- 5.30 jmeter脚本录制
- 5.31 badboy常见的问题
- 第六章-性能测试
- 6.1 性能测试理论
- 6.2 性能测试及LoadRunner简介
- 第七章-UI自动化
- 第八章-Maven
- 第九章-测试框架
- 第十章-移动测试
- 10.1 移动测试点及测试流程
- 10.2 移动测试分类及特点
- 10.3 ADB命令及Monkey使用
- 10.4 MonkeyRunner使用
- 10.5 appium工作原理及使用
- 10.6 Appium环境搭建(Java版)
- 10.7 Appium常用函数(Java版)
- 10.8 Appium常用函数(Python版)
- 10.9 兼容性测试