Diseño de pruebas de performance en K6 para gRPC

Importaciones

  • group y check de k6 son funciones que permiten estructurar las pruebas y validar respuestas respectivamente.

  • grpc de k6/net/grpc: Proporciona funcionalidades para hacer llamadas gRPC.

  • Configuraciones específicas de ACCOUNT_AGGREGATION_REST son importadas desde un archivo de configuración config.js.

  • papaparse biblioteca importada para analizar archivos CSV.

  • SharedArray de k6/data permite compartir datos entre diferentes VUs (Unidades Virtuales) durante una prueba.

1import { check } from 'k6'; 2import grpc from 'k6/net/grpc'; 3import { ACCOUNT_AGGREGATION_GRPC } from '../../../../config.js'; 4import papaparse from '../../../../../../../../../modules/papaparse.js'; 5import { SharedArray } from 'k6/data';

Configuración del cliente gRPC y Datos


Se crea una nueva instancia del cliente gRPC y se cargan las definiciones desde el archivo proto mediante la configuración importada.

1const client = new grpc.Client(); 2client.load([ACCOUNT_AGGREGATION_GRPC.protoPath], ACCOUNT_AGGREGATION_GRPC.protoFile);


Se definen las opciones que k6 empleará al ejecutar la prueba, tales como número de usuarios virtuales, iteraciones, duración máxima, entre otros.

1export const options = { 2 rps: ACCOUNT_AGGREGATION_GRPC.testOptions.rps, 3 //discardResponseBodies: TEST_OPTIONS_INTEGRATION.discardResponseBodies, 4 scenarios: { 5 Scenario_BalanceDetails: { 6 exec: 'balanceDetailsSuccessGrpcTask', 7 executor: ACCOUNT_AGGREGATION_GRPC.testOptions.executor, 8 vus: ACCOUNT_AGGREGATION_GRPC.testOptions.vus, 9 iterations: ACCOUNT_AGGREGATION_GRPC.testOptions.iterations, 10 maxDuration: ACCOUNT_AGGREGATION_GRPC.testOptions.maxDuration, 11 } 12 } 13};


El archivo CSV es cargado en memoria a través de un SharedArray. Con el uso de papaparse, se analiza este archivo para luego acceder a la información que contiene.

1const csvData = new SharedArray('accountsTestData', function () { 2 return papaparse.parse(open(`${ACCOUNT_AGGREGATION_GRPC.testDataPath}/accountsTestData.csv`), { header: true }).data; 3});

Función de Prueba

  • La función balanceDetailsSuccessGrpcTask() define un escenario de prueba:

    • Selecciona aleatoriamente una cuenta del archivo CSV para posteriormente setearla como número de cuenta.

    • Una vez seleccionado el número de cuenta, se establece una conexión gRPC usando las configuraciones definidas. Posteriormente, se invoca un servicio gRPC usando este número de cuenta.

    • Después de obtener la respuesta de la llamada gRPC, utiliza la función check para verificar que el estado de la respuesta sea "OK" para gRPC, lo que sería equivalente a un estado HTTP de 200.

    • Una vez finalizada la verificación, se cierra la conexión gRPC.

1export function balanceDetailsSuccessGrpcTask() { 2 3 const randomAccount = csvData[Math.floor(Math.random() * csvData.length)]; 4 5 const data = { 6 "accountNumber": randomAccount.account 7 }; 8 9 client.connect(ACCOUNT_AGGREGATION_GRPC.uri, { 10 plaintext: ACCOUNT_AGGREGATION_GRPC.plainText 11 }); 12 13 const response = client.invoke(ACCOUNT_AGGREGATION_GRPC.service + ACCOUNT_AGGREGATION_GRPC.balance.balances, data); 14 15 check(response, { 16 'status is OK': (r) => r && r.status === grpc.StatusOK, 17 }); 18 19 client.close(); 20};