負荷テスト比較2025:k6 vs Locust vs Gatling でAPIをベンチマークする
オープンソースラボ編集部 ・ 2026年6月14日
負荷テスト比較2025:k6 vs Locust vs Gatling でAPIをベンチマークする
⚡ WebアプリのパフォーマンスをCI/CDに統合してテストするツール。k6・Locust・Gatlingを2025年最新版で比較します。
負荷テストとは
実際のトラフィックに近い負荷をシステムに与え、スループット・レイテンシー・エラー率を測定するテストです。性能ボトルネックの発見とスケーリング計画に使います。
主要ツール比較表
| 項目 | k6 | Locust | Gatling |
|---|---|---|---|
| ライセンス | AGPLv3 | MIT | Apache 2.0 |
| スクリプト言語 | JavaScript/TypeScript | Python | Scala/Java |
| ドキュメント | ◎ | ◎ | ◎ |
| CLIファースト | ◎ | ○ | ◎ |
| リアルタイムUI | △ | ◎ | ◎(HTML) |
| 分散テスト | ◎ | ◎ | ◎ |
| CI/CD統合 | ◎ | ○ | ◎ |
| メモリ効率 | ◎(Go) | △(Python) | ◎(JVM) |
| 学習コスト | 低 | 低〜中 | 高(Scala) |
各ツールの特徴
k6
Grafana社が開発するGoランタイム+JavaScript APIの負荷テストツール。CI/CDへの統合と使いやすさで近年圧倒的な人気を誇ります。
主な特徴:
- JavaScriptで直感的にシナリオ記述
- 大量の仮想ユーザーを少ないリソースで実行(Go製)
- Grafana Dashboardとのネイティブ統合
- Browser Testing対応(Playwright統合)
// k6 テストスクリプト
import http from 'k6/http';
import { check, sleep } from 'k6';
import { Rate } from 'k6/metrics';
const errorRate = new Rate('errors');
export const options = {
stages: [
{ duration: '30s', target: 20 }, // 30秒で20ユーザーへ
{ duration: '1m', target: 100 }, // 1分で100ユーザーへ
{ duration: '30s', target: 0 }, // 30秒でシャットダウン
],
thresholds: {
http_req_duration: ['p(95)<500'], // 95%ile が500ms以下
errors: ['rate<0.01'], // エラー率1%以下
},
};
export default function () {
const res = http.post('https://api.example.com/users', JSON.stringify({
name: 'test_user',
email: `user_${Math.random()}@example.com`,
}), {
headers: { 'Content-Type': 'application/json' },
});
check(res, {
'status is 201': (r) => r.status === 201,
'response time < 200ms': (r) => r.timings.duration < 200,
});
errorRate.add(res.status !== 201);
sleep(1);
}
# 実行
k6 run script.js
# Grafana Cloudに結果送信
k6 run --out cloud script.js
# 分散テスト(k6 operator)
k6 run --out influxdb=http://localhost:8086/k6 script.js
向いているケース: CI/CD統合・JavaScriptが使える開発者
Locust
PythonでシナリオをコーディングするOSS負荷テストツール。WebUIがリアルタイムでメトリクスを表示します。
主な特徴:
- Pythonの全機能を使ったシナリオ記述が可能
- Webブラウザで起動・停止・リアルタイム監視
- DistributedモードでWorkerを複数台に分散
- コルーチンベースで効率的
# locustfile.py
from locust import HttpUser, task, between
class APIUser(HttpUser):
wait_time = between(1, 3) # タスク間の待機(1〜3秒のランダム)
def on_start(self):
# セッション開始時にログイン
response = self.client.post("/api/auth/login", json={
"email": "test@example.com",
"password": "password"
})
self.token = response.json()["token"]
@task(3)
def get_articles(self):
self.client.get("/api/articles", headers={
"Authorization": f"Bearer {self.token}"
})
@task(1)
def create_article(self):
self.client.post("/api/articles", json={
"title": "Test Article",
"content": "Load test content"
}, headers={
"Authorization": f"Bearer {self.token}"
})
# 起動(WebUI: http://localhost:8089)
locust -f locustfile.py --host=https://api.example.com
# ヘッドレスモード(CI向け)
locust -f locustfile.py --headless -u 100 -r 10 --run-time 1m --host=https://api.example.com
向いているケース: Pythonチーム・WebUIでリアルタイム監視
Gatling
ScalaベースのJVM高性能負荷テストツール。詳細なHTMLレポートと高スループットが強みです。
主な特徴:
- HTMLの詳細レポートを自動生成
- JVMベースで高スループット(C10K問題を軽く超える)
- DSLで読みやすいシナリオ記述(Scala知識が必要)
- Maven/Gradleプラグインでビルド統合
// UserSimulation.scala
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class UserSimulation extends Simulation {
val httpProtocol = http
.baseUrl("https://api.example.com")
.acceptHeader("application/json")
val scn = scenario("APIシナリオ")
.exec(
http("GET Articles")
.get("/api/articles")
.check(status.is(200))
)
.pause(1)
.exec(
http("POST Article")
.post("/api/articles")
.body(StringBody('''{"title": "Gatling Test", "content": "test"}'''))
.asJson
.check(status.is(201))
)
setUp(
scn.inject(
rampUsers(100).during(30.seconds)
)
).protocols(httpProtocol)
.assertions(
global.responseTime.percentile3.lt(500),
global.successfulRequests.percent.gt(99)
)
}
向いているケース: JVM環境・詳細レポート・Maven統合
選択ガイド
| 状況 | 推奨 |
|---|---|
| CI/CD統合・JavaScriptチーム | k6 |
| Pythonチーム・リアルタイムUI | Locust |
| Java/Scala環境・詳細レポート | Gatling |
内部リンク
外部リソース
FAQ
Q. 何ユーザーから負荷テストと言えますか?
ユーザー数より「目標スループット(RPS: Requests Per Second)」で考えるのが正確です。まず本番のピークRPSを計測し、その2〜3倍で安定するかをテストします。
Q. k6のAGPLライセンスは商用利用に問題がありますか?
k6をツールとして社内で使う分には問題ありません。k6のコードをSaaSとして提供する場合は制限があります。
Q. CI/CDで自動的に負荷テストをするにはどうすればいいですか?
k6は--exit-on-runningフラグとthresholdsで合否判定できるため、GitHub ActionsやGitLab CIに組み込みやすいです。
Q. 分散負荷テストに必要なサーバー数はどのくらいですか?
k6は1台のサーバーで数万RPSを出せます。Locustは1Workerあたり数百RPS程度なので、大規模テストは複数台必要です。