자습서: CI/CD를 사용하여 부하 테스트를 자동화하여 성능 회귀 식별
이 자습서에서는 Azure Load Testing 및 CI/CD 도구를 사용하여 성능 회귀를 빠르게 식별하는 방법을 설명합니다. Azure Pipelines 또는 GitHub Actions 부하 테스트를 실행하여 애플리케이션이 부하에서 성능 저하를 경험하는 경우를 신속하게 식별합니다.
이 자습서에서는 Azure에서 샘플 애플리케이션에 대한 부하 테스트를 실행하는 CI/CD 파이프라인을 설정합니다. CI/CD 대시보드에서 직접 로드 중인 애플리케이션 동작을 확인합니다. 그런 다음, 부하 테스트 실패 조건을 사용하여 애플리케이션이 품질 요구 사항을 충족하지 않을 때 경고를 받습니다.
이 자습서에서는 샘플 Node.js 애플리케이션 및 JMeter 스크립트를 사용합니다. 이 자습서에는 코딩 또는 Apache JMeter 기술이 필요하지 않습니다.
이 문서에서 배울 내용은 다음과 같습니다.
- 샘플 애플리케이션 GitHub 리포지토리를 설정합니다.
- CI/CD 워크플로에 대한 서비스 인증을 구성합니다.
- 부하 테스트를 실행하도록 CI/CD 워크플로를 구성합니다.
- CI/CD 대시보드에서 부하 테스트 결과를 봅니다.
- 부하 테스트 실패 조건을 정의하여 성능 회귀를 식별합니다.
참고
Azure Pipelines는 프라이빗 프로젝트에 대해 Microsoft 호스팅 에이전트에서 실행되는 작업에 대해 60분의 시간 제한이 있습니다. 부하 테스트가 60분 이상 실행되는 경우 추가 용량에 대한 비용을 지불해야 합니다. 그렇지 않은 경우 파이프라인은 테스트 결과를 기다리지 않고 시간 초과됩니다. Azure Portal 부하 테스트의 상태를 볼 수 있습니다.
필수 구성 요소
- 활성 구독이 있는 Azure 계정. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
- Azure Pipelines를 사용하는 경우 Azure DevOps 조직 및 프로젝트입니다. Azure DevOps 조직이 없는 경우 무료로 만들 수 있습니다. Azure Pipelines를 시작하는 데 도움이 필요한 경우 첫 번째 파이프라인 만들기를 참조하세요.
- 리포지토리를 만들 수 있는 GitHub 계정. Microsoft 계정이 없는 경우에는 무료로 만들 수 있습니다.
샘플 애플리케이션 리포지토리 설정
이 자습서를 시작하려면 먼저 샘플 Node.js 웹 애플리케이션을 설정해야 합니다. 샘플 애플리케이션에는 Azure에 애플리케이션을 배포하고 부하 테스트를 트리거하는 Azure Pipelines 정의가 포함되어 있습니다.
브라우저를 열고 샘플 애플리케이션의 원본 GitHub 리포지토리로 이동합니다.
샘플 애플리케이션은 Azure App Service 웹 구성 요소와 Azure Cosmos DB 데이터베이스로 구성된 Node.js 앱입니다.
포크를 선택하여 샘플 애플리케이션의 리포지토리를 GitHub 계정에 포크합니다.
샘플 애플리케이션의 리포지토리에는 SampleApp.jmx라는 Apache JMeter 스크립트가 포함되어 있습니다. 스크립트는 샘플 애플리케이션에서 세 가지 API를 테스트합니다.
add
: Azure Cosmos DB에 삽입을 수행하여 웹앱 방문자 수를 저장합니다.get
: Azure Cosmos DB에서 읽기 작업을 수행하여 방문자 수를 검색합니다.lasttimestamp
: 마지막 사용자 방문의 메모리 내 타임스탬프를 업데이트.
서비스 인증 구성
부하 테스트를 실행하도록 CI/CD 파이프라인을 구성하기 전에 CI/CD 워크플로에 Azure 부하 테스트 리소스에 액세스할 수 있는 권한을 부여합니다.
Azure Pipelines 워크플로에서 Azure Load Testing 리소스에 액세스하려면 먼저 Azure DevOps 프로젝트에서 서비스 연결을 만듭니다. 서비스 연결은 Azure Active Directory 서비스 주체를 만듭니다. 이 서비스 주체는 Azure Active Directory의 Azure Pipelines 워크플로를 나타냅니다.
다음으로, 이 서비스 주체에게 Azure Load Testing 리소스를 사용하여 부하 테스트를 만들고 실행할 수 있는 권한을 부여합니다.
Azure Pipelines에서 서비스 연결 만들기
CI/CD 워크플로가 Azure 구독에 액세스할 수 있도록 Azure Pipelines에서 서비스 연결을 만듭니다. 다음 단계에서는 부하 테스트를 만들고 실행할 수 있는 권한을 부여합니다.
Azure DevOps 조직()
https://dev.azure.com/<your-organization>
에 로그인하고 프로젝트를 선택합니다.프로젝트 설정>서비스 연결을 선택합니다.
+ 새 서비스 연결을 선택하고 Azure Resource Manager 서비스 연결을 선택한 다음, 다음을 선택합니다.
서비스 주체(자동) 인증 방법을 선택한 다음, 다음을 선택합니다.
서비스 연결 정보를 입력한 다음 저장 을 선택하여 서비스 연결을 만듭니다.
필드 값 범위 수준 구독. 구독 부하 테스트 리소스를 호스트할 Azure 구독을 선택합니다. 리소스 그룹 비워 둡니다. 파이프라인은 Azure Load Testing 리소스에 대한 새 리소스 그룹을 만듭니다. 서비스 연결 이름 서비스 연결의 고유한 이름을 입력합니다. 나중에 이 이름을 사용하여 파이프라인 정의를 구성합니다. 모든 파이프라인에 액세스 권한 부여 선택됨. 목록에서 만든 서비스 연결을 선택한 다음 서비스 주체 관리를 선택합니다.
Azure Portal 애플리케이션(클라이언트) ID 값을 복사합니다.
Azure Cloud Shell 시작
Azure Cloud Shell은 이 항목의 단계를 실행하는 데 무료로 사용할 수 있는 대화형 셸입니다. 공용 Azure 도구가 사전 설치되어 계정에서 사용하도록 구성되어 있습니다.
Cloud Shell을 열려면 코드 블록의 오른쪽 위 모서리에 있는 사용해 보세요를 선택하기만 하면 됩니다. 또한 https://shell.azure.com 로 이동하여 별도의 브라우저 탭에서 Cloud Shell을 시작할 수 있습니다.
Cloud Shell이 열리면 환경에 대해 Bash가 선택되어 있는지 확인합니다. 후속 세션은 Bash 환경에서 Azure CLI를 사용합니다. 복사를 선택하여 코드 블록을 복사하고 Cloud Shell에 붙여넣고 Enter 키를 눌러 실행합니다.
Azure에 로그인
Cloud Shell은 로그인한 초기 계정에서 자동으로 인증됩니다. 다음 스크립트를 통해 다른 구독을 사용하여 로그인하고 <Subscription ID>
를 Azure 구독 ID로 바꿉니다. Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.
subscription="<subscriptionId>" # add subscription here
az account set -s $subscription # ...or use 'az login'
자세한 내용은 활성 구독 설정 또는 대화형으로 로그인을 참조하세요.
Azure Load Testing에 대한 액세스 권한 부여
Azure Load Testing 리소스에 대한 액세스 권한을 부여하려면 부하 테스트 기여자 역할을 서비스 주체에 할당합니다. 이 역할은 서비스 주체에게 Azure Load Testing 서비스를 사용하여 부하 테스트를 만들고 실행할 수 있는 액세스 권한을 부여합니다. Azure Load Testing에서 사용자 및 역할 관리에 대해 자세히 알아봅니다.
Azure CLI를 사용하여 서비스 주체 개체의 ID를 검색합니다. 텍스트 자리 표시자를
<application-client-id>
복사한 값으로 바꿉니다.object_id=$(az ad sp show --id "<application-client-id>" --query "id" -o tsv) echo $object_id
Load Test Contributor
서비스 주체에 역할을 할당합니다.subscription=$(az account show --query "id" -o tsv) echo $subscription az role assignment create --assignee $object_id \ --role "Load Test Contributor" \ --scope /subscriptions/$subscription \ --subscription $subscription
부하 테스트를 실행하도록 CI/CD 워크플로 구성
이제 샘플 애플리케이션에 대한 부하 테스트를 만들고 실행하는 CI/CD 워크플로를 만듭니다. 샘플 애플리케이션 리포지토리에는 Azure에 애플리케이션을 먼저 배포한 다음 JMeter 테스트 스크립트(SampleApp.jmx)를 기반으로 부하 테스트를 만드는 CI/CD 워크플로 정의가 이미 포함되어 있습니다. 샘플 워크플로 정의 파일을 업데이트하여 Azure 구독 및 애플리케이션 세부 정보를 지정합니다.
첫 번째 CI/CD 워크플로 실행에서는 ARMTemplate/template.json ARM(Azure Resource Manager) 템플릿을 사용하여 Azure 구독에 새 Azure Load Testing 리소스를 만듭니다. ARM 템플릿에 대해 알아봅니다.
샘플 애플리케이션 리포지토리의 포크에 연결된 새 Azure 파이프라인을 만듭니다. 이 리포지토리에는 다음 항목이 포함됩니다.
- 샘플 애플리케이션 소스 코드입니다.
- azure-pipelines.yml 파이프라인 정의 파일입니다.
- SampleApp.jmx JMeter 테스트 스크립트입니다.
- SampleApp.yaml Azure Load Testing 구성 파일입니다.
부하 테스트를 만들고 실행하기 위해 Azure Pipelines 정의는 Azure DevOps Marketplace의 Azure Load Testing 작업 확장을 사용합니다.
Azure DevOps Marketplace에서 Azure Load Testing 작업 확장을 열고 무료 가져오기를 선택합니다.
Azure DevOps 조직을 선택한 다음 설치 를 선택하여 확장을 설치합니다.
선택한 Azure DevOps 조직에 대한 관리자 권한이 없는 경우 요청을 선택하여 관리자에게 확장 설치를 요청합니다.
Azure DevOps 프로젝트의 왼쪽 탐색 영역에서 파이프라인을 선택한 다음, 파이프라인 만들기를 선택합니다.
Connect 탭에서 GitHub를 선택합니다.
Azure Pipelines 권한 부여를 선택하여 Azure Pipelines가 워크플로를 트리거하기 위해 GitHub 계정에 액세스할 수 있도록 허용합니다.
선택 탭에서 샘플 애플리케이션의 포크된 리포지토리를 선택합니다.
Azure Pipelines는 azure-pipelines.yml 파이프라인 정의 파일을 자동으로 검색합니다.
파이프라인 정의에는 두 개의 태스크가
LoadTest
있는 단계가 포함되어 있습니다.작업은
AzureResourceManagerTemplateDeployment
Azure 구독에 새 Azure 부하 테스트 리소스를 배포합니다.다음으로, Azure Load Testing 태스크는
AzureLoadTest
부하 테스트를 만들고 시작합니다. 이 태스크는 부하 테스트에 대한 구성 매개 변수(예: 병렬 테스트 엔진 수)를 포함하는 부하 테스트 구성 파일을 사용합니다SampleApp.yaml
.- task: AzureLoadTest@1 inputs: azureSubscription: $(serviceConnection) loadTestConfigFile: 'SampleApp.yaml' resourceGroup: $(loadTestResourceGroup) loadTestResource: $(loadTestResource) env: | [ { "name": "webapp", "value": "$(webAppName).azurewebsites.net" } ]
부하 테스트가
AzureLoadTest
이미 있는 경우 작업은 새 부하 테스트를 만들지 않지만 이 부하 테스트에 테스트 실행을 추가합니다. 시간이 지남에 따라 회귀를 식별하려면 여러 테스트 실행을 비교할 수 있습니다.검토 탭에서 파이프라인 정의의 시작 부분에 있는 다음 자리 표시자 텍스트를 바꿉 있습니다.
이러한 변수는 샘플 애플리케이션의 배포를 구성하고 부하 테스트를 만드는 데 사용됩니다.
자리 표시자 값 <Name of your webapp>
Azure App Service 웹앱의 이름입니다. <Name of your webARM Service connection>
이전 섹션에서 만든 서비스 연결의 이름입니다. <Azure subscriptionId>
Azure 구독 ID. <Name of your load test resource>
Azure Load Testing 리소스의 이름입니다. <Name of your load test resource group>
Azure Load Testing 리소스가 포함된 리소스 그룹의 이름입니다. 저장 및 실행을 선택하고 메시지 커밋에 텍스트를 입력한 다음 저장 및 실행을 선택합니다.
이제 Azure Pipelines는 CI/CD 워크플로를 실행하고 샘플 애플리케이션을 배포하고 부하 테스트를 만듭니다.
왼쪽 탐색 영역에서 파이프라인 을 선택한 다음, 목록에서 새 파이프라인 실행을 선택하여 상태를 모니터링합니다.
파이프라인 작업을 선택하여 자세한 실행 로그를 볼 수 있습니다.
부하 테스트 결과 보기
Azure Load Testing을 사용하면 CI/CD 워크플로 출력에서 직접 부하 테스트 실행 결과를 볼 수 있습니다. CI/CD 로그에는 다음과 같은 클라이언트 쪽 메트릭이 포함됩니다.
- 응답 시간 메트릭: 평균, 최소, 중앙값, 최대 및 90-95-99 백분위수입니다.
- 초당 요청 수
- 총 요청 수입니다.
- 총 오류 수입니다.
- 오류율입니다.
또한 부하 테스트 결과 파일 은 추가 보고를 위해 다운로드할 수 있는 워크플로 실행 아티팩트로 사용할 수 있습니다.
Azure DevOps 프로젝트에서 파이프라인을 선택한 다음 목록에서 파이프라인 정의를 선택합니다.
파이프라인 실행을 선택하여 실행 요약을 봅니다.
작업 섹션에서 부하 테스트를 선택하여 파이프라인 로그를 봅니다.
부하 테스트가 완료되면 파이프라인 로그에서 테스트 요약 정보 및 클라이언트 쪽 메트릭을 볼 수 있습니다. 로그에는 이 부하 테스트에 대한 Azure Load Testing 대시보드로 이동하는 URL도 표시됩니다.
파이프라인 로그 뷰에서 부하 테스트를 선택한 다음 , 생성된 아티팩트 1 을 선택하여 부하 테스트에 대한 결과 파일을 다운로드합니다.
테스트 실패 조건 정의
Azure Load Testing을 사용하면 부하 테스트 실패 조건을 정의할 수 있습니다. 이러한 조건은 부하 테스트가 통과하거나 실패해야 하는 시기를 결정합니다. 예를 들어 평균 응답 시간이 특정 값보다 크거나 오류가 너무 많은 경우 부하 테스트가 실패해야 합니다.
CI/CD 파이프라인의 일부로 부하 테스트를 실행하는 경우 파이프라인 실행 상태는 부하 테스트의 상태를 반영합니다. 이 방법을 사용하면 애플리케이션에 높은 부하가 발생할 때 성능 회귀 또는 저하된 애플리케이션 동작을 신속하게 식별할 수 있습니다.
이 섹션에서는 평균 응답 시간 및 오류율에 따라 테스트 실패 조건을 구성합니다.
테스트 구성 YAML 파일에서 Azure Load Testing에 대한 부하 테스트 실패 조건을 지정할 수 있습니다. 부하 테스트 실패 조건 구성에 대해 자세히 알아봅니다.
샘플 애플리케이션 GitHub 리포지토리의 포크에서 SampleApp.yml 파일을 편집합니다.
파일 끝에 다음 코드 조각을 추가합니다.
failureCriteria: - avg(response_time_ms) > 100 - percentage(error) > 20
이제 평균 응답 시간 및 오류 속도에 따라 부하 테스트에 대한 실패 조건을 지정했습니다. 다음 조건 중 하나 이상이 충족되면 테스트가 실패합니다.
- 집계 평균 응답 시간이 100ms를 초과합니다.
- 오류의 집계 백분율이 20%를 초과합니다.
변경 내용을 커밋하고 리포지토리의 주 분기에 푸시합니다.
변경 내용이 CI/CD 워크플로를 트리거합니다.
테스트가 완료되면 CI/CD 파이프라인 실행이 실패했습니다.
CI/CD 출력 로그에서 실패 조건 중 하나가 충족되었기 때문에 테스트가 실패했음을 알 수 있습니다. 부하 테스트 평균 응답 시간이 실패 조건에 지정한 값보다 높았습니다.
Azure Load Testing 서비스는 테스트 실행 중에 조건을 평가합니다. 이러한 조건이 실패하면 Azure Load Testing 서비스는 0이 아닌 종료 코드를 반환합니다. 이 코드는 CI/CD 워크플로에 테스트가 실패했음을 알릴 수 있습니다.
SampleApp.yml 파일을 편집하고 테스트의 실패 조건을 변경하여 평균 응답 시간의 기준을 늘립니다.
failureCriteria: - avg(response_time_ms) > 5000 - percentage(error) > 20
변경 내용을 커밋하여 CI/CD 워크플로를 다시 트리거합니다.
테스트가 완료되면 부하 테스트 및 CI/CD 워크플로 실행이 성공적으로 완료된 것을 알 수 있습니다.
리소스 정리
중요
다른 Azure Load Testing 자습서 및 방법 문서에 대해 만든 Azure Load Testing 리소스를 다시 사용할 수 있습니다.
만든 리소스를 사용하지 않으려면 추가 요금이 발생하지 않도록 삭제합니다. 다른 리소스 그룹에 샘플 애플리케이션을 배포한 경우 다음 단계를 반복할 수 있습니다.
Azure Portal 사용하여 리소스를 삭제하려면 다음을 수행합니다.
왼쪽 위 모서리에서 메뉴 단추를 선택한 다음 , 리소스 그룹을 선택합니다.
목록에서 만든 리소스 그룹을 선택합니다.
리소스 그룹 삭제를 선택합니다.
리소스 그룹 이름을 입력합니다. 그런 다음, 삭제를 선택합니다.
Azure CLI를 사용하여 리소스를 삭제하려면 다음 명령을 입력합니다.
az group delete --name <yourresourcegroup>
리소스 그룹을 삭제하면 리소스 그룹 내의 모든 리소스가 삭제됩니다.
다음 단계
이제 Azure Load Testing을 사용하여 부하 테스트 실행을 자동화하는 CI/CD 워크플로를 만들었습니다. 부하 테스트 실패 조건을 사용하여 CI/CD 워크플로의 상태를 설정하고 성능 및 애플리케이션 동작 저하를 신속하게 식별할 수 있습니다.
- 서버 쪽 모니터링 구성에 대해 자세히 알아봅니다.
- 여러 테스트 실행에서 결과를 비교하는 방법에 대해 자세히 알아봅니다.
- 부하 테스트 매개 변수화에 대해 자세히 알아봅니다.
- 테스트 실패 조건 정의에 대해 자세히 알아봅니다.