JavaScript용 Azure Load Testing 클라이언트 라이브러리 - 버전 1.0.0
Azure Load Testing은 Azure Load Testing 서비스와 기본적으로 상호 작용할 수 있는 사용자에게 JavaScript의 클라이언트 라이브러리를 제공합니다. Azure Load Testing은 대규모 부하를 생성할 수 있는 완전 관리형 부하 테스트 서비스입니다. 서비스는 호스팅되는 위치에 관계없이 애플리케이션에 대한 트래픽을 시뮬레이션합니다. 개발자, 테스터 및 QA(품질 보증) 엔지니어는 이를 사용하여 애플리케이션 성능, 확장성 또는 용량을 최적화할 수 있습니다.
이 라이브러리를 사용하려면 REST 클라이언트 문서에 크게 의존하세요.
설명서
시작하는 데 도움이 되는 다양한 설명서를 사용할 수 있습니다.
시작
현재 지원되는 환경
- Node.js 버전 14.x.x 이상
사전 요구 사항
- 이 패키지를 사용하려면 Azure 구독 및 Azure 부하 테스트 서비스 리소스 가 있어야 합니다.
@azure-rest/load-testing
패키지를 설치합니다.
을 사용하여 JavaScript용 AzureLoadTesting 클라이언트 REST 클라이언트 라이브러리를 npm
설치합니다.
npm install @azure-rest/load-testing
클라이언트 만들기 및 인증 AzureLoadTesting
AAD(Azure Active Directory) 토큰 자격 증명을 사용하려면 @azure/ID 라이브러리에서 가져온 원하는 자격 증명 형식의 인스턴스를 제공합니다.
AAD로 인증하려면 먼저 npm
설치해야 합니다. @azure/identity
설치 후 사용할 자격 증명@azure/identity
유형을 선택할 수 있습니다.
예를 들어 DefaultAzureCredential을 사용하여 클라이언트를 인증할 수 있습니다.
AAD 애플리케이션의 클라이언트 ID, 테넌트 ID 및 클라이언트 암호 값을 환경 변수로 설정합니다( 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());
주요 개념
다음 구성 요소는 Azure Load Testing Service를 구성합니다. JavaScript용 Azure 부하 테스트 클라이언트 라이브러리를 사용하면 전용 클라이언트 개체를 사용하여 이러한 각 구성 요소와 상호 작용할 수 있습니다.
테스트
테스트는 부하 테스트를 실행하기 위한 테스트 스크립트 및 구성 설정을 지정합니다. Azure Load Testing 리소스에서 하나 이상의 테스트를 만들 수 있습니다.
앱 구성 요소
Azure 호스트 애플리케이션에 대한 부하 테스트를 실행하는 경우 다양한 Azure 애플리케이션 구성 요소에 대한 리소스 메트릭(서버 쪽 메트릭)을 모니터링할 수 있습니다. 부하 테스트가 실행되는 동안 및 테스트가 완료된 후 Azure Load Testing 대시보드에서 리소스 메트릭을 모니터링하고 분석할 수 있습니다.
메트릭
부하 테스트 중에 Azure Load Testing은 테스트 실행에 대한 메트릭을 수집합니다. 다음과 같이 두 가지 유형의 메트릭이 있습니다.
클라이언트 쪽 메트릭은 테스트 엔진에서 보고한 세부 정보를 제공합니다. 이러한 메트릭에는 가상 사용자 수, 요청 응답 시간, 실패한 요청 수 또는 초당 요청 수가 포함됩니다.
서버 쪽 메트릭은 Azure 호스트 애플리케이션에 사용할 수 있으며 Azure 애플리케이션 구성 요소에 대한 정보를 제공합니다. 메트릭은 데이터베이스 읽기 수, HTTP 응답 유형 또는 컨테이너 리소스 사용량에 대한 것일 수 있습니다.
테스트 엔진
테스트 엔진은 Apache JMeter 테스트 스크립트를 실행하는 컴퓨팅 인프라입니다. 테스트 엔진 수를 구성하여 부하 테스트를 스케일 아웃할 수 있습니다. 테스트 스크립트는 지정된 수의 테스트 엔진에서 병렬로 실행됩니다.
테스트 실행
테스트 실행은 부하 테스트를 한 번 실행하는 것을 나타냅니다. Apache JMeter 스크립트 실행, 부하 테스트 YAML 구성, 모니터링할 앱 구성 요소 목록 및 테스트 결과와 관련된 로그를 수집합니다.
Data-Plane 엔드포인트
Azure Load Testing 리소스의 데이터 평면은 다음 URL 형식을 사용하여 주소를 지정할 수 있습니다.
00000000-0000-0000-0000-000000000000.aaa.cnt-prod.loadtesting.azure.com
첫 번째 GUID 00000000-0000-0000-0000-000000000000
는 Azure Load Testing 리소스에 액세스하는 데 사용되는 고유 식별자입니다. 그 다음에 aaa
는 리소스의 Azure 지역이 표시됩니다.
데이터 평면 엔드포인트는 컨트롤 플레인 API에서 가져옵니다.
예제:1234abcd-12ab-12ab-12ab-123456abcdef.eus.cnt-prod.loadtesting.azure.com
위의 예제에서 는 eus
Azure 지역 East US
을 나타냅니다.
예제
부하 테스트 만들기
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: {} },
},
});
테스트에 .jmx 파일 업로드
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
);
테스트 실행 및 메트릭 가져오기
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);
}
문제 해결
로깅
로깅을 사용하도록 설정하면 실패에 대한 유용한 정보를 파악하는 데 도움이 될 수 있습니다. HTTP 요청 및 응답 로그를 보려면 AZURE_LOG_LEVEL
환경 변수를 info
로 설정합니다. 또는 @azure/logger
에서 setLogLevel
을 호출하여 런타임에 로깅을 사용하도록 설정할 수 있습니다.
import { setLogLevel } from "@azure/logger";
setLogLevel("info");
로그를 사용하는 방법에 대한 자세한 내용은 @azure/logger package docs를 참조하세요.
다음 단계
Azure Loading Testing JavaScript SDK 샘플은 SDK의 GitHub 리포지토리에서 사용할 수 있습니다. 이러한 샘플은 일반적으로 발생하는 추가 시나리오에 대한 예제 코드를 제공합니다.
참여
이 리포지토리에 기여하는 방법은 기여 가이드를 참조하세요.
- 포크
- 기능 분기 만들기(
git checkout -b my-new-feature
) - 변경 내용 커밋(
git commit -am 'Add some feature'
) - 분기에 푸시(
git push origin my-new-feature
) - 새 끌어오기 요청 만들기
Azure SDK for JavaScript