企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 编写测试 您可以使用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"]); }); ~~~