Condividi tramite


Libreria client di Test di carico di Azure per JavaScript - versione 1.0.1

Test di carico di Azure fornisce la libreria client in JavaScript all'utente tramite cui può interagire in modo nativo con il servizio Test di carico di Azure. Test di carico di Azure è un servizio di test di carico completamente gestito che consente di generare un carico su larga scala. Il servizio simula il traffico per le applicazioni, indipendentemente dalla posizione in cui sono ospitate. Gli sviluppatori, i tester e gli ingegneri di controllo della qualità possono usarlo per ottimizzare le prestazioni, la scalabilità o la capacità dell'applicazione.

Per usare questa libreria, della documentazione del client REST

Documentazione

Per iniziare, sono disponibili varie documentazioni

Introduttiva

Ambienti attualmente supportati

Prerequisiti

  • Per usare questo pacchetto, è necessario disporre di un di sottoscrizione di Azure e risorsa del servizio di test di carico di Azure.

Installare il pacchetto @azure-rest/load-testing

Installare la libreria client REST del client AzureLoadTesting per JavaScript con npm:

npm install @azure-rest/load-testing

Creare ed autenticare un client AzureLoadTesting

Per usare un credenziali token di Azure Active Directory (AAD), fornire un'istanza del tipo di credenziale desiderato ottenuto dalla libreria @azure/identity.

Per eseguire l'autenticazione con AAD, è prima necessario installare npm@azure/identity

Dopo l'installazione, è possibile scegliere il tipo di credenziali da @azure/identity da usare. Ad esempio, è possibile usare DefaultAzureCredential per autenticare il client.

Impostare i valori dell'ID client, dell'ID tenant e del segreto client dell'applicazione AAD come variabili di ambiente: 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());

Concetti chiave

I componenti seguenti costituiscono il servizio Test di carico di Azure. La libreria client di test di carico di Azure per JavaScript consente di interagire con ognuno di questi componenti tramite l'uso di un oggetto client dedicato.

Test

Un test specifica lo script di test e le impostazioni di configurazione per l'esecuzione di un test di carico. È possibile creare uno o più test in una risorsa test di carico di Azure.

Componente dell'app

Quando si esegue un test di carico per un'applicazione ospitata in Azure, è possibile monitorare le metriche delle risorse per i diversi componenti dell'applicazione di Azure (metriche lato server). Durante l'esecuzione del test di carico e dopo il completamento del test, è possibile monitorare e analizzare le metriche delle risorse nel dashboard test di carico di Azure.

Metriche

Durante un test di carico, Test di carico di Azure raccoglie le metriche sull'esecuzione del test. Esistono due tipi di metriche:

  1. Le metriche lato client forniscono i dettagli segnalati dal motore di test. Queste metriche includono il numero di utenti virtuali, il tempo di risposta della richiesta, il numero di richieste non riuscite o il numero di richieste al secondo.

  2. Le metriche lato server sono disponibili per le applicazioni ospitate in Azure e forniscono informazioni sui componenti dell'applicazione Azure. Le metriche possono essere per il numero di letture di database, il tipo di risposte HTTP o il consumo di risorse del contenitore.

Motore di test

Un motore di test è un'infrastruttura di calcolo che esegue lo script di test di Apache JMeter. È possibile aumentare il numero di test di carico configurando il numero di motori di test. Lo script di test viene eseguito in parallelo nel numero specificato di motori di test.

Esecuzione test

Un'esecuzione di test rappresenta un'esecuzione di un test di carico. Raccoglie i log associati all'esecuzione dello script Apache JMeter, la configurazione YAML del test di carico, l'elenco dei componenti dell'app da monitorare e i risultati del test.

endpoint Data-Plane

Il piano dati delle risorse di Test di carico di Azure è indirizzabile usando il formato URL seguente:

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

Il primo GUID 00000000-0000-0000-0000-000000000000 è l'identificatore univoco usato per accedere alla risorsa test di carico di Azure. Questo è seguito da aaa che è l'area di Azure della risorsa.

L'endpoint del piano dati viene ottenuto dalle API del piano di controllo.

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

Nell'esempio precedente eus rappresenta l'area di Azure East US.

Esempi

Creazione di un test di carico

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: {} },
  },
});

Caricamento di un file jmx in un test

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
  );

Esecuzione di un test e recupero di metriche

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);
}

Risoluzione dei problemi

Registrazione

L'abilitazione della registrazione può aiutare a individuare informazioni utili sugli errori. Per visualizzare un log di richieste e risposte HTTP, impostare la variabile di ambiente AZURE_LOG_LEVEL su info. In alternativa, la registrazione può essere abilitata in fase di esecuzione chiamando setLogLevel nel @azure/logger:

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

setLogLevel("info");

Per istruzioni più dettagliate su come abilitare i log, è possibile esaminare la documentazione del pacchetto @azure/logger.

Passaggi successivi

Gli esempi di JavaScript SDK di test di caricamento di Azure sono disponibili nel repository GitHub dell'SDK. Questi esempi forniscono codice di esempio per scenari aggiuntivi comunemente rilevati.

Vedere esempi di test di carico di Azure.

Contribuire

Per informazioni dettagliate sul contributo a questo repository, vedere la guida contribuire.

  1. Fork it
  2. Creare il ramo di funzionalità (git checkout -b my-new-feature)
  3. Eseguire il commit delle modifiche (git commit -am 'Add some feature')
  4. Eseguire il push nel ramo (git push origin my-new-feature)
  5. Creare una nuova richiesta pull