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 命令行工具
每月372次下载
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
- 库,其中包含您必须使用以准备自己的crate进行测试的实用工具;
- 二进制实用工具,您安装并运行它就像
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
。以下步骤将使用默认的测试套件:
- 将
tarantool-test
添加到您的Cargo.toml
文件中,作为一个普通依赖项:cargo add tarantool-test
; - 确保您的包可以被
tarantool-test
使用。在Cargo.toml
中包含以下行:
[lib]
crate-type = ["lib", "cdylib"]
- 使用
#[tarantool_test::test]
属性宏标记所需的测试。这将允许tarantool-test
收集并运行它们; - 通过使用
bind_test_suite
宏绑定您要使用的测试套件 - 将此行添加到lib.rs
:tarantool_test::bind_test_suite!()
- 构建您的包:
cargo build -p example
。检查./target/debug
目录以找到您构建的共享对象的实际路径。对于 Linux,它可能被命名为类似libexample.so
,对于 MacOS,它可能被命名为libexample.dylib
。 - 通过运行以下命令启动您的测试:
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
参数,也不能覆盖输入(位于 --
之后)。因此,这些用法是不允许的
tarantool-test-p my_package.so-e my_entrypoint-- -e entrypoint
tarantool-test-p my_package.so-e my_entrypoint-- -p package
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-test
由 tarantool-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