Compartir a través de


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

Azure Load Testing proporciona una 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 pruebas de carga totalmente administrado que permite generar una carga a gran escala. El servicio simula el tráfico de las aplicaciones, independientemente de dónde se hospeden. Los desarrolladores, evaluadores y 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 de para usar esta biblioteca

Documentación

Hay varias documentación disponibles para ayudarle a empezar

  • código fuente
  • documentación de referencia de api de
  • documentación del producto de

Empezar

Entornos admitidos actualmente

Prerrequisitos

  • Debe tener una de suscripción de Azure y recurso de Azure Load Test Service para usar este paquete.

Instalación del 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 cliente de AzureLoadTesting

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/identity.

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

Después de la instalación, puede elegir qué tipo de credenciales de de @azure/identity usar. Por ejemplo, DefaultAzureCredential se puede usar 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 Azure Load Test 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 de Azure Load Testing.

Métricas

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

  1. Las métricas del lado cliente proporcionan detalles notificados por el motor de pruebas. 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 la aplicación 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 pruebas 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 prueba. El script de prueba se ejecuta en paralelo en el número especificado de motores de prueba.

Ejecución de pruebas

Una ejecución de prueba representa una ejecución de una prueba de carga. Recopila los registros asociados con 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 van 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 abordar 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 que es 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 de :1234abcd-12ab-12ab-12ab-123456abcdef.eus.cnt-prod.loadtesting.azure.com

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

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 { 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: AbortSignal.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";

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: AbortSignal.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

Habilitar el registro puede ayudar a descubrir información útil sobre 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 el @azure/logger:

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

setLogLevel("info");

Para obtener instrucciones más detalladas sobre cómo habilitar los registros, puede consultar los documentos del paquete de @azure/registrador.

Pasos siguientes

Los ejemplos del SDK de JavaScript de prueba 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 encuentran habitualmente.

Consulte ejemplos de Azure Load Testing.

Contribuyendo

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

  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. Insertar en la rama (git push origin my-new-feature)
  5. Crear una nueva solicitud de incorporación de cambios