The k6/net/grpc module provides a gRPC client for testing gRPC services.
Client
The Client class is used to interact with gRPC services.
Constructor
import grpc from 'k6/net/grpc';
const client = new grpc.Client();
Methods
load(importPaths, …protoFiles)
Loads protocol buffer definitions from proto files.
Array of import paths for proto files
import grpc from 'k6/net/grpc';
const client = new grpc.Client();
client.load(['./protos'], 'service.proto');
The load() method must be called in the init context.
loadProtoset(protosetPath)
Loads a compiled protoset file.
Path to the protoset file
client.loadProtoset('service.protoset');
connect(address, [params])
Connects to a gRPC server.
Server address (host:port)
Returns true on successful connection
import grpc from 'k6/net/grpc';
const client = new grpc.Client();
client.load([], 'service.proto');
export default () => {
client.connect('localhost:50051', {
plaintext: true,
});
};
Connection Parameters
Use plaintext connection (no TLS)
Maximum message size to receive (bytes)
Maximum message size to send (bytes)
Use server reflection protocol
Override the :authority pseudo-header
invoke(method, request, [params])
Invokes a unary gRPC method.
Fully qualified method name (e.g., “package.Service/Method”)
Response object containing status, message, headers, and trailers
const response = client.invoke('main.RouteGuide/GetFeature', {
latitude: 409146138,
longitude: -746188906,
});
console.log(JSON.stringify(response.message));
Response Object
Response headers metadata
Response trailers metadata
Error information if request failed
asyncInvoke(method, request, [params])
Invokes a unary gRPC method asynchronously.
Fully qualified method name
Promise that resolves with the response
const promise = client.asyncInvoke('main.RouteGuide/GetFeature', {
latitude: 409146138,
longitude: -746188906,
});
promise.then(response => {
console.log(JSON.stringify(response.message));
});
close()
Closes the gRPC connection.
Constants
Status Codes
grpc.StatusOK - 0
grpc.StatusCanceled - 1
grpc.StatusUnknown - 2
grpc.StatusInvalidArgument - 3
grpc.StatusDeadlineExceeded - 4
grpc.StatusNotFound - 5
grpc.StatusAlreadyExists - 6
grpc.StatusPermissionDenied - 7
grpc.StatusResourceExhausted - 8
grpc.StatusFailedPrecondition - 9
grpc.StatusAborted - 10
grpc.StatusOutOfRange - 11
grpc.StatusUnimplemented - 12
grpc.StatusInternal - 13
grpc.StatusUnavailable - 14
grpc.StatusDataLoss - 15
grpc.StatusUnauthenticated - 16
Examples
Basic gRPC Test
import grpc from 'k6/net/grpc';
import { check } from 'k6';
const GRPC_ADDR = '127.0.0.1:10000';
const GRPC_PROTO_PATH = './proto/route_guide.proto';
let client = new grpc.Client();
client.load([], GRPC_PROTO_PATH);
export default () => {
client.connect(GRPC_ADDR, { plaintext: true });
const response = client.invoke('main.FeatureExplorer/GetFeature', {
latitude: 410248224,
longitude: -747127767,
});
check(response, {
'status is OK': (r) => r && r.status === grpc.StatusOK,
});
console.log(JSON.stringify(response.message));
client.close();
};
With TLS
import grpc from 'k6/net/grpc';
const client = new grpc.Client();
client.load([], 'service.proto');
export default () => {
client.connect('api.example.com:443', {
tls: {
cert: open('./client.crt'),
key: open('./client.key'),
cacerts: [open('./ca.crt')],
},
});
const response = client.invoke('service.MyService/MyMethod', {
field: 'value',
});
console.log(response.message);
client.close();
};
import grpc from 'k6/net/grpc';
const client = new grpc.Client();
client.load([], 'service.proto');
export default () => {
client.connect('localhost:50051', { plaintext: true });
const params = {
metadata: {
'authorization': 'Bearer token123',
'x-custom-header': 'value',
},
timeout: '10s',
};
const response = client.invoke('service.MyService/MyMethod',
{ field: 'value' },
params
);
console.log(response.message);
client.close();
};
Server Reflection
import grpc from 'k6/net/grpc';
const client = new grpc.Client();
export default () => {
// Use server reflection to discover services
client.connect('localhost:50051', {
plaintext: true,
reflect: true,
});
const response = client.invoke('service.MyService/MyMethod', {
field: 'value',
});
console.log(response.message);
client.close();
};
gRPC connections cannot be used in the init context. Connect to the server in the VU context (default function).