데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      [K6 성능테스트 도구 - 03] K6 Options과 K6 구조 이해하기

      KIDO 22.11.14
      5,476 6 0

      Options 사용하기

      • k6는 옵션을 이용하여 테스트를 위한 시나리오, 워크로드, 테스트 시간등을 지정할 수 있다.

      • k6는 다양한 방법으로 옵션을 지정하는 방법을 제공하고 있다.

        • CLI 플래그로 지정

        • 환경변수로 지정

        • 스크립트에서 options 객체 이용하기

      • 테스트 케이스에 따라서 어떤 옵션을 이용할지 지정할 수 있다.

      • 테스트 중 옵션에 엑세스도 가능하다.


      옵션 이용 순서

      • 중복 옵션이 들어온경우 아래 순서대로 우선순위에 따라 적용된다.

      1. 기본 옵션이용됨

      2. --config 로 지정한 플래그로 옵션 사용

      3. script에서 옵션 값 지정

      4. 환경변수 이용

      5. CLI 플래그 이용

      • 위와 같이 1 --> 5번의 순으로 옵션을 검사하여 사용한다.

      • 5가 가장 우선순위가 높다.


      옵션을 어디에 설정할까?

      • 옵션은 개인 선호에 따른 위치에서 사용된다.

      • 어떤때는 테스트 컨텍스트에 따라 옵션을 배치할 가장 합리적인 위치가 결정된다.

      버젼을 제어하고 테스트를 깔끔하기 유지하기 위한 스크립트 옵션

      • 스크립트 옵션 개체는 일반적으로 옵션을 넣는 가장 좋은 위치이다.

      • 자동으로 버젼 제어를 제공하고 쉽게 재사용이 가능하며, 스크립트를 모듈화 할 수 있다.

      사용할 때 즉시 옵션을 플래그로 지정

      • 커맨드 라인으로 실행하려는 경우 명령줄 플래그를 이용하면 된다.

      • 커맨드 라인을 이용하면, 파일내 지정한 옵션을 오버라이드 할 수 있다. (우선순위 참고)

      환경변수 옵션 설정, 빌드 체인으로 부터 옵션 설정시


      옵션 예제

      import http from 'k6/http';
      
      export const options = {
        hosts: { 'test.k6.io': '1.2.3.4' },
        stages: [
          { duration: '1m', target: 10 },
          { duration: '1m', target: 20 },
          { duration: '1m', target: 0 },
        ],
        thresholds: { http_req_duration: ['avg<100', 'p(95)<200'] },
        noConnectionReuse: true,
        userAgent: 'MyK6UserAgentString/1.0',
      };
      
      export default function () {
        http.get('http://test.k6.io/');
      }
      • 위 옵션은 hosts, stages, thresholds, noConnectionReuse, userAgent 와 같은 옵션을 지정하였다.

      • hosts:

        • DNS를 확인할때 해당 옵션으로 재정의할 수 있다.

        • "domain" : "ip:port" 형태로 호스트를 지정할 수 있다.

      • stages:

        • stages 는 테스트 부하가 주입되는 단계를 설정할 수 있다.

        • 일반적으로 테스트는 RampUp --> Load --> RampBackDown 의 순서로 수행이 된다.

        • 위 예제에서는 RampUp으로 10유저를 1분간 생성한다. 그리고 Load는 20 유저를 1분간 수행하고, 마지막으로 RampBackDown으로 사용자를 1분동안 0으로 만든다.

      • threshold:

        • 테스트 종료 조건을 지정하고, 해당 종료조건을 넘어서게 되면 테스트를 종료하게 된다.

      • noConnectionReuse:

        • keepalive를 유지할지 여부를 결정한다.

        • 기본값은 false이며, true인경우 커넥션을 재사용하지 않으므로 keepalive를 유지하게 된다.

      • userAgent:

        • http 요청을 보낼때 사용자 agent 정보를 지정한다.

        • 이렇게 지정하고 테스트를 수행하면 워크로드 요청시 agent를 실어서 전송하게 된다.


      환경 변수에 옵션 설정

      • 환경 변수를 지정하고, 이를 테스트 옵션으로 활용하여 테스트를 수행할 수 있다.

      K6_NO_CONNECTION_REUSE=true K6_USER_AGENT="MyK6UserAgentString/1.0" k6 run script.js
      
      k6 run --no-connection-reuse --user-agent "MyK6UserAgentString/1.0" script.js


      K6 환경변수 이용

      • '--env' 옵션 커맨드를 이용하면 환경변수 값으로 원하는 값을 k6에 전달할 수 있다.

      k6 run script.js --env MY_USER_AGENT="hello"
      import http from 'k6/http';
      
      export const options = {
        userAgent: __ENV.MY_USER_AGENT,
      };
      
      export default function () {
        http.get('http://test.k6.io/');
      }
      • 위와 같이 외부에서 주입된 환경 변수는 __ENV.MY_USER_AGENT 에대입된다.

      • 환경 변수는 __ENV. 으로 접근이 가능하다.


      스크립트에서 옵션값 획득하기

      • 옵션값을 지정한 경우, 실제 실행되는 함수에서 해당 옵션을 이용할 수 있다.

      import exec from 'k6/execution';
      
      export const options = {
        stages: [
          { duration: '5s', target: 100 },
          { duration: '5s', target: 50 },
        ],
      };
      
      export default function () {
        console.log(exec.test.options.scenarios.default.stages[0].target); // 100
      }
      • 위 코드는 exec.test.options 로 옵션의 최 상단에 접근한다.

      • 이후 scenarios 를 이용하면 현재 시나리오에 접근이 가능하다. 모든 테스트는 시나리오가 있다.

      • default 시나리오에 접근하였다. 시나리오 이름이 없다면 default가 기본 이름이다.

      • stages 중 인덱스를 이용하여 접근한다. 여기서는 0번 스테이지에 접근하였다.

      • stages[0].targets 를 통해서 대상 vuser를 조회하였다. 값은 100이 출력될 것이다.


      config 옵션 파일 이용하기

      • config 옵션을 이용하여 옵션 파일을 테스트에 주입할 수 있다.

      • 옵션 파일은 json 형태로 작성이 가능하며, 해당 파일을 --config 라는 옵션을 이용하여 k6에 전달하고 있다.

      k6 run --config options.json script.js
      • options.json 파일을 다음과 같이 작성한다.

      {
        "hosts": {
          "test.k6.io": "1.2.3.4"
        },
        "stages": [
          {
            "duration": "1m",
            "target": 10
          },
          {
            "duration": "1m",
            "target": 30
          },
          {
            "duration": "1m",
            "target": 0
          }
        ],
        "thresholds": {
          "http_req_duration": ["avg<100", "p(95)<200"]
        },
        "noConnectionReuse": true,
        "userAgent": "MyK6UserAgentString/1.0"
      }
      • 다른 방법은 옵션 파일을 소스에서 불러오는 방법이 있다.

      //  내보낸 옵션 개체를 채우는 데 사용되는 부하 테스트 구성
      const testConfig = JSON.parse(open('./config/test.json'));
      // 위 옵션에서 전달된 옵션 정보를 세팅한다. 
      export const options = testConfig;

      from: https://k6.io/docs/using-k6/k6-options/how-to/

      Test life cycle

      • k6는 여러개의 단계로 실행이 된다.

      • 스테이지는 항상 동일한 순서로 실행된다.

      • init 는 스크립트를 초기화 한다. 파일로드, 모듈 임포트, 함수 정의등

      • (선택사항) setup코드는 환경을 준비하고, 데이터를 생성한다.

      • VU코드는 default 함수에서 수행된다. 실제로 테스트 요청을 보내는 코드가 작성된다. 옵션에 정의한 만큼 반복 동작한다.

      • (선택사항) teardown 함수는 테스트의 환경을 정리하고, 자원을 릴리즈한다.

      // 1. init code
      
      export function setup() {
        // 2. setup code
      }
      
      export default function (data) {
        // 3. VU code
      }
      
      export function teardown(data) {
        // 4. teardown code
      }

      init context

      • k6는 테스트를 수행하기 위해서 init함수에서 테스트 환경을 정의하며 다음과 같은 일을 수행한다.

        • 모듈 임포트

        • 로컬 파일 시스템에서 파일 로드

        • 모든 옵션에 대한 설정 테스트

        • 함수 정의 (default에서 수행 혹은 setup, teardown에서 수행)

      • init 은 필수 영역이다.

      // init context: 모듈을 import 한다.
      import http from 'k6/http';
      import { Trend } from 'k6/metrics';
      
      // init context: k6 옵션을 정의한다. 
      export const options = {
        vus: 10,
        duration: '30s',
      };
      
      // init context: 글로벌 변수를 생성한다.
      const customTrend = new Trend('oneCustomMetric');
      
      // init context: 커스텀 함수를 수행한다. 
      function myCustomFunction() {
        // ...
      }


      VU stage

      • VU스테이지는 필수이다.

      • default 함수에서 실제 테스트를 수행한다.

      • 혹은 옵션에서 특정 시나리오가 정의한 함수를 수행할 수 있다.

      export default function () {
        // do things here...
      }
      • VU코드는 테스트가 수행되는 기간동안 지속적으로 반복 수행된다.

      • VU코드는 테스트를 위한 http코드를 생성하고, 메트릭의 생성, 테스트를 위한 모든 작업을 수행한다.

      • job 함수를 제외하고 모든 작업이 수행되며, job은 init함수에서 수행된다.

        • VU코드는 로컬 파일을 읽을 수 없다.

        • VU코드는 어떠한 모듈도 로드할 수 없다.


      Setup and teardown stages

      • default와 마찬가지로 setup과 teardown은 반드시 export 로 정의해야한다.

      • default와는 다르게 setup, teardown은 오직 한번씩만 수행된다.

        • setup은 init 다음에 수행되며 오직 한번만 수행된다.

        • teardown은 테스트 끝날때 한번만 수행되며 VU 코드가 종료되고 난뒤 바로 수행된다.

      import http from 'k6/http';
      
      export const options = {
        vus: 10,
        duration: '30s',
      };
      
      export function setup() {
        const res = http.get('https://httpbin.test.k6.io/get');
        console.log("Setup: 01 :");
        return { data: res.json() };
      }
      
      export function teardown(data) {
        console.log("Function teardown : " + JSON.stringify(data));
      }
      
      export default function (data) {
        console.log("Function default : " + JSON.stringify(data));
      }

      setup, teardown 스킵하기

      • 옵션을 이용하여 함수를 스킵할 수 있다.

      k6 run --no-setup --no-teardown ...
      • '--no-setup' 옵션을 이용하여 셋업을 스킵한다.

      • '--no-teardown' 옵션을 이용하여 teardown 을 스킵한다.

      데이터 전달하기

      • setup에서 정의한 데이터를 default function과 teardown 으로 전달할 수 있다.

      // 1. init code
      
      export function setup() {
        // 2. setup code
      }
      
      export default function (data) {
        // 3. VU code
      }
      
      export function teardown(data) {
        // 4. teardown code
      }
      • 위와 같이 데이터를 전달할 수 있다.

      export function setup() {
        return { v: 1 };
      }
      
      export default function (data) {
        console.log(JSON.stringify(data));
      }
      
      export function teardown(data) {
        if (data.v != 1) {
          throw new Error('incorrect data: ' + JSON.stringify(data));
        }
      }
      • 위와 같은 방법으로 데이터를 전달한다.

      • setup에서 데이터를 return을 하게 되면 이 return 된 객체가 전달이 되는 방식이다.

      • 이후 defult, teardown에서 data를 파라미터로 전달 받을 수 있다.

        • 데이터는 오직 json 데이터만 전달가능하며, 함수는 전달불가이다.

        • 데이터가 너무 크면 더 많은 메모리가 사용된다.

        • default() 에서 데이터를 변경할 수 없다.

      from: https://k6.io/docs/using-k6/test-life-cycle/



      WrapUp

      - 지금까지 K6의 옵션의 이용법을 알아 보았다. 옵션은 로드를 생성하고 성능테스트를 위한 설정 정보를 지정하는 곳이다.

      - 또한 K6 가 수행되는 구조를 이해할 수 있었고, Init --> Setup --> VU --> Teardown 으로 수행됨을 이해할 수 있었다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      KIDO 님의 최신 블로그

      더보기
      동영상 기고하기