技術(tech)

k6 – 環境変数を扱うにはxk6-dotenvがオススメなので使い方を紹介

開発を進めていると管理しなければならない環境変数が多くなってきます。
k6でも同じ話が起きがちなのです。
本記事では環境変数の管理をする上でk6の拡張機能のxk6-dotenvが便利なので、これを紹介します。

xk6-dotenv: https://github.com/szkiba/xk6-dotenv

前提

xk6のinstallを未実施の方は、まずはこちらの環境構築から始めましょう。
goの環境がない方は、別途環境構築をお願いいたします。

go install go.k6.io/xk6/cmd/xk6@latest

xk6-dotenvのinstall

以下のコマンドで、k6コマンドをビルドしましょう。
TypeScriptで開発している関係上、xk6-tsもinstallしています。

xk6 build \
--with github.com/szkiba/xk6-ts@latest \
--with github.com/szkiba/xk6-dotenv@latest

使い方

プロジェクトのルートディレクトリに.envファイルを準備します。

AMOUNT_OF_INDEX_SIZE_FOR_TEST_DATA=10000
DEBUG=true
ENV=local
SAMPLE_PRODUCT_ENDPOINT=localhost:3000
REDIS_ENDPOINT=redis://localhost:6379

ref: https://github.com/gonkunkun/k6-template/blob/main/.env.sample

__ENVを利用して、好きな場所から環境変数を読み込みましょう。

import { toBoolean } from './common'

export const DEBUG =toBoolean(__ENV.DEBUG) || false
export const ENV = __ENV.ENV || 'local'
export const CONFIG_PATH = __ENV.CONFIG_PATH || '../src/sample-product/configs/smoke.json'
export const REDIS_ENDPOINT = __ENV.REDIS_ENDPOINT || 'redis://localhost:6379'
export const AMOUNT_OF_INDEX_SIZE_FOR_TEST_DATA = __ENV.AMOUNT_OF_INDEX_SIZE_FOR_TEST_DATA || 10000
export const SAMPLE_PRODUCT_ENDPOINT = __ENV.SAMPLE_PRODUCT_ENDPOINT || 'localhost'

ref: https://github.com/gonkunkun/k6-template/blob/main/src/sample-product/common/env.ts

以上です!

k6実行時に、.envファイルの中身を読み込んで、環境変数に自動的に突っ込んでくれます。

余談

こんなに利用しやすくなったのはつい最近のことです。
2024/04/02にアップデートがありました。
https://github.com/szkiba/xk6-dotenv/releases/tag/v0.2.0

それまでは、以下の要領でファイルを読み込む処理を噛ませる必要がありました。

const _ENV = parse(open("../.env"))

アプデにより、この処理入れなくても、自動的に環境変数としてロードしてくれるようになりましたあ。

以前のバージョンの拡張機能を利用されている方は、以下のようなエラーが出ると思います。

~/D/g/template-of-k6 ❯❯❯ npm run smoke:sample-product                   ✘ 130 main

> typescript@1.0.0 smoke:sample-product /Users/Documents/github/template-of-k6
> XK6_TS=false ./k6 run ./dist/loadTest.js -e CONFIG_PATH=./src/sample-product/configs/smoke.json

          /\      |‾‾| /‾‾/   /‾‾/   
     /\  /  \     |  |/  /   /  /    
    /  \/    \    |     (   /   ‾‾\  
   /          \   |  |\  \ |  (‾)  | 
  / __________ \  |__| \__\ \_____/ .io

ERRO[0000] GoError: unknown module: k6/x/dotenv
        at go.k6.io/k6/js.(*requireImpl).require-fm (native)
        at 139 (webpack://typescript/external%20commonjs%20%22k6/x/dotenv%22:1:34(21))
        at __webpack_require__ (webpack://typescript/webpack/bootstrap:19:0(26))
        at 432 (file:///Users/Documents/github/template-of-k6/dist/loadTest.js:19:81(62))
        at __webpack_require__ (webpack://typescript/webpack/bootstrap:19:0(26))
        at webpack://webpack/runtime/make%20namespace%20object:7:0(29)
        at file:///Users/Documents/github/template-of-k6/dist/loadTest.js:629:3(49)
        at file:///Users/Documents/github/template-of-k6/dist/loadTest.js:634:12(3)  hint="script exception"
npm ERR! code ELIFECYCLE
npm ERR! errno 107
npm ERR! typescript@1.0.0 smoke:sample-product: `XK6_TS=false ./k6 run ./dist/loadTest.js -e CONFIG_PATH=./src/sample-product/configs/smoke.json`
npm ERR! Exit status 107
npm ERR! 
npm ERR! Failed at the typescript@1.0.0 smoke:sample-product script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

以下のようなPR例に従って修正しましょう。
PR: https://github.com/gonkunkun/k6-template/pull/5

短いですが以上です。
良いk6ライフを!