Partager via


Bibliothèque de client Test de charge Azure pour Java - version 1.0.7

Test de charge Azure fournit une bibliothèque cliente dans Java à l’utilisateur grâce à laquelle il peut interagir en mode natif avec le service Test de charge Azure. Test de charge Azure est un service complètement managé qui permet de générer une charge à grande échelle. Il simule un trafic pour vos applications, quel que soit l’endroit où elles sont hébergées. Les développeurs, les testeurs et les ingénieurs de l’assurance qualité (QA) peuvent l’utiliser pour optimiser les performances, l’extensibilité ou la capacité des applications

Ce package contient la bibliothèque du client Microsoft Azure Developer LoadTesting.

Documentation

Diverses documentations sont disponibles pour vous aider à démarrer

Prise en main

Prérequis

Ajout du package à votre produit

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-developer-loadtesting</artifactId>
    <version>1.0.7</version>
</dependency>

Authentification

Le package Azure Identity fournit l’implémentation par défaut pour l’authentification du client.

Par défaut, l’authentification par jeton Azure Active Directory dépend de la configuration correcte des variables d’environnement suivantes.

  • AZURE_CLIENT_ID pour l’ID client Azure.
  • AZURE_TENANT_ID pour l’ID de locataire Azure.
  • AZURE_CLIENT_SECRET ou AZURE_CLIENT_CERTIFICATE_PATH pour la clé secrète client ou le certificat client.

En outre, l’ID d’abonnement Azure peut être configuré via la variable d’environnement AZURE_SUBSCRIPTION_ID.

Avec la configuration ci-dessus, azure le client peut être authentifié par le code suivant :

// ensure the user, service principal or managed identity used has Loadtesting Contributor role for the resource
TokenCredential credential = new DefaultAzureCredentialBuilder()
    .build();
// create client using DefaultAzureCredential
LoadTestAdministrationClient adminClient = new LoadTestAdministrationClientBuilder()
        .credential(credential)
        .endpoint("<Enter Azure Load Testing Data-Plane URL>")
        .buildClient();
LoadTestRunClient testRunClient = new LoadTestRunClientBuilder()
        .credential(credential)
        .endpoint("<Enter Azure Load Testing Data-Plane URL>")
        .buildClient();

RequestOptions reqOpts = new RequestOptions()
    .addQueryParam("orderBy", "lastModifiedDateTime")
    .addQueryParam("maxPageSize", "10");
adminClient.listTests(reqOpts);

reqOpts = new RequestOptions()
    .addQueryParam("orderBy", "lastModifiedDateTime")
    .addQueryParam("status", "EXECUTING,DONE")
    .addQueryParam("maxPageSize", "10");
testRunClient.listTestRuns(reqOpts);

Concepts clés

Les composants suivants composent le service Test de charge Azure. La bibliothèque cliente test de charge Azure pour Java vous permet d’interagir avec chacun de ces composants via l’utilisation de clients. Il existe deux clients de niveau supérieur qui sont les points d’entrée main pour la bibliothèque

  • LoadTestingClient

  • LoadTestingAsyncClient

Les deux clients ont des méthodes similaires, sauf que les méthodes du client asynchrone sont également asynchrones.

Les clients de niveau supérieur ont deux sous-clients

  • LoadTestAdministration

  • TestRun

Ces sous-clients sont utilisés pour gérer et utiliser différents composants du service.

Client d’administration de test de charge

Les LoadTestAdministration sous-clients sont utilisés pour administrer et configurer les tests de charge, les composants d’application et les métriques.

Test

Un test spécifie le script de test et les paramètres de configuration pour l’exécution d’un test de charge. Vous pouvez créer un ou plusieurs tests dans une ressource de test de charge Azure.

Composant d’application

Lorsque vous exécutez un test de charge pour une application hébergée sur Azure, vous pouvez surveiller les métriques des ressources pour les différents composants de l’application Azure (métriques côté serveur). Pendant l’exécution du test de charge et après l’achèvement du test, vous pouvez surveiller et analyser les métriques de ressources dans le tableau de bord de test de charge Azure.

Mesures

Pendant un test de charge, le test de charge Azure collecte des métriques sur l’exécution des tests. Il existe deux types de métriques :

  1. Les métriques côté client fournissent des détails signalés par le moteur de test. Ces métriques comprennent le nombre d’utilisateurs virtuels, le temps de réponse aux requêtes, le nombre de requêtes ayant échoué et le nombre de requêtes par seconde.

  2. Les métriques côté serveur sont disponibles pour les applications hébergées par Azure et fournissent des informations sur vos composants d’application Azure. Les métriques peuvent concerner le nombre de lectures de base de données, le type de réponses HTTP ou la consommation de ressources de conteneur.

Client d’exécution de test

Les TestRun sous-clients sont utilisés pour démarrer et arrêter des exécutions de test correspondant à un test de charge. Une série de tests représente une exécution d’un test de charge. Elle collecte les journaux associés à l’exécution du script Apache JMeter, la configuration YAML du test de charge, la liste des composants d’application à analyser et les résultats du test.

point de terminaison Data-Plane

Le plan de données des ressources Test de charge Azure est adressable au format d’URL suivant :

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

Le premier GUID 00000000-0000-0000-0000-000000000000 est l’identificateur unique utilisé pour accéder à la ressource Test de charge Azure. Suivi de aaa la région Azure de la ressource.

Le point de terminaison du plan de données est obtenu à partir des API de plan de contrôle.

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

Dans l’exemple ci-dessus, eus représente la région East USAzure .

Exemples

Création d’un test de charge

LoadTestAdministrationClient adminClient = new LoadTestAdministrationClientBuilder()
        .credential(new DefaultAzureCredentialBuilder().build())
        .endpoint("<endpoint>")
        .buildClient();

// construct Test object using nested String:Object Maps
Map<String, Object> testMap = new HashMap<String, Object>();
testMap.put("displayName", "Sample Display Name");
testMap.put("description", "Sample Description");

// loadTestConfig describes the number of test engines to generate load
Map<String, Object> loadTestConfigMap = new HashMap<String, Object>();
loadTestConfigMap.put("engineInstances", 1);
testMap.put("loadTestConfiguration", loadTestConfigMap);

// environmentVariables are plain-text data passed to test engines
Map<String, Object> envVarMap = new HashMap<String, Object>();
envVarMap.put("a", "b");
envVarMap.put("x", "y");
testMap.put("environmentVariables", envVarMap);

// secrets are secure data sent using Azure Key Vault
Map<String, Object> secretMap = new HashMap<String, Object>();
Map<String, Object> sampleSecretMap = new HashMap<String, Object>();
sampleSecretMap.put("value", "https://samplevault.vault.azure.net/secrets/samplesecret/f113f91fd4c44a368049849c164db827");
sampleSecretMap.put("type", "AKV_SECRET_URI");
secretMap.put("sampleSecret", sampleSecretMap);
testMap.put("secrets", secretMap);

// passFailCriteria define the conditions to conclude the test as success
Map<String, Object> passFailMap = new HashMap<String, Object>();
Map<String, Object> passFailMetrics = new HashMap<String, Object>();
Map<String, Object> samplePassFailMetric = new HashMap<String, Object>();
samplePassFailMetric.put("clientmetric", "response_time_ms");
samplePassFailMetric.put("aggregate", "percentage");
samplePassFailMetric.put("condition", ">");
samplePassFailMetric.put("value", "20");
samplePassFailMetric.put("action", "continue");
passFailMetrics.put("fefd759d-7fe8-4f83-8b6d-aeebe0f491fe", samplePassFailMetric);
passFailMap.put("passFailMetrics", passFailMetrics);
testMap.put("passFailCriteria", passFailMap);

// convert the object Map to JSON BinaryData
BinaryData test = BinaryData.fromObject(testMap);

// receive response with BinaryData content
Response<BinaryData> testOutResponse = adminClient.createOrUpdateTestWithResponse("test12345", test, null);
System.out.println(testOutResponse.getValue().toString());

Chargement du fichier .jmx dans un test de charge

LoadTestAdministrationClient adminClient = new LoadTestAdministrationClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .endpoint("<endpoint>")
    .buildClient();

// extract file contents to BinaryData
BinaryData fileData = BinaryData.fromFile(new File("path/to/file").toPath());

// receive response with BinaryData content
Response<BinaryData> fileUrlOut = adminClient.uploadTestFileWithResponse("test12345", "sample-file.jmx", fileData, null);
System.out.println(fileUrlOut.getValue().toString());

Exécution d’un test de charge

LoadTestRunClient testRunClient = new LoadTestRunClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .endpoint("<endpoint>")
    .buildClient();

// construct Test Run object using nested String:Object Maps
Map<String, Object> testRunMap = new HashMap<String, Object>();
testRunMap.put("testId", "test12345");
testRunMap.put("displayName", "SDK-Created-TestRun");

// convert the object Map to JSON BinaryData
BinaryData testRun = BinaryData.fromObject(testRunMap);

// start test with poller
SyncPoller<BinaryData, BinaryData> poller = testRunClient.beginTestRun("testrun12345", testRun, null);
Duration pollInterval = Duration.ofSeconds(5);
poller = poller.setPollInterval(pollInterval);

// wait for test to reach terminal state
JsonNode testRunJson = null;
String testStatus;
PollResponse<BinaryData> pollResponse = poller.poll();
while (pollResponse.getStatus() == LongRunningOperationStatus.IN_PROGRESS || pollResponse.getStatus() == LongRunningOperationStatus.NOT_STARTED) {
    try {
        testRunJson = new ObjectMapper().readTree(pollResponse.getValue().toString());
        testStatus = testRunJson.get("status").asText();
        System.out.println("Test run status: " + testStatus);
    } catch (JsonProcessingException e) {
        System.out.println("Error processing JSON response");
        // handle error condition
    }

    // wait and check test status every 5 seconds
    try {
        Thread.sleep(pollInterval.toMillis());
    } catch (InterruptedException e) {
        // handle interruption
    }

    pollResponse = poller.poll();
}

poller.waitForCompletion();
BinaryData testRunBinary = poller.getFinalResult();
try {
    testRunJson = new ObjectMapper().readTree(testRunBinary.toString());
    testStatus = testRunJson.get("status").asText();
} catch (JsonProcessingException e) {
    System.out.println("Error processing JSON response");
    // handle error condition
}

String startDateTime = testRunJson.get("startDateTime").asText();
String endDateTime = testRunJson.get("endDateTime").asText();

// get list of all metric namespaces and pick the first one
Response<BinaryData> metricNamespacesOut = testRunClient.getMetricNamespacesWithResponse("testrun12345", null);
String metricNamespace = null;
// parse JSON and read first value
try {
    JsonNode metricNamespacesJson = new ObjectMapper().readTree(metricNamespacesOut.getValue().toString());
    metricNamespace = metricNamespacesJson.get("value").get(0).get("metricNamespaceName").asText();
} catch (JsonProcessingException e) {
    System.out.println("Error processing JSON response");
    // handle error condition
}

// get list of all metric definitions and pick the first one
Response<BinaryData> metricDefinitionsOut = testRunClient.getMetricDefinitionsWithResponse("testrun12345", metricNamespace, null);
String metricName = null;
// parse JSON and read first value
try {
    JsonNode metricDefinitionsJson = new ObjectMapper().readTree(metricDefinitionsOut.getValue().toString());
    metricName = metricDefinitionsJson.get("value").get(0).get("name").get("value").asText();
} catch (JsonProcessingException e) {
    System.out.println("Error processing JSON response");
    // handle error condition
}

// fetch client metrics using metric namespace and metric name
PagedIterable<BinaryData> clientMetricsOut = testRunClient.listMetrics("testrun12345", metricName, metricNamespace, startDateTime + '/' + endDateTime, null);
clientMetricsOut.forEach((clientMetric) -> {
    System.out.println(clientMetric.toString());
});

Dépannage

Les sdk Azure pour Java offrent une histoire de journalisation cohérente pour vous aider à résoudre les erreurs d’application et à accélérer leur résolution. Les journaux produits capturent le flux d’une application avant d’atteindre l’état terminal pour faciliter la localisation du problème racine. Consultez le wiki de journalisation pour obtenir des conseils sur l’activation de la journalisation.

Étapes suivantes

Des exemples de kit de développement logiciel (SDK) Test de chargement Azure sont disponibles dans le référentiel GitHub du SDK. Ces exemples fournissent un exemple de code pour d’autres scénarios fréquemment rencontrés. Consultez Exemples de tests de charge Azure.

Contribution

Pour plus d’informations sur la contribution à ce dépôt, consultez le guide de contribution.

  1. Fork it
  2. Créer votre branche de fonctionnalité (git checkout -b my-new-feature)
  3. Valider vos modifications (git commit -am 'Add some feature')
  4. Push vers la branche (git push origin my-new-feature)
  5. Créer une demande de tirage