4个版本 (2个重大更新)

0.3.1 2024年4月24日
0.3.0 2024年2月13日
0.2.0 2023年9月29日
0.1.0 2023年7月17日

#523 in 命令行工具

Download history 16/week @ 2024-04-09 4/week @ 2024-04-16 120/week @ 2024-04-23 3/week @ 2024-04-30 8/week @ 2024-05-28 1/week @ 2024-06-04

每月372次下载

BSD-2-Clause

17KB
158

tarantool-test

tarantool-test 是一个CLI测试框架,专为基于tarantool的Rust应用程序编写。

tarantool-runner 驱动,它消除了与功能测试相关的巨大样板。

如果您有一个面向tarantool的Rust应用程序,并且您有依赖于tarantool符号的测试,并且您发现自己正在编写自己的测试套件?那么您找到了需要的工具。您只需要编写测试套件的业务逻辑,通过 tarantool-test 宏绑定它,并使用提供的CLI应用程序。

快速查看CLI使用方法

# use default entrypoint:
tarantool-test -p ./target/debug/mypackage.so

# use custom entrypoint(for example, for secondary test suite):
tarantool-test -p ./target/debug/mypackage.so -e custom_entrypoint

如果您想在自己的crate中快速设置测试,请阅读 安装教程 部分。

有关更详细的说明,请参阅 详细信息功能 部分。

安装

tarantool-test 由两部分组成,合并为一个crate

  1. 库,其中包含您必须使用以准备自己的crate进行测试的实用工具;
  2. 二进制实用工具,您安装并运行它就像 cargo test

您可以从 crates.io 安装二进制实用工具: cargo install --features="bin" tarantool-test。请注意,我们激活了 bin 功能来安装二进制文件。 不要 在将 tarantool-test 作为库使用时激活此功能。

您还可以直接从仓库安装二进制实用工具

git clone https://git.picodata.io/picodata/picodata/tarantool-test
cd tarantool-test
cargo install --features="bin" --path tarantool-test

要将库部分添加到项目中,您只需将 tarantool-test 作为依赖项使用: cargo add tarantool-test

教程

您可以在 Makefile 中看到一个使用示例,目标 run-example 执行对 example 包的测试套件,该包位于 example 子目录中。

现在您想在您的包中使用 tarantool-test。以下步骤将使用默认的测试套件:

  1. tarantool-test 添加到您的 Cargo.toml 文件中,作为一个普通依赖项: cargo add tarantool-test;
  2. 确保您的包可以被 tarantool-test 使用。在 Cargo.toml 中包含以下行:
[lib]
crate-type = ["lib", "cdylib"]
  1. 使用 #[tarantool_test::test] 属性宏标记所需的测试。这将允许 tarantool-test 收集并运行它们;
  2. 通过使用 bind_test_suite 宏绑定您要使用的测试套件 - 将此行添加到 lib.rstarantool_test::bind_test_suite!()
  3. 构建您的包: cargo build -p example。检查 ./target/debug 目录以找到您构建的共享对象的实际路径。对于 Linux,它可能被命名为类似 libexample.so,对于 MacOS,它可能被命名为 libexample.dylib
  4. 通过运行以下命令启动您的测试: tarantool-test -p ./debug/tarantool/libexample.so。测试将会执行,您就完成了!不需要清理任何东西。

如果您对上述某些点感到困惑,请检查 example 包或阅读以下更多详细信息。

功能

多个测试套件

您不仅限于单个或默认的测试套件 - 您可以使用任意多的自定义套件,甚至可以将相同的测试套件绑定到多个入口点。重要的是 tarantool-test 二进制文件只能运行单个入口点 - 所以如果您想运行多个入口点,您至少现在需要多次运行 tarantool-test

为了引入新的测试套件,您为某些类型实现 TestSuite trait。然后您决定要将它绑定到哪个入口点,例如 new_test_entrypoint,并将测试套件绑定到它。然后您的设置将如下所示:

struct MyTestSuite;

impl tarantool_test::TestSuite for MyTestSuite {
    fn before_all() {}
    fn after_all() {}
    fn before_each() {}
    fn after_each() {}
}

bind_test_suite!(new_test_entrypoint, MyTestSuite);

然后通过指定您使用的具体入口点运行您的设置: tarantool-test -p ./debug/target/myproject.so -e new_test_entrypoint

您也可以在绑定时省略自定义测试套件的入口点名称,然后它将绑定到默认入口点,其名称为 "default_test_entrypoint":bind_test_suite!(MyTestSuite)

您还可以省略测试套件类型引用,然后将默认测试套件绑定到指定的入口点:bind_test_suite!(new_test_entrypoint)

请注意,默认测试套件已针对 () 实现,因此上面的行与以下行具有相同的效果:bind_test_suite!(new_test_entrypoint, ())

注意:您不能两次使用相同的入口点。例如,以下设置将失败

// DO NOT COMPILE!
bind_test_suite!(first_test_entrypoint);
bind_test_suite!(first_test_entrypoint);

..但您当然可以多次重用测试套件!例如,以下设置可以正常工作

bind_test_suite!(first_test_entrypoint, MyTestSuite);
bind_test_suite!(second_test_entrypoint, MyTestSuite);

覆盖 tarantool 运行器参数

如果您愿意,可以覆盖传递给 tarantool-runner 的某些参数。只需在 -- 后提供它们。

例如,您已经编写了自己的 tarantool 初始化脚本,并希望 tarantool-test 使用它。您可以将它作为参数传递给 tarantool-runner,如下所示:tarantool-test -p my_package.so -e my_entrypoint -- -i my_init_script.lua

然而,存在一些限制:您不能覆盖 -p-e 参数,也不能覆盖输入(位于 -- 之后)。因此,这些用法是不允许的

  1. tarantool-test-p my_package.so-e my_entrypoint-- -e entrypoint
  2. tarantool-test-p my_package.so-e my_entrypoint-- -p package
  3. tarantool-test-p my_package.so-e my_entrypoint-- -- "我的输入"

详细信息

问题和解决方案

问题:积极用于开发 tarantool 应用的 tarantool-module 依赖于 tarantool 符号,因为它本质上是对 tarantool API 的包装。只有当应用程序通过 tarantool 运行时加载时,才会提供 tarantool 符号。因此,为了运行依赖于 tarantool-module 的测试,我们必须在某个 tarantool 运行时中开发和运行测试套件。随着项目数量的增加,这种样板设置从一个项目迁移到另一个项目,保留错误和未记录的行为。

解决方案tarantool-test 引入了一个 CLI 应用程序,该应用程序在 tarantool 环境中运行测试套件。您需要编写的样板代码只有几行来设置您的测试套件(或者如果您不感兴趣于 before_all 或其他回调,可以使用默认的测试套件)。

实现

tarantool-testtarantool-runner 支持。它执行由运行器提供的 tarantool 环境中的测试设置,因此与 tarantool-runner 相关的内容都适用于此处。注意:您不需要自己安装 tarantool-runner - 它是内置的。

目前,tarantool-test 严重依赖于 tarantool-module。具体来说,tarantool_test::test 宏只是 tarantool::test 的重新导出,这可能在将来发生变化。尽管使用 tarantool::test 标记测试也可以正常工作,但我们 不建议 这样做,因为 tarantool_test::test 将来可能会包含特殊功能而被分离出来。

tarantool-test 做了什么:每当您使用 bind_tarantool_test! 宏时,它将生成具有所需入口点名称的 tarantool 程序。新创建的入口点反序列化输入并使用指定的测试套件启动测试。

二进制工具简单地封装了 tarantool-runner,引入了更清晰的接口。

贡献

如果您有问题、问题或建议,请随时直接联系我 f.telnov@picodata.io 或在 telegram

您也可以加入 Picodata 聊天室 telegram 并在这里用您的问题@我。我们很高兴在那里见到您!

依赖项

~7–17MB
~235K SLoC