DEV Community

Cover image for Kiểm thử tải API với Artillery: Hướng dẫn thực hành
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Kiểm thử tải API với Artillery: Hướng dẫn thực hành

Artillery là bộ công cụ kiểm thử tải (load testing) mã nguồn mở dựa trên Node.js. Bạn mô tả tải và luồng request trong YAML, chạy artillery run script.yml, rồi đọc các chỉ số như latency percentile, request rate và error count. Bài viết này hướng dẫn cách cài Artillery v2, viết script kiểm thử thực tế, chạy test, xuất kết quả đúng cách trong v2 và tích hợp vào CI.

Dùng thử Apidog ngay hôm nay

Artillery là gì và khi nào nên sử dụng

Artillery tạo ra người dùng ảo (Virtual Users - VUs) để gọi API theo kịch bản định nghĩa sẵn. Mỗi VU hoạt động như một client mô phỏng: gọi endpoint, chờ phản hồi, tiếp tục bước tiếp theo.

Dùng Artillery khi bạn cần trả lời các câu hỏi như:

  • p95 latency thay đổi thế nào ở 50 request/giây?
  • Ở mức tải nào API bắt đầu trả lỗi?
  • API có ổn định trong 5 phút tải liên tục không?
  • Hệ thống suy giảm dần hay sập đột ngột khi tăng tải?

Điểm mạnh của Artillery là cấu hình khai báo bằng YAML. Bạn không cần tự viết vòng lặp concurrency phức tạp. Vì chạy trên Node.js, cùng một script có thể chạy local, staging hoặc trong CI.

Nếu bạn đang so sánh công cụ, xem thêm tổng hợp các công cụ kiểm thử tải hàng đầuso sánh phần mềm kiểm thử tải giữa k6, JMeter, Gatling và các lựa chọn khác.

Cài đặt Artillery v2

Cài Artillery CLI bằng npm:

npm install -g artillery@latest
artillery version
Enter fullscreen mode Exit fullscreen mode

Bạn nên dùng bản Node.js LTS gần đây. Artillery chạy trên Windows, macOS và Linux.

Nếu không muốn cài global, dùng npx:

npx artillery@latest run script.yml
Enter fullscreen mode Exit fullscreen mode

Viết script kiểm thử Artillery

Một file Artillery YAML thường có 2 phần chính:

  • config: định nghĩa target, phases, biến, payload.
  • scenarios: định nghĩa hành vi của mỗi VU.

Ví dụ dưới đây mô phỏng 3 giai đoạn: warm up, ramp up và sustained load.

config:
  target: "https://api.example.com"
  phases:
    - name: "Warm up"
      duration: 60
      arrivalRate: 5
    - name: "Ramp to peak"
      duration: 120
      arrivalRate: 5
      rampTo: 50
    - name: "Sustained load"
      duration: 300
      arrivalRate: 50
      maxVusers: 500
  variables:
    productId:
      - "1001"
      - "1002"

scenarios:
  - name: "Browse and create order"
    flow:
      - get:
          url: "/v1/products/{{ productId }}"
      - post:
          url: "/v1/orders"
          json:
            productId: "{{ productId }}"
            quantity: 2
Enter fullscreen mode Exit fullscreen mode

Cấu hình config

config.target là base URL. Mọi url trong scenario sẽ được nối vào target này.

config:
  target: "https://api.example.com"
Enter fullscreen mode Exit fullscreen mode

config.phases định nghĩa các giai đoạn tải chạy theo thứ tự.

Các field thường dùng:

  • duration: thời lượng giai đoạn, tính bằng giây hoặc chuỗi như "5m".
  • arrivalRate: số VU mới bắt đầu mỗi giây.
  • rampTo: tăng tuyến tính từ arrivalRate đến giá trị này.
  • arrivalCount: số VU cố định được phân bổ trong giai đoạn.
  • maxVusers: giới hạn số VU chạy đồng thời.
  • name: nhãn hiển thị trong output.

Lưu ý: duration chỉ kiểm soát thời gian Artillery tiếp tục tạo VU mới. Nếu một VU bắt đầu gần cuối phase và flow vẫn chưa xong, bài test sẽ tiếp tục cho đến khi VU đó hoàn tất.

Cấu hình scenarios

scenarios là danh sách các kịch bản mà VU có thể chạy.

scenarios:
  - name: "Browse and create order"
    flow:
      - get:
          url: "/v1/products/{{ productId }}"
      - post:
          url: "/v1/orders"
          json:
            productId: "{{ productId }}"
            quantity: 2
Enter fullscreen mode Exit fullscreen mode

Mỗi scenario có:

  • name: tên kịch bản.
  • weight: xác suất tương đối để Artillery chọn scenario này.
  • flow: danh sách request theo thứ tự.

Các HTTP step phổ biến:

  • get
  • post
  • put
  • patch
  • delete

Dữ liệu body JSON đặt dưới json. Biến dùng cú pháp {{ variableName }}.

Dùng dữ liệu từ CSV

Hard-code dữ liệu chỉ phù hợp cho smoke test. Với test thực tế, hãy dùng config.payload để đọc dữ liệu từ CSV.

Ví dụ users.csv:

email,password
user1@example.com,secret1
user2@example.com,secret2
Enter fullscreen mode Exit fullscreen mode

Script Artillery:

config:
  target: "https://api.example.com"
  payload:
    path: "./users.csv"
    fields:
      - "email"
      - "password"
  phases:
    - duration: 120
      arrivalRate: 20

scenarios:
  - flow:
      - post:
          url: "/login"
          json:
            email: "{{ email }}"
            password: "{{ password }}"
Enter fullscreen mode Exit fullscreen mode

Mỗi VU sẽ lấy một dòng dữ liệu, và tên cột trở thành biến trong scenario.

Chạy bài kiểm thử

Lệnh cơ bản:

artillery run script.yml
Enter fullscreen mode Exit fullscreen mode

Ghi đè target mà không sửa file YAML:

artillery run --target https://staging.example.com script.yml
Enter fullscreen mode Exit fullscreen mode

Truyền biến bằng JSON:

artillery run -v '{ "productId": ["1001","1002"] }' script.yml
Enter fullscreen mode Exit fullscreen mode

Một số flag hữu ích:

  • --target hoặc -t: ghi đè config.target.
  • --environment hoặc -e: chọn cấu hình trong config.environments.
  • --config hoặc -c: dùng file config riêng.
  • --insecure hoặc -k: bỏ qua xác minh TLS, hữu ích với chứng chỉ tự ký trong môi trường test.

Đọc kết quả Artillery

Trong khi chạy, Artillery in số liệu tổng hợp khoảng mỗi 10 giây. Khi hoàn thành, CLI in báo cáo tóm tắt.

Các chỉ số cần theo dõi:

  • Request rate: số request/giây thực tế đạt được.
  • Latency percentiles: p50, p95, p99.
  • Error counts: request lỗi, timeout, phản hồi non-2xx.

Đừng chỉ nhìn average latency. p95 và p99 thường cho thấy vấn đề sớm hơn. Ví dụ average có thể ổn, nhưng p99 tăng lên vài giây khi hệ thống bắt đầu nghẽn.

Nếu lỗi chỉ xuất hiện trong phase Sustained load, đó có thể là dấu hiệu hệ thống đạt điểm bão hòa. Để hiểu thêm về các chỉ số hiệu suất API, xem hướng dẫn kiểm thử hiệu suất API.

Tạo báo cáo trong Artillery v2

Artillery v2 đã thay đổi cách tạo báo cáo.

Các hướng dẫn cũ thường dùng:

artillery run --output report.json script.yml
artillery report report.json
Enter fullscreen mode Exit fullscreen mode

Trong v2 hiện tại:

  • --output report.json vẫn hoạt động.
  • artillery report đã bị xóa khỏi Artillery CLI.

Vì vậy, không nên dùng:

artillery report report.json
Enter fullscreen mode Exit fullscreen mode

Lệnh này sẽ không hoạt động trên Artillery v2 hiện tại.

Cách 1: Xuất JSON

artillery run --output report.json script.yml
Enter fullscreen mode Exit fullscreen mode

File report.json phù hợp cho CI hoặc phân tích tự động.

Ví dụ lấy p95 latency bằng jq:

jq '.aggregate.summaries["http.response_time"].p95' report.json
Enter fullscreen mode Exit fullscreen mode

Cách 2: Dùng Artillery Cloud

Artillery Cloud là phương án chính thức thay cho HTML report cũ.

artillery run --record --key $ARTILLERY_CLOUD_API_KEY script.yml
Enter fullscreen mode Exit fullscreen mode

Cách 3: Đẩy metrics ra hệ thống monitoring

Bạn có thể dùng plugin publish-metrics hoặc OpenTelemetry để gửi latency, throughput và error rate vào hệ thống observability hiện có.

Chạy Artillery trong CI

Artillery là Node.js CLI, nên dễ tích hợp với GitHub Actions, GitLab CI, CircleCI hoặc Jenkins.

Ví dụ GitHub Actions:

name: Load test

on: [workflow_dispatch]

jobs:
  artillery:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: "lts/*"

      - run: npm install -g artillery@latest

      - run: artillery run --output report.json script.yml

      - uses: actions/upload-artifact@v4
        with:
          name: artillery-report
          path: report.json
Enter fullscreen mode Exit fullscreen mode

Workflow này chạy thủ công bằng workflow_dispatch.

Với load test nặng, nên chạy theo lịch hoặc theo yêu cầu thay vì mỗi commit, vì test có thể tốn thời gian, băng thông và tài nguyên môi trường.

Bạn cũng có thể fail pipeline nếu p95 vượt ngưỡng cho phép:

- name: Check p95 latency
  run: |
    P95=$(jq '.aggregate.summaries["http.response_time"].p95' report.json)
    echo "p95 latency: $P95 ms"

    if (( $(echo "$P95 > 500" | bc -l) )); then
      echo "p95 latency exceeded budget"
      exit 1
    fi
Enter fullscreen mode Exit fullscreen mode

Vị trí của Apidog: kiểm thử chức năng và kiểm soát CI

Artillery trả lời câu hỏi:

API có chịu được mức tải này không?

Đó là kiểm thử tải và hiệu suất.

Một câu hỏi khác cũng quan trọng:

Sau thay đổi mã, API có còn trả về phản hồi đúng không?

Đó là kiểm thử chức năng và hồi quy. Đây là nơi Apidog phù hợp.

Apidog là nền tảng API tất cả trong một cho thiết kế, debug, mocking, tài liệu và kiểm thử tự động. Bạn có thể nhóm endpoint thành test scenario, thêm điều kiện như if, for, foreach, xác thực status code, response body và contract.

Sau đó, chạy các scenario này trong CI bằng Apidog CLI để chặn merge hoặc deployment khi API bị lỗi.

Ranh giới cần rõ ràng:

  • Apidog có tính năng kiểm thử hiệu suất.
  • Giới hạn là 100 người dùng ảo.
  • Mức này đủ để phát hiện regression rõ ràng.
  • Nó không thay thế Artillery cho kiểm thử tải đồng thời cao.

Với tải lớn, phân tán và mô hình hóa bằng code, Artillery là lựa chọn phù hợp hơn. Cách phân chia này cũng được đề cập trong bài viết về kiểm thử tải API mà không cần Python, và tính năng 100-VU của Apidog được mô tả trong kiểm thử hiệu suất API trong Apidog.

Cách triển khai thực tế:

  1. Dùng Artillery để kiểm thử khả năng mở rộng.
  2. Dùng Apidog CLI để chạy kiểm thử chức năng và hồi quy trong CI.
  3. Dùng kết quả của cả hai để quyết định có deploy hay không.

Cài Apidog CLI:

npm install -g apidog-cli
Enter fullscreen mode Exit fullscreen mode

Chạy test scenario trong CI:

apidog run \
  --access-token $APIDOG_ACCESS_TOKEN \
  -t <TEST_SCENARIO_ID> \
  -e <ENVIRONMENT_ID> \
  -r cli,junit \
  --out-dir ./apidog-reports
Enter fullscreen mode Exit fullscreen mode

Trong đó:

  • --access-token: token truy cập Apidog.
  • -t: ID test scenario.
  • -e: ID environment, bắt buộc.
  • -r cli,junit: xuất kết quả ra console và JUnit XML.
  • --out-dir: thư mục lưu báo cáo.

Xem thêm hướng dẫn Apidog CLIcác phương pháp hay nhất về CI/CD cho kiểm thử API.

Nếu bạn muốn kiểm thử chức năng, contract và hồi quy chạy song song với load test Artillery, hãy tải Apidog miễn phí và xây dựng test scenario đầu tiên.

Câu hỏi thường gặp

Kiểm thử tải Artillery là gì?

Kiểm thử tải Artillery là việc dùng Artillery để mô phỏng nhiều người dùng ảo cùng gọi API. Bạn định nghĩa tải và luồng request trong YAML, chạy test, rồi đo latency percentile, request rate và lỗi để đánh giá hệ thống dưới áp lực.

Artillery có miễn phí và mã nguồn mở không?

Có. Artillery CLI cốt lõi là miễn phí và mã nguồn mở, được phân phối trên npm dưới tên package artillery.

Artillery cũng có dịch vụ trả phí là Artillery Cloud để lưu trữ dashboard kết quả. Tuy nhiên, bạn vẫn có thể chạy load test local hoặc trong CI mà không cần Artillery Cloud.

Làm thế nào để chạy một bài kiểm thử tải Artillery?

Cài Artillery:

npm install -g artillery@latest
Enter fullscreen mode Exit fullscreen mode

Tạo file YAML có:

  • config: target và phases.
  • scenarios: flow request.

Sau đó chạy:

artillery run script.yml
Enter fullscreen mode Exit fullscreen mode

Artillery sẽ in metrics trực tiếp trong quá trình chạy và summary ở cuối.

Làm thế nào để tạo báo cáo Artillery?

Dùng --output để xuất JSON:

artillery run --output report.json script.yml
Enter fullscreen mode Exit fullscreen mode

Lệnh cũ artillery report để tạo HTML đã bị xóa khỏi CLI.

Thay vào đó, bạn có thể:

  • Phân tích JSON bằng jq.
  • Dùng Artillery Cloud với --record --key.
  • Đẩy metrics ra ngoài bằng publish-metrics hoặc OpenTelemetry.

Artillery so với k6 hoặc JMeter: nên dùng cái nào?

Cả ba đều xử lý được kiểm thử tải quy mô lớn.

  • Artillery dùng YAML khai báo và chạy trên Node.js, phù hợp với nhóm JavaScript/Node.js.
  • k6 dùng JavaScript theo hướng code-first.
  • JMeter dựa trên Java, có GUI và hệ sinh thái plugin lâu đời.

Xem thêm so sánh Gatling vs JMeter để hiểu thêm các đánh đổi.

Chọn công cụ có mô hình scripting phù hợp với nhóm của bạn, sau đó kết hợp với kiểm thử chức năng trong CI để có phạm vi bao phủ tốt hơn.

Top comments (0)