Grafana K6 は、パフォーマンス テスト用に設計されたオープンソース ツールです。 API、マイクロサービス、Web サイトを大規模にテストするのに最適で、開発者とテスターにシステムのパフォーマンスに関する洞察を提供します。このチートシートでは、Grafana K6 を使い始めるためにすべてのパフォーマンス エンジニアが知っておくべき重要な側面について説明します。
Grafana K6 は、パフォーマンス テストをシンプルかつスケーラブルにし、CI パイプラインに簡単に統合できる、開発者とテスター向けの最新の負荷テスト ツールです。
Homebrew または Docker 経由で Grafana K6 をインストールします:
brew install k6 # Or with Docker docker run -i grafana/k6 run - <script.js
パブリック REST API を使用して簡単なテストを実行する方法を次に示します。
import http from "k6/http"; import { check, sleep } from "k6"; // Define the API endpoint and expected response export default function () { const res = http.get("https://jsonplaceholder.typicode.com/posts/1"); // Define the expected response const expectedResponse = { userId: 1, id: 1, title: "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", body: "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto", }; // Assert the response is as expected check(res, { "status is 200": (r) => r.status === 200, "response is correct": (r) => JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse), }); sleep(1); }
テストを実行して結果を Web ダッシュボードに表示するには、次のコマンドを使用できます:
K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=html-report.html k6 run ./src/rest/jsonplaceholder-api-rest.js
これにより、レポート フォルダーに html-report.html という名前のレポートが生成されます。
ただし、次の URL にアクセスして、Web ダッシュボードで結果を確認することもできます。
http://127.0.0.1:5665/
URL にアクセスすると、Web ダッシュボードでテストの結果をリアルタイムで確認できます。
パブリック GraphQL API を使用した例。
GraphQL API が何かわからない場合は、次の URL にアクセスしてください: GraphQL とは?
使用する GraphQL API の詳細については、次の URL のドキュメントを参照してください: GraphQL Pokémon。
GraphQL API をテストする方法の詳細については、次の URL にアクセスしてください: GraphQL Testing。
これは、名前でポケモンを取得し、応答が成功したかどうかを確認する簡単なテストです。
import http from "k6/http"; import { check } from "k6"; // Define the query and variables const query = ` query getPokemon($name: String!) { pokemon(name: $name) { id name types } }`; const variables = { name: "pikachu", }; // Define the test function export default function () { const url = "https://graphql-pokemon2.vercel.app/"; const payload = JSON.stringify({ query: query, variables: variables, }); // Define the headers const headers = { "Content-Type": "application/json", }; // Make the request const res = http.post(url, payload, { headers: headers }); // Define the expected response const expectedResponse = { data: { pokemon: { id: "UG9rZW1vbjowMjU=", name: "Pikachu", types: ["Electric"], }, }, }; // Assert the response is as expected check(res, { "status is 200": (r) => r.status === 200, "response is correct": (r) => JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse), }); }
パフォーマンスのしきい値、仮想ユーザー (VU) の数、期間などのグローバル構成オプションを 1 か所で定義し、簡単に変更できます。
brew install k6 # Or with Docker docker run -i grafana/k6 run - <script.js
コードを再利用可能なモジュールに分割します。たとえば、定数とリクエストをテスト ロジックから分離します。
REST API の例では、API のベース URL を保存する constants.js ファイルと、API と対話する関数を保存する request-jsonplaceholder.js ファイルを作成できます。
import http from "k6/http"; import { check, sleep } from "k6"; // Define the API endpoint and expected response export default function () { const res = http.get("https://jsonplaceholder.typicode.com/posts/1"); // Define the expected response const expectedResponse = { userId: 1, id: 1, title: "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", body: "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto", }; // Assert the response is as expected check(res, { "status is 200": (r) => r.status === 200, "response is correct": (r) => JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse), }); sleep(1); }
これで、API と対話する関数を保存するための request-jsonplaceholder.js ファイルを作成できます。
K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=html-report.html k6 run ./src/rest/jsonplaceholder-api-rest.js
最後に、requests-jsonplaceholder.js ファイルで作成した関数を使用するためのテスト スクリプト jsonplaceholder-api-rest.js を作成できます。
http://127.0.0.1:5665/
私たちのスクリプト コードは非常に理解しやすくなり、URL やパラメータに何か変更があった場合、または新しいメソッドを追加する必要がある場合に、変更を加える必要がある場所が集中化され、ソリューションの拡張がより簡単になりました。時間が経つにつれて。
必要に応じて将来的により複雑なシナリオを作成するために再利用できるアトミック関数をさらに作成することで、スクリプトをさらに改善できます。テスト スクリプトが何を行うのかを理解するのがより簡単になりました。たとえば、投稿の存在をテストしたい場合は、投稿を取得して応答を返す関数を作成し、テスト スクリプト jsonplaceholder-api-rest.js.
でこの関数を使用できます。
import http from "k6/http"; import { check } from "k6"; // Define the query and variables const query = ` query getPokemon($name: String!) { pokemon(name: $name) { id name types } }`; const variables = { name: "pikachu", }; // Define the test function export default function () { const url = "https://graphql-pokemon2.vercel.app/"; const payload = JSON.stringify({ query: query, variables: variables, }); // Define the headers const headers = { "Content-Type": "application/json", }; // Make the request const res = http.post(url, payload, { headers: headers }); // Define the expected response const expectedResponse = { data: { pokemon: { id: "UG9rZW1vbjowMjU=", name: "Pikachu", types: ["Electric"], }, }, }; // Assert the response is as expected check(res, { "status is 200": (r) => r.status === 200, "response is correct": (r) => JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse), }); }
constants.js ファイルを変更して、GraphQL API のベース URL と使用する必要があるヘッダーを追加できます。
// ./src/config/options.js export const options = { stages: [ { duration: '1m', target: 100 }, // ramp up to 100 VUs { duration: '5m', target: 100 }, // stay at 100 VUs for 5 mins { duration: '1m', target: 0 }, // ramp down ], thresholds: { http_req_duration: ['p(95)<500'], // 95% of requests should complete in under 500ms }, };
これで、GraphQL API と対話する関数を保存するためのrequests-graphql-pokemon.js ファイルを作成できます。
// ./src/utils/constants.js export const BASE_URLS = { REST_API: 'https://jsonplaceholder.typicode.com', };
この時点で、requests-graphql-pokemon.js ファイルで作成した関数を使用するテスト スクリプトを作成できます。ポケモンのデータを取得し、応答が成功したかどうかを確認する簡単なテスト スクリプトを作成します。
// ./src/utils/requests-jsonplaceholder.js import { BASE_URLS } from './constants.js'; import http from 'k6/http'; export function getPosts() { return http.get(`${BASE_URLS.REST_API}/posts`); } export function getPost(id) { return http.get(`${BASE_URLS.REST_API}/posts/${id}`); } export function createPost(post) { return http.post(`${BASE_URLS.REST_API}/posts`, post); } export function updatePost(id, post) { return http.put(`${BASE_URLS.REST_API}/posts/${id}`, post); } export function deletePost(id) { return http.del(`${BASE_URLS.REST_API}/posts/${id}`); }
API レストの例と同じように、必要に応じて将来的により複雑なシナリオを作成するために再利用できるアトミック関数をさらに作成することでスクリプトを改善できます。テスト スクリプトの内容を理解することがより簡単になります。
応答とリクエストの結果を最適化し、パラメータ化するためのより良い方法がまだあります。何ができると思いますか?
動的データを使用して、より現実的なシナリオをシミュレートし、さまざまなデータセットをロードします。 K6 では、共有配列を使用してファイルからデータをロードできます。共有配列は、すべての VU がアクセスできるデータを保存する方法です。
users-config.js ファイルを作成して、JSON ファイル users.json からユーザー データをロードできます。
brew install k6 # Or with Docker docker run -i grafana/k6 run - <script.js
import http from "k6/http"; import { check, sleep } from "k6"; // Define the API endpoint and expected response export default function () { const res = http.get("https://jsonplaceholder.typicode.com/posts/1"); // Define the expected response const expectedResponse = { userId: 1, id: 1, title: "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", body: "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto", }; // Assert the response is as expected check(res, { "status is 200": (r) => r.status === 200, "response is correct": (r) => JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse), }); sleep(1); }
そして、それをテスト スクリプト jsonplaceholder-api-rest.js で使用できます。
K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=html-report.html k6 run ./src/rest/jsonplaceholder-api-rest.js
よく組織されたプロジェクト構造は、テストの維持と拡張に役立ちます。推奨されるフォルダー構造は次のとおりです:
http://127.0.0.1:5665/
この構造は、プロジェクトを整理し、スケーラブルに保ち、維持しやすくするのに役立ち、プロジェクト ルートが乱雑になるのを防ぎます。
もう 1 つのオプションは、テスト スクリプトを機能別にフォルダーにグループ化し、コンテキストにとって最も意味のあるものをテストして比較することです。たとえば、トランザクションを行うウォレットに関するプロジェクトの場合、トランザクションの種類 (入金、出金、送金など) ごとにフォルダーを作成し、各フォルダー内にその特定のトランザクションのテスト スクリプトを含めることができます。
import http from "k6/http"; import { check } from "k6"; // Define the query and variables const query = ` query getPokemon($name: String!) { pokemon(name: $name) { id name types } }`; const variables = { name: "pikachu", }; // Define the test function export default function () { const url = "https://graphql-pokemon2.vercel.app/"; const payload = JSON.stringify({ query: query, variables: variables, }); // Define the headers const headers = { "Content-Type": "application/json", }; // Make the request const res = http.post(url, payload, { headers: headers }); // Define the expected response const expectedResponse = { data: { pokemon: { id: "UG9rZW1vbjowMjU=", name: "Pikachu", types: ["Electric"], }, }, }; // Assert the response is as expected check(res, { "status is 200": (r) => r.status === 200, "response is correct": (r) => JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse), }); }
この 2 番目の例では、より複雑なデータ構造がありますが、最初の例で作成したのと同じリクエスト関数を再利用できます。
K6 を使用したパフォーマンス テストは、ボトルネックを特定し、アプリケーションのスケーラビリティを確保するために重要です。コードのモジュール化、構成の一元化、動的データの使用などのベスト プラクティスに従うことで、エンジニアは保守可能でスケーラブルなパフォーマンス テスト スクリプトを作成できます。
大きなハグ。
チャーリー・オートマティザ
以上がGrafana Kheat シート: パフォーマンス エンジニアが知っておくべきすべての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。