AI

負荷テスト比較2025:k6 vs Locust vs Gatling でAPIをベンチマークする

オープンソースラボ編集部2026年6月14日

負荷テスト比較2025:k6 vs Locust vs Gatling でAPIをベンチマークする

⚡ WebアプリのパフォーマンスをCI/CDに統合してテストするツール。k6・Locust・Gatlingを2025年最新版で比較します。

負荷テストとは

実際のトラフィックに近い負荷をシステムに与え、スループット・レイテンシー・エラー率を測定するテストです。性能ボトルネックの発見とスケーリング計画に使います。

主要ツール比較表

項目k6LocustGatling
ライセンスAGPLv3MITApache 2.0
スクリプト言語JavaScript/TypeScriptPythonScala/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チーム・リアルタイムUILocust
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程度なので、大規模テストは複数台必要です。

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。