gRPC 测试示例
你可以使用脚本 为 gRPC 请求编写测试。根据逻辑和你希望如何获得结果,可以通过多种方式构建测试断言。 本节将介绍一些最常见的断言编写方法,以及解释如何使用 pm.* API 编写测试的大量示例。
测试状态码
你可以使用 pm.response statusCode
上可用的属性来测试响应的状态代码。
pm.test('Status code is 0', () => {
pm.response.to.have.statusCode(0);
});
你还可以使用 pm.expect 方法断言相同的内容。
pm.test('Status code is 0', () => {
pm.expect(pm.response.statusCode).to.equal(0);
});
你可以使用
pm.response.to.be.ok
作为简写来测试状态代码是否为 0。
测试响应时间
对于具有一元方法的请求,你可以断言响应时间:
pm.test('Response time is below 200ms', () => {
pm.response.to.have.responseTime.below(200);
// or
pm.response.to.have.responseTime.not.above(200);
// Using pm.expect
pm.expect(pm.response.responseTime).to.be.below(300);
});
对于使用流方法的请求,pm.response.responseTime
表示该请求执行的总持续时间。
检查是否存在响应元数据:
pm.test('"content-type" is present in response metadata', () => {
pm.response.to.have.metadata('content-type');
// Using pm.expect
pm.expect(pm.response.metadata.has('content-type')).to.be.true;
});
你还可以断言元数据的值:
pm.test('"content-type" response metadata is "application/grpc"', () => {
pm.response.to.have.metadata('content-type', 'application/grpc');
// Using pm.expect
pm.expect(pm.response.metadata.get('content-type')).to.equal('application/grpc');
});
可以使用 pm.request 对象为请求元数据编写类似的断言。
测试响应预告片
检查是否存在响应预告片:
pm.test('"grpc-status-details-bin" is present in response trailers', () => {
pm.response.to.have.trailer('grpc-status-details-bin');
// Using pm.expect
pm.expect(pm.response.trailers.has('grpc-status-details-bin')).to.be.true;
});
你还可以断言预告片的价值:
pm.test('"grpc-status-details-bin" response trailer is "dummy-value"', () => {
pm.response.to.have.trailer('grpc-status-details-bin', 'dummy-value');
// Using pm.expect
pm.expect(pm.response.trailers.get('grpc-status-details-bin')).to.equal('dummy-value');
});
测试反应
在多响应消息的情况下(服务器请求或双向流方法),本节中的测试检查给定断言的所有消息。对于只有一个响应消息的一元或客户端流方法的请求,断言仅在该单个消息上进行测试。
此外,在使用 编写断言时pm.response.messages.to.*
,你将对消息内容数组而不是完整的 pm.response 消息对象进行断言。
你可以使用对象测试本节中关于请求消息的断言pm.request
。
测试消息的存在
要测试响应消息的存在(严格):
pm.test('Correct user details are received', () => {
pm.response.to.have.message({
userId: '123',
name: 'John Doe',
email: 'john@example.com',
phone: '+1-555-555-5555',
age: 30,
company: 'XYZ'
});
});
测试具有特定属性的消息
你可以断言给定对象的属性是作为响应收到的任何消息的子集:
pm.test('User details are updated successfully', () => {
pm.response.messages.to.include({
action: 'update-user-details',
status: 'success'
});
});
默认情况下,
pm.response.messages.to.include()
已.deep
应用于它。
测试所有消息的公共属性
检查所有接收到的消息中是否存在公共属性:
pm.test('All users have "company" in their profile', () => {
pm.response.messages.to.have.property('isActive');
});
你也可以断言公共属性的值:
pm.test('All users are in same company', () => {
pm.response.messages.to.have.property('company', 'XYZ');
});
默认情况下,
pm.response.messages.to.have.property()
已.deep
应用于.nested
它。
针对 JSON 模式测试消息
你可以断言接收到的消息与给定的 JSON 模式匹配:
const schema = {
type: "object",
properties: {
username: {
type: "string",
pattern: "^[a-z0-9_-]{3,16}$"
}
}
};
pm.test('All response messages have correct username', () => {
pm.response.messages.to.have.jsonSchema(schema);
});
pm.test('Assert on a specific message', () => {
pm.expect(pm.response.messages.idx(10).data).to.have.jsonSchema(schema);
});
使用消息流
下面的示例展示了如何处理消息流并在其上编写断言。
pm.test('Should receive keep-alive message roughly every 5 seconds', () => {
const keepAliveMessage = pm.response.messages.filter({
data: {
type: 'keep-alive'
}
});
for (let i = 1; i < keepAliveMessage.length; i++) {
const time1 = keepAliveMessage[i-1].timestamp;
const time2 = keepAliveMessage[i].timestamp;
pm.expect(time2-time1).to.be.within(4800, 5200);
}
});
pm.test('Every request message should have a corresponding response message', () => {
pm.request.messages.each((reqMsg) => {
pm.response.messages.to.include({ id: reqMsg.data.id });
});
});