进阶用法

以下会介绍 Postman 和 Newman 的一些进阶用法,包括常用测试响应测试脚本,测试前置脚本和常用的测试脚本可用的第三方包等。

常用测试脚本

Postman 提供了测试脚本功能,可以使用 JavaScript 编写脚本来验证 API 的响应和行为。这些脚本可以在请求的“Tests”标签下添加,分为请求前脚本(Pre-request Script)和响应后脚本(Tests)两个部分。下面是一些常用的 Postman 和 Newman 测试脚本:

响应测试脚本

  1. 状态码检查:

    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    
  2. 响应时间检查:

    pm.test("Response time is less than 200ms", function () {
        pm.expect(pm.response.responseTime).to.be.below(200);
    });
    
  3. 响应体 JSON 格式检查:

    pm.test("Response body is a valid JSON", function () {
        pm.response.to.be.json;
    });
    
  4. 响应体字段值检查:

    pm.test("Response body contains expected value", function () {
        pm.expect(pm.response.json().key).to.eql("expectedValue");
    });
    
  5. 响应体数组长度检查:

    pm.test("Response body array has correct length", function () {
        pm.expect(pm.response.json().arrayKey).to.have.lengthOf(3);
    });
    
  6. 响应体属性存在性检查:

    pm.test("Response body has required properties", function () {
        pm.expect(pm.response.json()).to.have.property("key");
    });
    

请求前脚本

  1. 动态设置请求参数:

    pm.variables.set("dynamicVariable", "dynamicValue");
    
  2. 使用全局变量设置请求头:

    pm.request.headers.add({ key: 'Authorization', value: pm.globals.get('authToken') });
    
  3. 生成随机数并设置为变量:

    const randomNumber = Math.floor(Math.random() * 1000);
    pm.variables.set("randomNumber", randomNumber);
    
  4. 签名生成或加密等操作:

    // 示例:使用 CryptoJS 进行 HMAC SHA256 签名
    const CryptoJS = require('crypto-js');
    const secretKey = 'yourSecretKey';
    const message = 'dataToSign';
    const signature = CryptoJS.HmacSHA256(message, secretKey).toString(CryptoJS.enc.Base64);
    pm.variables.set("signature", signature);
    

测试脚本中可用的第三方库

提供的 require 方法允许您使用沙箱内置库模块。下面列出了个人常用的可用库和示例 更多可用的库可以在这里找到

chai.js 断言库方法

在 Postman 的测试脚本中,你可以使用 Chai 断言库来编写断言,以验证你的 API 响应是否符合预期。Chai 提供了多种断言风格,包括 BDD(Behavior Driven Development)、TDD(Test Driven Development)等。以下是一些基本的 Chai 使用方法:

1. 安装 Chai

在 Postman 的脚本环境中,你无需单独安装 Chai,因为 Postman 默认已经内置了 Chai。

2. 使用 BDD 风格断言

在 Postman 的 “Tests” 部分中,你可以使用 Chai 的 BDD 风格断言,例如:

// 引入 Chai 库
const chai = require('chai');

// 使用 BDD 风格断言
const expect = chai.expect;

// 示例:验证响应状态码为 200
pm.test('Status code is 200', function() {
    expect(pm.response.code).to.equal(200);
});

// 示例:验证响应体是 JSON
pm.test('Response body is JSON', function() {
    expect(pm.response.headers.get('Content-Type')).to.include('application/json');
});
3. 使用 TDD 风格断言
// 引入 Chai 库
const chai = require('chai');

// 使用 TDD 风格断言
const assert = chai.assert;

// 示例:使用 assert 断言响应状态码为 200
assert.equal(pm.response.code, 200, 'Status code should be 200');
4. Chai 支持的一些常用断言
  • 相等性:

    expect(actual).to.equal(expected);
    
  • 包含:

    expect(actual).to.include(expected);
    
  • 类型检查:

    expect(actual).to.be.a('string');
    
  • 大于/小于:

    expect(actual).to.be.above(expected);
    expect(actual).to.be.below(expected);
    
  • 空/非空:

    expect(actual).to.be.null;
    expect(actual).to.not.be.null;
    
  • 深度相等性:

    expect(actual).to.deep.equal(expected);
    

以上只是 Chai 断言库的一些基本用法,你可以根据需要使用更多的断言方法和组合。Chai 提供了丰富的断言功能,可以满足各种测试需求。更多详细信息,请查阅 Chai 的官方文档:Chai Documentation

使用 cheerio 操作 HTML 文件

在 Postman 中,Cheerio 是一个基于 jQuery 的库,用于在服务器端操作 HTML 文档。它允许你使用类似于 jQuery 的语法来选择和操作 HTML 元素,非常适用于解析和提取 HTML 页面中的信息。在 Postman 中,你可以使用 Cheerio 库进行 HTML 响应的解析。以下是 Cheerio 在 Postman 中的基本用法:

  1. 安装 Cheerio:

    • 由于 Postman 使用的是 Node.js 运行时环境,你可以通过在 Postman 的脚本中安装 Cheerio 来使用它。在请求的 “Pre-request Script” 或 “Tests” 部分,可以使用以下方式安装 Cheerio:
    // 安装 Cheerio
    const cheerio = require('cheerio');
    
  2. 使用 Cheerio 解析 HTML:

    • 在请求的 “Tests” 部分中,你可以使用 Cheerio 解析 HTML。以下是一个简单的例子:
    // 从响应中获取 HTML 内容
    const htmlContent = pm.response.text();
    
    // 使用 Cheerio 解析 HTML
    const $ = cheerio.load(htmlContent);
    
    // 示例:从 HTML 中提取标题文本
    const titleText = $('title').text();
    console.log('Title:', titleText);
    
    // 示例:从 HTML 中提取所有链接的 href 属性
    const links = [];
    $('a').each(function () {
        const link = $(this).attr('href');
        links.push(link);
    });
    console.log('Links:', links);
    

    在上述例子中,cheerio.load(htmlContent) 用于加载 HTML 内容,并使用类似于 jQuery 的语法来选择和操作元素。

  3. 注意事项:

    • Cheerio 主要用于解析静态 HTML,对于使用 JavaScript 动态生成的内容,可能无法正常获取。在这种情况下,你可能需要考虑使用 Puppeteer 或其他支持 JavaScript 执行的工具。

这只是 Cheerio 在 Postman 中的基本用法。你可以根据具体的需求使用 Cheerio 提供的各种选择器和方法。请查阅 Cheerio 的官方文档以获取更详细的信息:Cheerio Documentation

使用 tv4 来验证 JSON Schema

在 Postman 中,tv4 是一个 JSON Schema 验证库,用于验证 JSON 数据是否符合给定的 JSON Schema。JSON Schema 是一种描述 JSON 数据结构的规范,它定义了 JSON 对象的属性、类型和其他约束。

以下是在 Postman 中使用 tv4 进行 JSON Schema 验证的基本步骤:

  1. 安装 tv4 库:

    • 由于 Postman 使用的是 Node.js 运行时环境,你可以通过在 Postman 的脚本中安装 tv4 来使用它。在请求的 “Pre-request Script” 或 “Tests” 部分,你可以使用以下方式安装 tv4:
    // 安装 tv4
    const tv4 = require('tv4');
    
  2. 定义 JSON Schema:

    • 在 Postman 中,你可以在请求的 “Pre-request Script” 或 “Tests” 部分定义 JSON Schema。JSON Schema 可以作为一个 JavaScript 对象进行定义。以下是一个简单的例子:
    // 定义 JSON Schema
    const jsonSchema = {
        "type": "object",
        "properties": {
            "name": { "type": "string" },
            "age": { "type": "number" }
        },
        "required": ["name", "age"]
    };
    
  3. 使用 tv4 进行验证:

    • 在请求的 “Tests” 部分,你可以使用 tv4 对 JSON 数据进行验证。以下是一个简单的例子:
    // 获取响应的 JSON 数据
    const jsonResponse = pm.response.json();
    
    // 使用 tv4 进行 JSON Schema 验证
    const isValid = tv4.validate(jsonResponse, jsonSchema);
    
    // 检查验证结果
    pm.test('JSON is valid according to the schema', function() {
        pm.expect(isValid).to.be.true;
    });
    

    在上述例子中,tv4.validate(jsonResponse, jsonSchema) 用于验证 jsonResponse 是否符合 jsonSchema 定义的规范。验证结果存储在 isValid 变量中,然后使用 pm.test 来检查验证结果。

这只是 tv4 在 Postman 中的基本用法。你可以根据实际需求,定义更复杂的 JSON Schema,并使用 tv4 的其他功能进行更灵活的验证。请查阅 tv4 的官方文档以获取更详细的信息:tv4 Documentation

生成 uuid

在 Postman 中,你可以使用 uuid 模块来生成 UUID(Universally Unique Identifier),也被称为 GUID。以下是在 Postman 中使用 uuid 模块的基本用法:

1. 安装 uuid 模块

在 Postman 的 “Pre-request Script” 或 “Tests” 部分,你可以使用以下方式安装 uuid 模块:

// 安装 uuid 模块
const uuid = require('uuid');
2. 生成 UUID
// 生成 UUID
const generatedUUID = uuid.v4();
console.log('Generated UUID:', generatedUUID);

在上述例子中,uuid.v4() 用于生成一个基于随机数的 UUID。你可以在 Postman 脚本中使用生成的 UUID,例如将其设置为请求头或参数的值。

示例

以下是一个在 Postman “Pre-request Script” 中生成 UUID 并设置为请求头的示例:

// 安装 uuid 模块
const uuid = require('uuid');

// 生成 UUID
const generatedUUID = uuid.v4();

// 设置请求头
pm.request.headers.add({ key: 'X-Request-ID', value: generatedUUID });

在上述例子中,X-Request-ID 是一个常见的请求头,用于标识请求的唯一性。生成的 UUID 被设置为这个请求头的值,以确保每个请求都有唯一的标识。

请注意,Postman 在运行脚本时会自动执行安装依赖项的步骤,无需手动安装 uuid 模块。

使用 xml2js 将 XML 转换为 JavaScript 对象

在 Postman 中,xml2js 是一个用于将 XML 转换为 JavaScript 对象的库。在 Postman 的脚本中,你可以使用 xml2js 来处理 XML 响应并将其转换为易于处理的 JavaScript 对象。以下是在 Postman 中使用 xml2js 的基本步骤:

  1. 安装 xml2js 库:

    • 由于 Postman 使用的是 Node.js 运行时环境,你可以通过在 Postman 的脚本中安装 xml2js 来使用它。在请求的 “Pre-request Script” 或 “Tests” 部分,你可以使用以下方式安装 xml2js
    // 安装 xml2js
    const xml2js = require('xml2js');
    
  2. 解析 XML 响应:

    • 获取 XML 响应后,你可以使用 xml2js 将其解析为 JavaScript 对象。以下是一个简单的例子:
    // 获取响应的 XML 内容
    const xmlContent = pm.response.text();
    
    // 使用 xml2js 解析 XML
    xml2js.parseString(xmlContent, function (err, result) {
        if (err) {
            console.error('Error parsing XML:', err);
            return;
        }
    
        // result 是解析后的 JavaScript 对象
        console.log('Parsed XML:', result);
    });
    

    在上述例子中,xml2js.parseString(xmlContent, function (err, result) {...} 用于异步地解析 XML 内容。解析后的 JavaScript 对象存储在 result 中。

  3. 处理解析后的 JavaScript 对象:

    • 一旦你获得了解析后的 JavaScript 对象,你就可以按照普通的 JavaScript 对象处理方式访问和操作它的属性。
    // 示例:访问解析后的 JavaScript 对象的属性
    const value = result.root.element[0].subelement[0]._;
    console.log('Value from parsed XML:', value);
    

    在上述例子中,result.root.element[0].subelement[0]._ 是一个访问解析后对象属性的示例。具体的结构取决于你的 XML 结构。

这只是 xml2js 在 Postman 中的基本用法。你可以根据实际需求使用 xml2js 的其他功能,例如设置解析选项,处理命名空间等。请查阅 xml2js 的官方文档以获取更详细的信息:xml2js Documentation

常用工具函数 util

在 Postman 中,util 是一个全局对象,提供了一些常用的实用工具函数,可以在 Postman 脚本中使用。以下是一些常见的 util 对象的用法:

1. util.guid() - 生成全局唯一标识符(GUID)
// 生成一个全局唯一标识符
const uniqueId = util.guid();
console.log('Unique ID:', uniqueId);
2. util.timestamp() - 获取当前时间戳
// 获取当前时间戳(毫秒)
const timestamp = util.timestamp();
console.log('Timestamp:', timestamp);
3. util.randomInt(min, max) - 生成指定范围内的随机整数
// 生成 1 到 100 之间的随机整数
const randomInt = util.randomInt(1, 100);
console.log('Random Integer:', randomInt);
4. util.unixTimestamp() - 获取当前时间戳(Unix 时间戳,秒)
// 获取当前时间戳(秒)
const unixTimestamp = util.unixTimestamp();
console.log('Unix Timestamp:', unixTimestamp);
5. util.encodeBase64(str)util.decodeBase64(base64Str) - Base64 编码和解码
// Base64 编码
const encodedString = util.encodeBase64('Hello, World!');
console.log('Encoded String:', encodedString);

// Base64 解码
const decodedString = util.decodeBase64(encodedString);
console.log('Decoded String:', decodedString);
6. util.each(obj, callback) - 遍历对象或数组
// 遍历数组
const array = [1, 2, 3, 4];
util.each(array, function (value, index) {
    console.log(`Index ${index}: ${value}`);
});

// 遍历对象
const obj = { a: 1, b: 2, c: 3 };
util.each(obj, function (value, key) {
    console.log(`Key ${key}: ${value}`);
});
注意事项
  • 在 Postman 脚本中,可以通过 util 对象直接调用这些实用工具函数。
  • util 对象提供的这些方法能够简化在 Postman 脚本中的一些常见任务,如生成随机数、处理时间戳等。
  • 请注意查阅 Postman 的官方文档,因为 Postman 会不断更新和改进其脚本环境,可能会引入新的实用工具函数。

stream 流操作

在 Node.js 中使用流(Streams)通常用于处理大量的数据,可以有效地降低内存占用并提高性能。以下是一些在 Node.js 中使用流的基本用法,可以参考这些方法来处理数据或文件。

1. 读取流(Readable Streams):
const fs = require('fs');

// 创建可读流
const readableStream = fs.createReadStream('input.txt');

// 设置编码(如果是文本文件)
readableStream.setEncoding('utf-8');

// 处理数据
readableStream.on('data', function(chunk) {
    console.log('Received chunk:', chunk);
});

// 处理结束
readableStream.on('end', function() {
    console.log('Stream ended.');
});

// 处理错误
readableStream.on('error', function(err) {
    console.error('Error:', err);
});
2. 写入流(Writable Streams):
const fs = require('fs');

// 创建可写流
const writableStream = fs.createWriteStream('output.txt');

// 写入数据
writableStream.write('Hello, World!\n');
writableStream.write('Another line.');

// 结束写入
writableStream.end();

// 处理结束
writableStream.on('finish', function() {
    console.log('Write completed.');
});

// 处理错误
writableStream.on('error', function(err) {
    console.error('Error:', err);
});
3. 转换流(Transform Streams):
const { Transform } = require('stream');

// 创建转换流
const myTransform = new Transform({
    transform(chunk, encoding, callback) {
        // 转换数据
        const transformedData = chunk.toString().toUpperCase();
        this.push(transformedData);
        callback();
    }
});

// 管道连接读取流、转换流和写入流
readableStream.pipe(myTransform).pipe(writableStream);

这只是 Node.js 中使用流的一些基本用法。在 Postman 中,你可以在请求的脚本中使用这些方法,例如 “Pre-request Script” 或 “Tests” 部分,通过 Node.js 运行环境来执行这些脚本。请注意,Node.js 中的流 API 可以更复杂,例如通过使用 pipeline 函数来处理多个流的连接。

定时器 timers

在 Postman 中,你可以使用 Node.js 的定时器功能来处理定时任务或延时执行的操作。以下是一些基本的 Node.js 定时器的用法,这些用法可以在 Postman 的脚本中使用。

1. setTimeout - 延时执行
// 延时执行操作
setTimeout(function() {
    console.log('Delayed operation.');
}, 2000); // 2000 毫秒(2 秒)
2. setInterval - 定时执行重复操作
// 定时执行重复操作
const intervalId = setInterval(function() {
    console.log('Repeated operation.');
}, 3000); // 3000 毫秒(3 秒)

// 取消定时执行
// clearInterval(intervalId);
3. 在 Postman 中使用

在 Postman 中,你可以在 “Pre-request Script” 或 “Tests” 部分中使用这些定时器。例如,在 “Tests” 部分中延时执行操作:

// 在 "Tests" 部分延时执行操作
setTimeout(function() {
    console.log('Delayed operation in Tests.');
}, 2000); // 2000 毫秒(2 秒)

请注意,在 Postman 的 “Pre-request Script” 或 “Tests” 部分执行的代码是在 Node.js 环境中运行的,因此你可以使用 Node.js 支持的大多数功能,包括定时器。

在以上例子中,setTimeout 会在指定的延时后执行一次操作,而 setInterval 会在每隔指定的时间间隔后执行一次操作。在 Postman 中,你可以根据实际需求使用这些定时器功能。

时间处理 events

在 Postman 的脚本环境中,你可以使用 Node.js 的 events 模块来处理事件。events 模块提供了 EventEmitter 类,该类可以用于定义和触发事件。以下是在 Postman 中使用 Node.js 的 events 模块的一些基本用法:

1. 创建事件发射器
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
2. 定义事件处理函数
// 定义事件处理函数
function myEventHandler() {
    console.log('Event handled.');
}
3. 注册事件处理函数
// 注册事件处理函数
myEmitter.on('myEvent', myEventHandler);
4. 触发事件
// 触发事件
myEmitter.emit('myEvent');
示例

在 Postman 的脚本环境中,你可以使用事件来实现异步操作的回调或处理。以下是一个简单的例子,演示如何在异步操作完成后触发事件:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// 模拟异步操作
function performAsyncOperation() {
    setTimeout(function() {
        console.log('Async operation completed.');
        // 触发事件
        myEmitter.emit('asyncOperationComplete');
    }, 2000);
}

// 注册事件处理函数
myEmitter.on('asyncOperationComplete', function() {
    console.log('Handling async operation completion.');
    // 这里可以执行异步操作完成后的处理逻辑
});

// 执行异步操作
performAsyncOperation();

在上述例子中,performAsyncOperation 函数模拟了一个异步操作,当该操作完成时,通过 myEmitter.emit 触发了 asyncOperationComplete 事件。在事件处理函数中,你可以编写处理异步操作完成后的逻辑。

请注意,在 Postman 的脚本中,异步操作的执行方式可能受到限制,因此在实际使用中需要谨慎考虑。

参考文档


欢迎关注软件测试同学的公众号“软件测试同学”,原创 QA 技术文章第一时间推送。