k6을 사용한 성능 테스트 - 01 - 시작하기

3680 단어
웹사이트/웹앱/블로그가 하룻밤 사이에 인기를 얻고(Elon Musk가 웹앱에 대해 트윗한다고 상상해 보세요) 방문자/사용자 수가 엄청나게 급증했다고 가정해 보겠습니다.
웹 앱에 액세스합니다. 이렇게 급증하는 트래픽은 웹 서버를 압도하여 의도하지 않은 분산 서비스 거부(DDOS) 공격을 유발할 수 있습니다. 사람들이 웹 앱에 액세스할 수 없는 악몽 같은 시나리오입니다.

이제 백엔드 인프라가 처리할 수 있는 사용자 수를 어떻게 결정합니까?

이를 비롯한 성능 관련 질문에 답하기 위해 사용할 수 있는 몇 가지 훌륭한 성능 테스트 도구가 있습니다. 그 중 하나는 k6

k6란?



k6은 Go 프로그래밍 언어로 작성된 무료 오픈 소스 부하 테스트 도구입니다. 그러나 k6을 사용하여 테스트를 작성하기 위해 알 필요는 없습니다Go.
ES2015/ES6의 기본 사항에 익숙하다면 k6 테스트를 작성하는 데 어려움이 없을 것입니다.

설치



로컬 시스템에 k6을 설치하려면 여기에 제공된 지침을 따르십시오https://k6.io/docs/getting-started/installation/.

나는 우분투18.04를 사용하고 있지만 다른 운영 체제를 사용하는 경우에도 따라할 수 있습니다.

첫 번째 테스트:



k6은 virtual users(VUs)의 개념을 기반으로 실시간 트래픽을 시뮬레이션한 다음 스크립트를 병렬로 실행합니다.

일반적으로 Scenarios 을(를) 사용하지 않는 한 각 k6 스크립트에는 적어도 내보낸default 함수가 포함되어야 합니다.
default 함수는 Java 및 기타 프로그래밍 언어의 main() 함수와 유사한 VU의 진입점입니다.

테스트 웹사이트에 GET 요청을 하는 간단한 k6 스크립트를 작성해 보겠습니다.
Disclaimer: Make sure load testing is allowed by your web host so that you don't violate their terms of service. In our example, we will be testing a test website https://test.loadimpact.com/
파일test.js을 만들고 다음 콘텐츠를 추가합니다.

import { check } from "k6";
import http from "k6/http";

export default function() {
  let response = http.get("https://test.loadimpact.com/");
  check(response, {
    "is status 200": (r) => r.status === 200
  });
};


다른 많은 JavaScript 런타임과 달리 k6의 대부분의 작업은 동기식입니다. 즉, 콜백과 약속을 사용할 필요가 없습니다.
예를 들어;

http.get(...).then(res =>....)


또는

let response = await http.get(....)


필요하지 않으며 예제의 test.js에 언급된 동기 코드를 사용할 수 있습니다.

테스트 실행



그런 다음 다음 명령을 사용하여 k6 스크립트를 실행합니다.

k6 run test.js


기본적으로 아무 것도 지정되지 않은 경우(위의 명령에서와 같이) k6은 1 VU와 1 반복에 대해서만 스크립트를 실행합니다. 디버깅에는 유용하지만 부하 테스트는 아닙니다.

여기서 가상 사용자는 get 요청을 https://test.loadimpact.com/에 보내고 응답 상태 코드를 확인합니다.

이제 10명 이상의 가상 사용자와 5초 동안 k6 테스트를 실행합니다.

 k6 run --vus 10 --duration 5s test.js




위의 스크린샷에서:
  • checks = 100% : 모든 테스트 실행 통과
  • vus = 10 : 가상 사용자 10명(run 명령에 제공된 대로)
  • iterations = 126 : 테스트가 실행된 총 반복 횟수입니다. 반복을 직접 지정하지 않았기 때문에 실행마다 다를 수 있습니다
  • .

    이제 --vus ... --durations .... --iterations....를 수행하는 대신 export 개체를 사용하여 원하는 옵션을 설정할 수도 있습니다. 예를 들어:

    export let options = {
        vus: 10,
        duration: 5s
    };
    export default function() { .... }
    


    무엇 향후 계획?



    그 모든 것이 좋고 쉬웠지만 그다지 현실적이지는 않았습니다. 웹 프런트엔드를 테스트하든 API를 테스트하든 상관없습니다. GET 요청을 보내는 것만으로는 사용자의 동작을 시뮬레이션할 수 없습니다. 이 시리즈의 다음 부분에서는 k6에 대해 보다 현실적인 방법으로 자세히 알아봅니다.

    좋은 웹페이지 즐겨찾기