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

Một hướng dẫn thực hành kiểm thử tải API với Artillery: cài đặt v2, viết kịch bản YAML, chạy, đọc kết quả p95/p99, báo cáo và chặn CI.

INEZA Felin-Michel

INEZA Felin-Michel

8 tháng 7 2026

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

Apidog cho doanh nghiệp

Triển khai tại chỗ

SSO & RBAC

Tuân thủ SOC 2

Khám phá Apidog Enterprise

Artillery là một bộ công cụ kiểm thử tải (load-testing) mã nguồn mở, dựa trên Node.js, giúp tạo ra lưu lượng truy cập đồng thời cao đến API của bạn từ một script YAML đơn giản. Bạn định nghĩa các giai đoạn tải và luồng yêu cầu, chạy artillery run script.yml, và đọc lại các phần trăm độ trễ, tốc độ yêu cầu và số lỗi. Hướng dẫn này sẽ chỉ cho bạn cách cài đặt Artillery v2, viết một script kiểm thử thực tế, chạy nó, thu thập kết quả theo cách của v2 hiện tại và tích hợp nó vào CI.

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

Artillery tạo ra người dùng ảo (VUs) truy cập các điểm cuối của bạn và đo lường cách hệ thống hoạt động dưới lưu lượng truy cập liên tục. Người dùng ảo là một client mô phỏng chạy qua một kịch bản, hết yêu cầu này đến yêu cầu khác, giống như một người gọi thực tế.

Bạn tìm đến Artillery khi cần câu trả lời cho các câu hỏi về khả năng mở rộng. Độ trễ p95 hoạt động như thế nào ở 50 yêu cầu mỗi giây? Ở tốc độ đến nào thì lỗi bắt đầu xuất hiện? API có ổn định trong năm phút tải liên tục hay nó bị suy giảm hiệu suất?

Artillery giỏi việc này vì bài kiểm thử mang tính khai báo. Bạn mô tả hình dạng tải trong YAML thay vì viết code thủ công cho vòng lặp đồng thời. Nó chạy ở bất cứ đâu Node.js chạy, vì vậy cùng một script có thể hoạt động trên máy tính xách tay của bạn và trong CI.

Artillery là một trong số các lựa chọn trong lĩnh vực này. Nếu bạn vẫn đang so sánh các công cụ, 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 này sẽ đề cập đến những đánh đổi giữa k6, JMeter, Gatling và các công cụ khác.

Cài đặt Artillery (v2)

Tên gói chính xác là artillery, và phiên bản chính hiện tại là v2. Cài đặt nó trên toàn cầu bằng npm, sau đó xác minh phiên bản.

npm install -g artillery@latest
artillery version

Bạn cần một bản phát hành LTS gần đây của Node.js. Artillery chạy trên Windows, macOS và Linux.

Nếu bạn không muốn cài đặt bất cứ thứ gì trên toàn cầu, hãy chạy nó theo yêu cầu bằng npx.

npx artillery@latest run script.yml

Viết một Script kiểm thử Artillery

Một bài kiểm thử Artillery là một tệp YAML với hai phần cấp cao nhất. Phần config định nghĩa mục tiêu và cấu hình tải. Phần scenarios định nghĩa những gì mỗi người dùng ảo thực hiện.

Dưới đây là một script hoàn chỉnh khởi động, tăng dần đến đỉnh, sau đó duy trì tải liên tục.

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
  # Inline variables (or use a CSV via config.payload)
  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

Tìm hiểu về phần config

config.target là máy chủ cơ sở mà mọi yêu cầu chạy tới. Mỗi bước trong một kịch bản sẽ nối url của nó vào cơ sở này.

config.phases là một mảng các giai đoạn tải chạy theo thứ tự. Các khóa bạn sẽ sử dụng nhiều nhất:

Một chi tiết khiến mọi người bối rối. duration của một giai đoạn kiểm soát thời gian Artillery tiếp tục tạo ra người dùng ảo, chứ không phải tổng thời gian thực của bài kiểm thử. Nếu một VU bắt đầu gần cuối một giai đoạn và kịch bản của nó mất một thời gian, quá trình chạy sẽ tiếp tục cho đến khi người dùng đó hoàn thành.

Tìm hiểu về phần scenarios

scenarios là một mảng. Mỗi kịch bản có một flow, là danh sách các bước theo thứ tự mà người dùng ảo chạy. Các khóa tùy chọn bao gồm nameweight, trong đó weight đặt xác suất tương đối để Artillery chọn kịch bản này cho một VU nhất định.

Các bước của luồng sử dụng các khóa động từ HTTP: get, post, put, deletepatch. Mỗi cái nhận một url, và nội dung yêu cầu nằm dưới json. Cú pháp ngoặc kép, {{ productId }}, lấy một biến.

Đẩy các yêu cầu từ tệp CSV

Mã hóa cứng các giá trị là tốt cho một bài kiểm thử khói (smoke test). Để tải thực tế, hãy cung cấp dữ liệu từ tệp CSV với config.payload. Mỗi người dùng ảo chọn một hàng, và tên cột trở thành các biến.

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 }}"

Chạy bài kiểm thử

Lệnh cơ bản chỉ Artillery đến script của bạn.

artillery run script.yml

# Override target without editing the script:
artillery run --target https://staging.example.com script.yml

# Pass variables as JSON:
artillery run -v '{ "productId": ["1001","1002"] }' script.yml

Một vài cờ (flags) đáng biết. --target (hoặc -t) ghi đè lên config.target để bạn có thể chỉ cùng một script vào môi trường staging hoặc production. --environment (hoặc -e) chọn một khối được đặt tên dưới config.environments. --config (hoặc -c) tải cấu hình từ một tệp riêng biệt. --insecure (hoặc -k) bỏ qua xác minh TLS cho các chứng chỉ tự ký trong môi trường thử nghiệm.

Đọc kết quả

Trong khi bài kiểm thử đang chạy, Artillery in ra các số liệu tổng hợp khoảng mỗi 10 giây. Khi hoàn thành, bạn sẽ nhận được một báo cáo tóm tắt. Các con số quan trọng nhất:

Hãy chú ý đến độ trễ ở phần đuôi (tail latencies), không chỉ giá trị trung bình. Một giá trị trung bình có thể trông khỏe mạnh trong khi p99 âm thầm tăng lên mức vài giây. Nếu lỗi chỉ xuất hiện trong giai đoạn duy trì, bạn có thể đã tìm thấy một điểm bão hòa đáng để điều tra. Để tìm hiểu sâu hơn về các số liệu cần theo dõi và lý do, hãy xem hướng dẫn kiểm thử hiệu suất API này.

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

Tính năng báo cáo đã thay đổi giữa các phiên bản Artillery, vì vậy đây là điểm mà các hướng dẫn lỗi thời có thể làm bạn lạc lối. Các hướng dẫn cũ hơn khuyên bạn chạy artillery run --output report.json và sau đó artillery report report.json để tạo tệp HTML. Nửa đầu vẫn hoạt động. Nửa sau thì không.

Cờ --output vẫn ghi một tệp kết quả JSON có thể đọc được bằng máy.

# Write machine-readable JSON results (still supported):
artillery run --output report.json script.yml

Lệnh artillery report, trình tạo JSON sang HTML, đã bị xóa khỏi Artillery CLI. Tài liệu chính thức nêu rõ rằng nó “không còn được hỗ trợ và đã bị xóa khỏi Artillery CLI.” Mã báo cáo HTML không được duy trì, bị phản đối (deprecated), và sau đó bị loại bỏ, không có kế hoạch mang nó trở lại. Đừng viết artillery report report.json; nó sẽ không hoạt động trên v2 hiện tại.

Thay vào đó, bạn có ba lựa chọn hiện tại.

Thứ nhất, tự phân tích cú pháp JSON. Điều này lý tưởng cho CI, nơi bạn muốn khẳng định dựa trên một ngưỡng. Lấy độ trễ p95 tổng hợp bằng jq:

jq '.aggregate.summaries["http.response_time"].p95' report.json

Thứ hai, sử dụng Artillery Cloud cho một bảng điều khiển được lưu trữ (hosted dashboard). Đây là sự thay thế chính thức cho báo cáo HTML cũ. Truyền --record cùng với khóa API của bạn.

artillery run --record --key $ARTILLERY_CLOUD_API_KEY script.yml

Thứ ba, đẩy các số liệu đến hệ thống giám sát của riêng bạn với plugin publish-metrics hoặc OpenTelemetry, để độ trễ và tỷ lệ lỗi hiển thị trên cùng các bảng điều khiển bạn đã sử dụng cho môi trường production.

Chạy Artillery trong CI

Vì Artillery chỉ là một CLI của Node.js, nó có thể tích hợp vào bất kỳ pipeline nào. Dưới đây là một quy trình làm việc (workflow) của GitHub Actions cài đặt Artillery, chạy bài kiểm thử và tải lên báo cáo JSON dưới dạng một artifact của bản dựng (build artifact).

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

Ví dụ này chạy theo cách kích hoạt thủ công. Các bài kiểm thử tải nặng thường được kích hoạt theo yêu cầu hoặc theo lịch trình chứ không phải trên mỗi commit, vì chúng mất vài phút và tiêu thụ băng thông thực. Khi báo cáo JSON tồn tại, bạn có thể thêm một bước jq để thất bại công việc nếu p95 vượt quá ngân sách của bạn.

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 "liệu API có thể chịu được lượng truy cập lớn này không?" Đó là kiểm thử tải và hiệu suất. Một câu hỏi khác song song với nó là: "API có vẫn trả về các phản hồi đúng sau khi thay đổi mã này không?" Đó là kiểm thử chức năng và hồi quy, và đó là nơi Apidog phù hợp.

Apidog là một nền tảng API tất cả trong một để thiết kế, gỡ lỗi, mocking, tài liệu và kiểm thử tự động. Các kịch bản kiểm thử của nó nhóm các điểm cuối thành các bước logic với các điều kiện như if, for và foreach, để bạn có thể xác thực nội dung phản hồi, mã trạng thái và hợp đồng. Bạn chạy các kịch bản đó trong CI với Apidog CLI để kiểm soát việc hợp nhất sau khi thay đổi mã.

Hãy rõ ràng về ranh giới. Apidog có bao gồm tính năng kiểm thử hiệu suất, nhưng nó giới hạn ở 100 người dùng ảo. Điều đó đủ để phát hiện các hồi quy rõ ràng, và nó không phải là sự thay thế cho Artillery ở mức độ đồng thời cao. Đối với tải phân tán, được mô hình hóa bằng mã ở quy mô lớn, Artillery là công cụ phù hợp. Khung trình bày thẳng thắn tương tự này cũng xuất hiện trong bài viết của chúng tôi về kiểm thử tải API mà không cần Python, và cơ chế của tính năng 100-VU của Apidog được đề cập trong kiểm thử hiệu suất API trong Apidog.

Vì vậy, hãy sử dụng cả hai. Kiểm thử tải với Artillery để đánh giá khả năng mở rộng. Chạy kiểm tra chức năng và hồi quy trong CI với Apidog CLI để phát hiện hành vi bị lỗi trước khi triển khai.

Apidog CLI được cài đặt từ npm, và lệnh apidog run chỉ dùng cờ (flag-only).

# Apidog CLI: functional/regression run in CI (flag-only, no positional file)
npm install -g apidog-cli
apidog run \
  --access-token $APIDOG_ACCESS_TOKEN \
  -t <TEST_SCENARIO_ID> \
  -e <ENVIRONMENT_ID> \
  -r cli,junit \
  --out-dir ./apidog-reports

Cờ -t là ID kịch bản kiểm thử, -e là ID môi trường bắt buộc, và -r cli,junit xuất cả đầu ra console và báo cáo JUnit XML mà các hệ thống CI có thể đọc. Để xem hướng dẫn từng bước, hãy xem hướng dẫn Apidog CLI, và để biết các mẫu thiết kế pipeline, hãy xem các phương pháp hay nhất về CI/CD cho kiểm thử API này.

Bạn muốn có các bài kiểm thử chức năng và hợp đồng kiểm soát CI của bạn cùng với các lần chạy tải của Artillery? Tải xuống Apidog miễn phí và xây dựng kịch bản kiểm thử đầu tiên của bạn.

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

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

Kiểm thử tải Artillery là thực hành sử dụng bộ công cụ Artillery mã nguồn mở để mô phỏng nhiều người dùng ảo đồng thời truy cập API của bạn. Bạn mô tả hình dạng tải và luồng yêu cầu trong một script YAML, chạy nó, và đo lường các phần trăm độ trễ, tốc độ yêu cầu và lỗi để xem hệ thống của bạn hoạt động như thế nào 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 dạng gói artillery. Ngoài ra còn có một dịch vụ lưu trữ trả phí, Artillery Cloud, cung cấp bảng điều khiển cho kết quả, nhưng bạn có thể chạy các bài kiểm thử tải đầy đủ cục bộ và trong CI mà không cần nó.

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

Cài đặt nó bằng npm install -g artillery@latest, viết một script YAML với khối config (mục tiêu và các giai đoạn) và khối scenarios (luồng yêu cầu), sau đó chạy artillery run script.yml. Artillery in ra các số liệu trực tiếp mỗi 10 giây và một bản tóm tắt ở cuối.

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

Chạy artillery run --output report.json script.yml để ghi một tệp kết quả JSON. Lệnh cũ artillery report tạo ra HTML đã bị xóa khỏi CLI. Thay vào đó, hãy phân tích cú pháp JSON bằng một công cụ như jq, sử dụng Artillery Cloud thông qua --record --key, hoặc đẩy các số liệu ra ngoài với plugin publish-metrics hoặc OpenTelemetry.

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

Cả ba đều xử lý tải quy mô lớn. Artillery sử dụng YAML khai báo và Node.js, phù hợp với các nhóm đã làm việc trong hệ sinh thái JavaScript. k6 viết script bằng JavaScript với mô hình code-first. JMeter được điều khiển bằng GUI và dựa trên Java với lịch sử plugin lâu đời. So sánh Gatling vs JMeter bao gồm các đánh đổi chi tiết hơn. 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 nó với các bài kiểm thử CI chức năng để có phạm vi bao phủ đầy đủ.

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API