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
- Kit de développement Java (JDK) avec la version 8 ou ultérieure
- Abonnement Azure
- Ressource Test de charge Azure
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
ouAZURE_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 :
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.
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 US
Azure .
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.
- Fork it
- Créer votre branche de fonctionnalité (
git checkout -b my-new-feature
) - Valider vos modifications (
git commit -am 'Add some feature'
) - Push vers la branche (
git push origin my-new-feature
) - Créer une demande de tirage