1 个不稳定版本

0.1.0 2024 年 4 月 21 日

#283测试

MIT 许可证

49KB
1K SLoC

anytest 代码检查 测试

在终端运行任何测试。

许多测试框架允许运行单个测试,但它们都使用不同的格式。大多数都需要构建相当复杂的查询,这些查询难以输入和记忆。此工具旨在通过仅指定文件和行号(遵循 RSpec/ExUnit/ESpec 的方式)来提供运行单个测试的统一方式。该工具深受出色的 vim-test 插件的启发。

目前,以下测试框架受到支持(更多即将推出)

语言 测试框架 标识符
Elixir ESpec, ExUnit espec, exunit
JavaScript Jest jest
Python pytest pytest
Ruby RSpec rspec
Rust Cargotest cargotest
Zig Zigtest zigtest

您可以随时 提交一个有关测试框架的问题,因为那些测试框架将首先添加。

安装

目前,anytest 通过 crates.io 分发,因此需要 Rust 来安装它。要安装 Rust,请遵循 官方 Rust 网站 上的说明。

要从源代码构建 anytest,请使用

cargo install anytest

用法

运行 anytest <文件>:<> 就这么简单

anytest tests/test_rust.rs:10

该工具支持以下范围

  • suite - 运行整个测试套件
  • file - 运行文件中的所有测试
  • line - 运行指定行上的测试

当路径指定行号时(例如 anytest tests/test_rust.rs:10),作用域自动设置为 line。当路径未指定行号时(例如 anytest tests/test_rust.rs),作用域自动设置为 file

可以使用 --scope/-s 标志显式设置作用域

anytest tests/test_rust.rs:10 -s file

默认情况下,anytest 使用当前工作目录作为根目录。可以使用 --root/-r 标志显式设置根目录

anytest anytest-cli/tests/test_rust.rs:10 -r anytest-cli

指定根目录后,测试路径可以是相对于根目录的(例如 anytest tests/test_rust.rs:10 -r anytest-cli)或相对于当前工作目录的(例如 anytest anytest-cli/tests/test_rust.rs:10 -r anytest-cli)。

要使用干运行模式运行工具,请使用 --dry-run/ 标志

anytest tests/test_rust.rs:10 --dry-run

要查看所有可用选项的列表,请运行

anytest --help

与 Zed 一起使用

尽管 anytest 是一个独立工具,但其主要驱动力是与其一起使用 Zed。目前,Zed 的扩展支持有限,因此将 anytest 与 Zed 集成的唯一方法是使用 Zed 任务

仓库中包含一个 示例 tasks.json 文件,可以使用以下命令将其复制到 Zed 配置目录:

wget https://raw.githubusercontent.com/timfjord/anytest-cli/main/examples/tasks.json -O ~/.config/zed/tasks.json -nc

请注意,上述命令不会覆盖现有的 tasks.json 文件。要覆盖现有文件,请移除 -nc 标志。

设置好任务后,可以从命令面板中选择 task: spawn 命令,或添加快捷键来运行测试。

[
  {
    "context": "Workspace",
    "bindings": {
      "cmd-j cmd-s": ["task::Spawn", { "task_name": "anytest: test suite" }],
      "cmd-j cmd-f": ["task::Spawn", { "task_name": "anytest: test file" }],
      "cmd-j cmd-l": ["task::Spawn", { "task_name": "anytest: test line" }]
    }
  }
]

与其他 crate 一起使用

anytest 还可以作为库 crate 使用,在其他 Rust 项目中。

目前,它公开了用于给定上下文的 build_command 函数,该函数构建了一个 std::process::Command。有关更多详细信息,请参阅 tests/test_api.rs

use anytest::{Context, Scope};

let context = Context::new(
    Some("tests/fixtures/cargotest/crate"),
    "tests/integration_test.rs",
    Some(3),
    Some(Scope::Line),
)
.unwrap();
let command = anytest::build_command(&context).unwrap();

assert_eq!(command.get_program(), "cargo");
assert_eq!(
    command
        .get_args()
        .map(|arg| arg.to_str().unwrap())
        .collect::<Vec<_>>(),
    vec![
        "test",
        "--test",
        "integration_test",
        "it_adds_two",
        "--",
        "--exact"
    ]
);

贡献

添加新的测试框架最简单的方法是,在 AnyTest 仓库vim-test 仓库 中找到它,并尝试进行适配。还需要对测试框架进行测试。测试和固定值可以在 AnyTest 仓库vim-test 仓库 中找到。

致谢

anytest 严重受到 vim-test 插件的启发,因此所有的赞誉都归功于这个出色的 Vim 插件的作者和维护者。

依赖关系

~5–15MB
~205K SLoC