Compartir a través de


Biblioteca cliente de Azure Load Testing para JavaScript: versión 1.0.0

Azure Load Testing proporciona biblioteca cliente en JavaScript al usuario mediante la cual puede interactuar de forma nativa con el servicio Azure Load Testing. Azure Load Testing es un servicio de prueba de carga totalmente administrado que permite generar una carga a gran escala. El servicio simula el tráfico de las aplicaciones, independientemente del lugar en que se hospeden. Los desarrolladores, evaluadores e ingenieros de control de calidad (QA) pueden usarlo para optimizar el rendimiento, la escalabilidad o la capacidad de las aplicaciones.

Confíe en gran medida en nuestros documentos de cliente REST para usar esta biblioteca.

Documentación

Hay varias documentación disponibles para ayudarle a empezar.

Introducción

Entornos admitidos actualmente

  • Node.js versión 14.x.x o superior

Requisitos previos

Instalar el paquete @azure-rest/load-testing

Instale la biblioteca cliente REST de AzureLoadTesting para JavaScript con npm:

npm install @azure-rest/load-testing

Creación y autenticación de un AzureLoadTesting cliente

Para usar una credencial de token de Azure Active Directory (AAD), proporcione una instancia del tipo de credencial deseado obtenido de la biblioteca de @azure/identidad .

Para autenticarse con AAD, primero npm debe instalar @azure/identity

Después de la instalación, puede elegir qué tipo de credencial@azure/identity usar. Por ejemplo, Se puede usar DefaultAzureCredential para autenticar al cliente.

Establezca los valores del identificador de cliente, el identificador de inquilino y el secreto de cliente de la aplicación de AAD como variables de entorno: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET

import AzureLoadTesting, { AzureLoadTestingClient } from "@azure-rest/load-testing";
import { DefaultAzureCredential } from "@azure/identity";

const Client: AzureLoadTestingClient = AzureLoadTesting(Endpoint, new DefaultAzureCredential());

Conceptos clave

Los siguientes componentes componen el servicio Azure Load Testing. La biblioteca cliente de Prueba de carga de Azure para JavaScript permite interactuar con cada uno de estos componentes mediante el uso de un objeto de cliente dedicado.

Prueba

Una prueba especifica el script de prueba y las opciones de configuración para ejecutar una prueba de carga. Puede crear una o varias pruebas en un recurso de Azure Load Testing.

Componente de aplicación

Al ejecutar una prueba de carga para una aplicación hospedada en Azure, puede supervisar las métricas de recursos de los distintos componentes de la aplicación de Azure (métricas del lado servidor). Mientras se ejecuta la prueba de carga y después de la finalización de la prueba, puede supervisar y analizar las métricas de recursos en el panel Azure Load Testing.

Métricas

Durante una prueba de carga, Azure Load Testing recopila métricas sobre la ejecución de pruebas. Existen dos tipos de métricas:

  1. Las métricas del cliente proporcionan los detalles notificados por el motor de prueba. Estas métricas incluyen el número de usuarios virtuales, el tiempo de respuesta de la solicitud, el número de solicitudes con error o el número de solicitudes por segundo.

  2. Las métricas del lado servidor están disponibles para las aplicaciones hospedadas en Azure y proporcionan información sobre los componentes de las aplicaciones de Azure. Las métricas pueden ser para el número de lecturas de base de datos, el tipo de respuestas HTTP o el consumo de recursos de contenedor.

Motor de pruebas

Un motor de prueba es la infraestructura informática que ejecuta el script de prueba de Apache JMeter. Puede escalar horizontalmente la prueba de carga configurando el número de motores de pruebas. El script de prueba se ejecuta en paralelo en el número especificado de motores de pruebas.

Serie de pruebas

Una serie de pruebas representa la ejecución de una prueba de carga. Recopila los registros asociados a la ejecución del script de Apache JMeter, la configuración de YAML de prueba de carga, la lista de componentes de la aplicación que se va a supervisar y los resultados de la prueba.

punto de conexión de Data-Plane

El plano de datos de los recursos de Azure Load Testing se puede direccionable mediante el siguiente formato de dirección URL:

00000000-0000-0000-0000-000000000000.aaa.cnt-prod.loadtesting.azure.com

El primer GUID 00000000-0000-0000-0000-000000000000 es el identificador único que se usa para acceder al recurso de Azure Load Testing. Esto va seguido de aaa la región de Azure del recurso.

El punto de conexión del plano de datos se obtiene de las API del plano de control.

Ejemplo:1234abcd-12ab-12ab-12ab-123456abcdef.eus.cnt-prod.loadtesting.azure.com

En el ejemplo anterior, eus representa la región East USde Azure .

Ejemplos

Creación de una prueba de carga

import { AzureLoadTestingClient } from "@azure-rest/load-testing";
import AzureLoadTesting from "@azure-rest/load-testing";
import { DefaultAzureCredential } from "@azure/identity";

var TEST_ID = "some-test-id";
var DISPLAY_NAME = "my-load-test";

const client: AzureLoadTestingClient = AzureLoadTesting("<Endpoint>", new DefaultAzureCredential());

await client.path("/tests/{testId}", TEST_ID).patch({
  contentType: "application/merge-patch+json",
  body: {
    displayName: DISPLAY_NAME,
    description: "",
    loadTestConfiguration: {
      engineInstances: 1,
      splitAllCSVs: false,
    },
    secrets: {},
    environmentVariables: {},
    passFailCriteria: { passFailMetrics: {} },
  },
});

Carga del archivo .jmx en una prueba

import { AzureLoadTestingClient, getLongRunningPoller, isUnexpected } from "@azure-rest/load-testing";
import AzureLoadTesting from "@azure-rest/load-testing";
import { AbortController } from "@azure/abort-controller";
import { DefaultAzureCredential } from "@azure/identity";
import { createReadStream } from "fs";

const client: AzureLoadTestingClient = AzureLoadTesting("<Endpoint>", new DefaultAzureCredential());

var TEST_ID = "some-test-id";
const readStream = createReadStream("./sample.jmx");

const fileUploadResult = await client
  .path("/tests/{testId}/files/{fileName}", TEST_ID, "sample.jmx")
  .put({
    contentType: "application/octet-stream",
    body: readStream,
  });

if (isUnexpected(fileUploadResult)) {
  throw fileUploadResult.body.error;
}

let fileValidateResult;
const fileValidatePoller = await getLongRunningPoller(client, fileUploadResult);
try{
fileValidateResult = await fileValidatePoller.pollUntilDone({
  abortSignal: AbortController.timeout(120*1000), // timeout of 120 seconds
});} catch (ex: any) {
new Error("Error in polling file Validation" + ex.message); //polling timed out
}

if (fileValidatePoller.getOperationState().status != "succeeded" && fileValidateResult)
  throw new Error(
    "There is some issue in validation, please make sure uploaded file is a valid JMX." +
      fileValidateResult.body.validationFailureDetails
  );

Ejecución de una prueba y captura de métricas

import { AzureLoadTestingClient, getLongRunningPoller, isUnexpected } from "@azure-rest/load-testing";
import AzureLoadTesting from "@azure-rest/load-testing";
import { DefaultAzureCredential } from "@azure/identity";
import { AbortController } from "@azure/abort-controller";

const client: AzureLoadTestingClient = AzureLoadTesting("<Endpoint>", new DefaultAzureCredential());

var TEST_ID = "some-test-id";
var DISPLAY_NAME = "my-load-test";
var TEST_RUN_ID = "some-test-run-id";

// Creating/Updating the test run
const testRunCreationResult = await client.path("/test-runs/{testRunId}", TEST_RUN_ID).patch({
  contentType: "application/merge-patch+json",
  body: {
    testId: TEST_ID,
    displayName: DISPLAY_NAME,
  },
});

if (isUnexpected(testRunCreationResult)) {
  throw testRunCreationResult.body.error;
}

if (testRunCreationResult.body.testRunId === undefined)
  throw new Error("Test Run ID returned as undefined.");

const testRunPoller = await getLongRunningPoller(client, testRunCreationResult);
  let testRunResult;

  try {
    testRunResult = await testRunPoller.pollUntilDone({
      abortSignal: AbortController.timeout(60000), // timeout of 60 seconds
    });
  } catch (ex: any) {
    new Error("Error in polling test run completion" + ex.message); //polling timed out
  }

  if (testRunPoller.getOperationState().status != "succeeded")
    throw new Error("There is some issue in running the test, Error Response : " + testRunResult);

  if (testRunResult) {
    let testRunStarttime = testRunResult.body.startDateTime;
    let testRunEndTime = testRunResult.body.endDateTime;

    // get list of all metric namespaces and pick the first one
    const metricNamespaces = await client
      .path("/test-runs/{testRunId}/metric-namespaces", TEST_RUN_ID)
      .get();

    if (isUnexpected(metricNamespaces)) {
      throw metricNamespaces.body.error;
    }

    const metricNamespace = metricNamespaces.body.value[0];

    if (metricNamespace.name === undefined) {
      throw "No Metric Namespace name is defined.";
    }

    // get list of all metric definitions and pick the first one
    const metricDefinitions = await client
      .path("/test-runs/{testRunId}/metric-definitions", TEST_RUN_ID)
      .get({
        queryParameters: {
          metricNamespace: metricNamespace.name,
        },
      });

    if (isUnexpected(metricDefinitions)) {
      throw metricDefinitions.body.error;
    }

    const metricDefinition = metricDefinitions.body.value[0];

    if (metricDefinition.name === undefined) {
      throw "No Metric Namespace name is defined.";
    }

    // fetch client metrics using metric namespace and metric name
    const metricsResult = await client.path("/test-runs/{testRunId}/metrics", TEST_RUN_ID).post({
      queryParameters: {
        metricname: metricDefinition.name,
        metricNamespace: metricNamespace.name,
        timespan: testRunStarttime + "/" + testRunEndTime,
      },
    });

    console.log(metricsResult);
    console.log(testRunResult);
}

Solución de problemas

Registro

La habilitación del registro puede ayudar a descubrir información útil sobre los errores. Para ver un registro de solicitudes y respuestas HTTP, establezca la variable de entorno AZURE_LOG_LEVEL en info. Como alternativa, el registro se puede habilitar en tiempo de ejecución llamando a setLogLevel en @azure/logger:

import { setLogLevel } from "@azure/logger";

setLogLevel("info");

Para obtener instrucciones más detalladas sobre cómo habilitar los registros, consulte los documentos del paquete @azure/logger.

Pasos siguientes

Los ejemplos del SDK de JavaScript de pruebas de carga de Azure están disponibles en el repositorio de GitHub del SDK. Estos ejemplos proporcionan código de ejemplo para escenarios adicionales que se suelen encontrar.

Consulte ejemplos de Azure Load Testing.

Contribuir

Para más información sobre cómo contribuir a este repositorio, consulte la guía de contribución.

  1. Bifurcarlo
  2. Creación de la rama de características (git checkout -b my-new-feature)
  3. Confirmar los cambios (git commit -am 'Add some feature')
  4. Inserción en la rama (git push origin my-new-feature)
  5. Creación de una nueva solicitud de incorporación de cambios