#负载测试 #http #ansible #性能 #yaml #测试工具 #jmeter

app drill

Drill 是一个基于 Rust 编写的 HTTP 负载测试应用程序,其语法受 Ansible 启发。

17 个版本

0.8.2 2023年2月7日
0.8.1 2022年7月29日
0.7.2 2021年9月3日
0.7.1 2020年11月27日
0.1.0 2017年6月14日

#27HTTP 客户端

Download history 203/week @ 2024-03-13 79/week @ 2024-03-20 136/week @ 2024-03-27 143/week @ 2024-04-03 134/week @ 2024-04-10 134/week @ 2024-04-17 210/week @ 2024-04-24 149/week @ 2024-05-01 107/week @ 2024-05-08 91/week @ 2024-05-15 109/week @ 2024-05-22 150/week @ 2024-05-29 138/week @ 2024-06-05 162/week @ 2024-06-12 126/week @ 2024-06-19 145/week @ 2024-06-26

616 每月下载量

GPL-3.0 许可证

85KB
2K SLoC

Drill

Drill 是一个基于 Rust 编写的 HTTP 负载测试应用程序。该项目的主要目标是创建一个真正轻量级的工具,作为其他需要 JVM 和其他资源的工具的替代品。

您可以使用 YAML 格式编写基准文件,描述您想要测试的所有内容。

它受到 Ansible 语法的启发,因为它非常易于使用和扩展。

以下是一个 benchmark.yml 的示例

---

concurrency: 4
base: 'https://127.0.0.1:9000'
iterations: 5
rampup: 2

plan:
  - name: Include comments
    include: comments.yml

  - name: Fetch users
    request:
      url: /api/users.json

  - name: Fetch organizations
    request:
      url: /api/organizations

  - name: Fetch account
    request:
      url: /api/account
    assign: foo

  - name: Fetch manager user
    request:
      url: /api/users/{{ foo.body.manager_id }}

  - name: Assert request response code
    assert:
      key: foo.status
      value: 200

  - name: Assign values
    assign:
      key: bar
      value: "2"

  - name: Assert values
    assert:
      key: bar
      value: "2"

  - name: Fetch user from assign
    request:
      url: /api/users/{{ bar }}

  - name: Fetch some users
    request:
      url: /api/users/{{ item }}
    with_items:
      - 70
      - 73
      - 75

  - name: Tagged user request
    request:
      url: /api/users/70
    tags:
      - tag_user

  - name: Fetch some users by hash
    request:
      url: /api/users/{{ item.id }}
    with_items:
      - { id: 70 }
      - { id: 73 }
      - { id: 75 }

  - name: Fetch some users by range, index {{ index }}
    request:
      url: /api/users/{{ item }}
    with_items_range:
      start: 70
      step: 5
      stop: 75

  - name: Fetch some users from CSV, index {{ index }}
    request:
      url: /api/users/contacts/{{ item.id }}
    with_items_from_csv: ./fixtures/users.csv
    shuffle: true

  - name: POST some crafted JSONs stored in CSV, index {{ index }}
    request:
      url: /api/transactions
      method: POST
      body: '{{ item.txn }}'
      headers:
        Content-Type: 'application/json'
    with_items_from_csv:
      file_name: ./fixtures/transactions.csv
      quote_char: "\'"

  - name: Fetch no relative url
    request:
      url: https://127.0.0.1:9000/api/users.json

  - name: Interpolate environment variables
    request:
      url: https://127.0.0.1:9000/api/{{ EDITOR }}

  - name: Support for POST method
    request:
      url: /api/users
      method: POST
      body: foo=bar&arg={{ bar }}

  - name: Login user
    request:
      url: /login?user=example&password=3x4mpl3

  - name: Fetch counter
    request:
      url: /counter
    assign: memory

  - name: Fetch counter
    request:
      url: /counter
    assign: memory

  - name: Fetch endpoint
    request:
      url: /?counter={{ memory.body.counter }}

  - name: Reset counter
    request:
      method: DELETE
      url: /

  - name: Exec external commands
    exec:
      command: "echo '{{ foo.body }}' | jq .phones[0] | tr -d '\"'"
    assign: baz

  - name: Custom headers
    request:
      url: /admin
      headers:
        Authorization: Basic aHR0cHdhdGNoOmY=
        X-Foo: Bar
        X-Bar: Bar {{ memory.headers.token }}

  - name: One request with a random item
    request:
      url: /api/users/{{ item }}
    with_items:
      - 70
      - 73
      - 75
    shuffle: true
    pick: 1

如您所见,您可以通过不同的方式玩转插值。这将允许您指定具有不同请求及其之间依赖关系的基准。

如果您想了解更多关于基准文件语法的知识,请 阅读此内容

安装

目前,获取 drill 最简单的方法是访问 最新版本 页面,并下载您平台上的二进制文件。

如果您系统中有 Rust,安装 drill 的另一种方法是使用 cargo

cargo install drill
drill --benchmark benchmark.yml --stats

或下载源代码并编译它

git clone [email protected]:fcsonline/drill.git && cd drill
cargo build --release
./target/release/drill --benchmark benchmark.yml --stats

依赖关系

编译 Drill 需要 OpenSSL,无论是通过 cargo install 还是使用 cargo build 从源代码编译。

根据您的平台,依赖项的名称可能会有所不同。

Linux

使用您喜欢的包管理器安装 libssl-devpkg-config 包(如果找不到 libssl-dev,请尝试其他名称,如 opensslopenssl-devel)。

macOS

首先,安装 Homebrew 包管理器。

然后使用 Homebrew 安装 openssl

Windows

首先,安装 vcpkg

然后运行 vcpkg install openssl:x64-windows-static-md

演示

demo

功能

这是当前版本 drill 所支持的所有功能的列表

  • 并发:选择并发迭代次数来运行基准测试。
  • 多迭代:指定运行基准测试的迭代次数。
  • 预热:指定 drill 开始所有迭代所需的时间(秒)。
  • 延迟:在请求之间引入可控的延迟。例如:delay.yml
  • 动态URL:在URL中使用动态插值执行请求,例如:/api/users/{{ item }}
  • 动态头部:使用动态头部执行请求。例如:headers.yml
  • 插值环境变量:设置环境变量,例如:/api/users/{{ EDITOR }}
  • 执行:使用测试计划数据执行远程命令。
  • 断言:在测试计划期间断言值。例如:iterations.yml
  • 请求依赖:使用 assign 和 URL 插值创建请求之间的依赖关系。
  • 分割文件:将基准测试组织到多个文件中并包含它们。
  • CSV支持:读取CSV文件并构建N个请求,使用CSV数据填充动态插值。
  • HTTP方法:使用不同的HTTP方法(如GET、POST、PUT、PATCH、HEAD或DELETE)构建请求。
  • Cookie支持:创建具有会话的基准测试,因为Cookie会在请求之间传播。
  • 统计:获取所有请求的良好统计数据。例如:cookies.yml
  • 阈值:将当前基准测试性能与存储的会话进行比较,如果超过阈值则失败。
  • 标签:通过标签指定测试计划项目。

测试它

转到 example 目录,您将找到一个 README,说明如何在安全环境中进行测试。

免责声明:我们强烈建议不要在生产环境中运行密集型基准测试。

命令行界面

完整的CLI选项列表,可在 drill --help 下找到

drill 0.8.2
HTTP load testing application written in Rust inspired by Ansible syntax

USAGE:
    drill [FLAGS] [OPTIONS] --benchmark <benchmark>

FLAGS:
    -h, --help                      Prints help information
        --list-tags                 List all benchmark tags
        --list-tasks                List benchmark tasks (executes --tags/--skip-tags filter)
    -n, --nanosec                   Shows statistics in nanoseconds
        --no-check-certificate      Disables SSL certification check. (Not recommended)
    -q, --quiet                     Disables output
        --relaxed-interpolations    Do not panic if an interpolation is not present. (Not recommended)
    -s, --stats                     Shows request statistics
    -V, --version                   Prints version information
    -v, --verbose                   Toggle verbose output

OPTIONS:
    -b, --benchmark <benchmark>    Sets the benchmark file
    -c, --compare <compare>        Sets a compare file
    -r, --report <report>          Sets a report file
        --skip-tags <skip-tags>    Tags to exclude
        --tags <tags>              Tags to include
    -t, --threshold <threshold>    Sets a threshold value in ms amongst the compared file
    -o, --timeout <timeout>        Set timeout in seconds for all requests

路线图

  • 完善和改进插值引擎
  • 添加写入文件支持

捐赠

如果您赞赏在这个项目中做的所有工作,小额捐赠始终受欢迎

"Buy Me A Coffee"

贡献

这个项目最初是一个学习Rust的副项目,所以我相信它充满了错误和需要改进的领域。如果您认为您可以对代码进行调整以使其更好,我将非常欢迎拉取请求。 ;)

依赖关系

~11–28MB
~398K SLoC