[{"data":1,"prerenderedAt":302},["ShallowReactive",2],{"news-item-\u002Fja\u002Fnews\u002Fchay-load-test-performance-test-voi-artillery":3},{"id":4,"title":5,"body":6,"category":289,"created by":290,"date":291,"description":292,"extension":293,"meta":294,"navigation":295,"path":296,"sections":297,"seo":298,"stem":299,"thumbnail":300,"__hash__":301},"content_ja\u002Fja\u002Fnews\u002Fchay-load-test-performance-test-voi-artillery.md","Artilleryを使った負荷テスト・性能テストの実行",{"type":7,"value":8,"toc":266},"minimark",[9,13,18,22,25,28,32,35,38,41,44,47,50,53,56,59,70,76,79,85,88,98,104,107,110,113,119,122,125,131,134,142,145,148,151,154,160,163,169,172,175,181,184,187,190,193,199,202,215,218,221,236,242,246,249,252,255],[10,11,12],"h2",{"id":12},"紹介",[14,15,17],"h3",{"id":16},"性能テストとはなぜ負荷テストを実行すべきか","性能テストとは？なぜ負荷テストを実行すべきか？",[19,20,21],"p",{},"性能テストは、ソフトウェアの試験であり、様々ワークロードでアプリケーションの稼働状況を評価することです。",[19,23,24],{},"性能テストは、パフォーマンスが低下したり障害が発生したりすることなくユーザーからの想定リクエスト数をアプリケーションが処理できるのを確保するため、応答時間、帯域幅、拡張性といった色々な情報を測定します。",[19,26,27],{},"性能テストは、パフォーマンスに関わる問題やボトルネックを特定することもでき、パフォーマンスの最適化のために必要な変更を行うのに役立ちます。この目的としては、高負荷状態でもスムーズで速やかな、信頼性の高いユーザー体験をアプリケーションが提供できるように確保するためです。",[14,29,31],{"id":30},"artilleryioについての紹介","Artillery.ioについての紹介",[19,33,34],{},"Artillery.ioはWebアプリケーション、API サービス、マイクロサービスのパフォーマンスと拡張性を確認するために使われるオープンソースの性能試験ツールです。ユーザーの実際操作を模倣して複数のソースから負荷を生成することでシナリオ通りにアプリケーションを確認することができます。",[14,36,37],{"id":37},"プロトコルのサポート",[19,39,40],{},"Artillery.ioはNode.jsで作成されて、HTTP、Websocket、socket.io. の各プロトコルをサポートします。",[19,42,43],{},"その他に、Artilleryのプラグインを使うことで、HLS（HTTP Live Streaming）、Amazon Kinesis、 Apache Kafkaといったスタックを確認することができます。",[14,45,46],{"id":46},"スクリプトの形式",[19,48,49],{},"Artillery.ioは他の一般的なテストツールとは異なり、負荷テストのシナリオを定義するため、柔軟な YAMLベースの構文を提供します。また、JSON形式もサポートします。",[10,51,52],{"id":52},"インストールおよび基本機能",[14,54,55],{"id":55},"インストール",[19,57,58],{},"以下のように、npmかyarnのコマンドを使うことでArtillery.ioをグローバルな依存関係でインストールことができます。",[60,61,66],"pre",{"className":62,"code":64,"language":65},[63],"language-text","#npm\nnpm install -g artillery\n\n","text",[67,68,64],"code",{"__ignoreMap":69},"",[60,71,74],{"className":72,"code":73,"language":65},[63],"#yarn\nyarn global add artillery\n\n",[67,75,73],{"__ignoreMap":69},[19,77,78],{},"或いは、以下のようにコマンドを使うことでNode.jsプロジェクトで開発的な依存関係でインストールすることもできます。",[60,80,83],{"className":81,"code":82,"language":65},[63],"npm install -D artillery\n",[67,84,82],{"__ignoreMap":69},[14,86,87],{"id":87},"簡易テスト",[19,89,90,91],{},"quickサブコマンドを使うことでテストスクリプトを作成せずにテストを実施することができます。例えば、10名の仮想ユーザー（VUs）が実行し、ユーザー毎に「",[92,93,97],"a",{"href":94,"rel":95},"http:\u002F\u002Flocalhost:3000\u002F:%E3%80%8D%E3%81%B8%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%9220%E5%9B%9E%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%80%81%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82",[96],"nofollow","http:\u002F\u002Flocalhost:3000\u002F:」へリクエストを20回送信する場合、以下のようになります。",[60,99,102],{"className":100,"code":101,"language":65},[63],"artillery quick -c 10 -n 20 http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fuser\n",[67,103,101],{"__ignoreMap":69},[19,105,106],{},"「-c」パラメーターはVUの総数を指定し、「-n」パラメーターは1名のVUあたりのリクエスト数を指定します。",[14,108,109],{"id":109},"テストスクリプト実行",[19,111,112],{},"runサブコマンドはテストスクリプトをローカルマシンから実行するために使われます。テストを実行する基本方法は以下の通りです。",[60,114,117],{"className":115,"code":116,"language":65},[63],"artillery run script.yaml -o report.json\n",[67,118,116],{"__ignoreMap":69},[19,120,121],{},"「-o」パラメーターはJSON帳票をあるファイルに書き込むためのオプションです。",[14,123,124],{"id":124},"帳票出力",[60,126,129],{"className":127,"code":128,"language":65},[63],"artillery report report.json -o report.html\n",[67,130,128],{"__ignoreMap":69},[19,132,133],{},"reportサブコマンドを使うことで、runサブコマンドで生成されたJSON帳票を新しいHTML帳票に変換することができます。",[135,136],"img",{"className":137,"alt":69,"src":140,"style":141},[138,139],"block","mx-auto","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F05\u002F09143906\u002Ftest-create-user.png","width: 100%;",[10,143,144],{"id":144},"簡単な負荷テストの作成",[19,146,147],{},"下記の説明のように、YAML構文を使用します。まず、「script.yml」のようなファイル名を作成しておきます。次に、ファイルの上部にあるコンフィグを定義します。",[14,149,150],{"id":150},"コンフィグ",[19,152,153],{},"「target」オプションを使用してテスト スクリプトのベースURLを設定する必要があります。",[60,155,158],{"className":156,"code":157,"language":65},[63],"config:\n  target: \"http:\u002F\u002Flocalhost:3000\u002Fapi\"\n",[67,159,157],{"__ignoreMap":69},[19,161,162],{},"次に、ロード フェーズの定義を開始します。ロード フェーズは、指定された期間内にArtilleryが新しい VU を生成する方法を定義します。",[60,164,167],{"className":165,"code":166,"language":65},[63],"config:\n  ...\n  phases:\n    - duration: 60\n      arrivalRate: 100\n",[67,168,166],{"__ignoreMap":69},[14,170,171],{"id":171},"シナリオ",[19,173,174],{},"一つまたは複数のシナリオを定義することができます。シナリオの定義はそれぞれで「flow」プロパティのあるオブジェクトです。",[60,176,179],{"className":177,"code":178,"language":65},[63],"scenarios:\n  - name: \"Get All Users\"\n    flow:\n      - get:\n          url: \"\u002Fuser\"\n          qs:\n            limit: 10\n            offset: 20\n",[67,180,178],{"__ignoreMap":69},[19,182,183],{},"「flow」プロパティには、HTTPの メソッドをオブジェクト属性として定義することができます。その後、API のパスを確定する必要があります。また、URL-encoded forms、Multipart forms、JSONといったform bodyやquery stringをセットできます。",[19,185,186],{},"スクリプトを保存してから、テストスクリプトとして実行することができます。",[10,188,189],{"id":189},"実際のユーザーフロー",[19,191,192],{},"例えば、以下のようにユーザーフローがあります。",[60,194,197],{"className":195,"code":196,"language":65},[63],"config:\n  target: \"http:\u002F\u002Flocalhost:3000\u002Fapi\"\n  phases:\n    - duration: 120\n      arrivalRate: 10\n      name: \"Preparing\"\n    - duration: 240\n      arrivalRate: 30\n      rampTo: 100\n      name: \"Increasing\"\n    - duration: 600\n      arrivalRate: 100\n      name: \"Sustained Load\"\n  payload:\n    path: \"login.csv\"\n    cast: false\n    fields:\n      - \"user\"\n      - \"pass\"\n  processor: \".\u002Fprocessor.js\"\n\nbefore:\n  flow:\n    - log: \"Get auth token\"\n    - post:\n        url: \"\u002Fauth\u002Flogin\"\n        json:\n          username: \"{{user}}\"\n          password: \"{{pass}}\"\n        capture:\n          - json: $.tokens.accessToken\n            as: token\nscenarios:\n  - name: \"Search Users\"\n    flow:\n      - get:\n          url: \"\u002Fuser\"\n          headers:\n            authorization: \"Bearer {{ token }}\"\n  - name: \"Create New User\"\n    flow:\n      - post:\n          url: \"\u002Fuser\"\n          beforeRequest: \"setJsonBody\"\n          headers:\n            authorization: \"Bearer {{ token }}\"\n",[67,198,196],{"__ignoreMap":69},[19,200,201],{},"上記のスクリプトでは、コンフィグに３つのフェーズがあります。",[203,204,205,209,212],"ul",{},[206,207,208],"li",{},"第１フェーズでは、1 秒あたり 10 個の VU を生成してアプリケーションへ2分以内で送信します。",[206,210,211],{},"第２フェーズでは、負荷テストは 1 秒あたり ３０名のユーザーで行い、、4 分以内で 1 秒あたり １００名のユーザーまで徐々に増加します。",[206,213,214],{},"第３フェーズでは、１０分以内で1 秒あたり １００名の ユーザーで連続的に負荷テストを行います。",[19,216,217],{},"複数のフェーズを使用することで、実際のアクセス数のシナリオを正確にシミュレートし、いきなり送信してくるリクエストを一括に処理するアプリケーションの性能を評価することができます。",[19,219,220],{},"シナリオの第１フローで、各 VU からは GET | \"Search user\" へリクエストを送信します。次に、第２フローで POST | \"Create user\"へリクエストを送信します。",[19,222,223,224,228,229,232,233,235],{},"データを生成しやすくなるため、リクエストする前に",[225,226,227],"strong",{},"beforeRequest","というカスタマイズフック上での",[225,230,231],{},"setJsonBody","関数を使用します。",[225,234,231],{},"関数はprocessor.jsファイルで定義され、config.processorで参照されます。",[60,237,240],{"className":238,"code":239,"language":65},[63],"# processor.js\nconst { faker } = require(\"@faker-js\u002Ffaker\");\n\nfunction setJsonBody(requestParams, context, ee, next) {\n  var body = {\n    username: faker.internet.userName(),\n    password: faker.internet.password(3),\n    email: faker.internet.exampleEmail(),\n    name: faker.name.fullName(),\n    role: faker.datatype.number({ min: 0, max: 1 }),\n  };\n\n  requestParams.json = body;\n  return next();\n}\n\nmodule.exports = {\n  setJsonBody,\n};\n",[67,241,239],{"__ignoreMap":69},[10,243,245],{"id":244},"k6と比較","K6と比較",[19,247,248],{},"ArtilleryとK6の両方はオープンソースの性能試験ツールであり、拡張性、CI\u002FCD ツールとの統合、テストパターンの設定機能といった同様の機能を持っていますが、いくつかの違いがあります。ArtilleryはNode.jsで作成されましたが、K6はGoで作成されました。そのため、Artilleryはマルチスレッドではなく、メモリー使用量もより多いので、K6より遅いです。以下に、K6 と Artillery およびその他のツールの間のメモリ使用量を比較したグラフを示します。",[19,250,251],{},"結論として、ArtilleryとK6のどちらも強力なツールです。しかし、K6はArtilleryより利点が多いです。簡単な負荷テストを作成する場合、YAML構文を使用するArtilleryが最適なソリューションです。",[10,253,254],{"id":254},"参考元",[19,256,257,261,262],{},[92,258,259],{"href":259,"rel":260},"https:\u002F\u002Fwww.artillery.io\u002F",[96]," ",[92,263,264],{"href":264,"rel":265},"https:\u002F\u002Fk6.io\u002Fblog\u002Fcomparing-best-open-source-load-testing-tools\u002F",[96],{"title":69,"searchDepth":267,"depth":267,"links":268},2,[269,276,282,286,287,288],{"id":12,"depth":267,"text":12,"children":270},[271,273,274,275],{"id":16,"depth":272,"text":17},3,{"id":30,"depth":272,"text":31},{"id":37,"depth":272,"text":37},{"id":46,"depth":272,"text":46},{"id":52,"depth":267,"text":52,"children":277},[278,279,280,281],{"id":55,"depth":272,"text":55},{"id":87,"depth":272,"text":87},{"id":109,"depth":272,"text":109},{"id":124,"depth":272,"text":124},{"id":144,"depth":267,"text":144,"children":283},[284,285],{"id":150,"depth":272,"text":150},{"id":171,"depth":272,"text":171},{"id":189,"depth":267,"text":189},{"id":244,"depth":267,"text":245},{"id":254,"depth":267,"text":254},"testing","Briswell Vietnam Co Ltd","2023-08-07","性能テストは、ソフトウェアの試験であり、様々ワークロードでアプリケーションの稼働状況を評価することです。性能テストは、パフォーマンスが低下したり障害が発生したりすることなくユーザーからの想定リクエスト数をアプリケーションが処理できるのを確保するため、応答時間、帯域幅、拡張性といった色々な情報を測定します。性能テストは、パフォーマンスに関わる問題やボトルネックを特定することもでき、パフォーマンスの最適化のために必要な変更を行うのに役立ちます。この目的としては、高負荷状態でもスムーズで速やかな、信頼性の高いユーザー体験をアプリケーションが提供できるように確保するためです。","md",{},true,"\u002Fja\u002Fnews\u002Fchay-load-test-performance-test-voi-artillery",null,{"title":5,"description":292},"ja\u002Fnews\u002Fchay-load-test-performance-test-voi-artillery","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F05\u002F09143246\u002Fartillery.png","CYz9wLQ3iaGc37djRi8_B_5e9CtRXfaOdS8OpL8p0xk",1783674946560]