1 个不稳定版本

0.1.0 2019年10月22日

#341测试

MIT/Apache

25KB
406

Monarch

Monarch是一个用于Rust中形态测试的简约实用工具。关于形态测试的概述和一些示例,请参阅Hillel Wayne的出色博客文章

Monarch目前仍在实验阶段,因此API目前可能随我的意愿而变化。

形态测试

使用基本测试,您检查特定输入是否产生特定、预期的输出。

fn double(x: i32) -> i32 {
    2 * x
}

#[test]
fn test_double() {
    let doubled = double(5);
    assert_eq!(doubled, 10);  // We already know what "doubled" should be!
}

这些测试可以快速且易于编写,但它们并不总是提供良好的测试覆盖率,因为责任在于开发者预测哪些输入会揭示错误。此外,测试之间可能会出现大量重复的代码,这些测试执行的操作具有略微不同的输入。

形态测试的工作方式不同。当您编写形态测试时,您提供一些信息

  • 一个初始输入
  • 转换该输入的方式
  • 将输入转换为输出的操作
  • 原始输入的输出和转换输入之间应满足的关系

首先,从原始输入计算一个输出。然后,对每种可能的转换组合计算一个新的、转换后的输入,并为每个这些输入生成一个输出。最后,检查您的关联在“原始”输出和每个“转换”输出之间是否成立。

这听起来可能很复杂,但转换和关系可以非常简单。更重要的是,您提供的转换越多,生成的输入种类越广泛,从这个测试中获得覆盖率也越好。

让我们快速举一个例子。

示例

假设我正在开发一个Web应用,该应用根据用户的查询返回一些搜索结果。对于我的关系,我将要求我得到与原始输入相同数量的搜索结果。

#[test]
fn test_search_results() {
    let mut runner: MetamorphicTestRunner<MyHTTPRequest, Vec<SearchResult>> = MetamorphicTestRunner::new();
    //                                    ^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^
    //                                    input type     output type
    let original_input = MyHTTPRequest::new();
    runner.set_input(original_input.clone());
    runner.set_relation(|&original_output, &transformed_output| {
        original_output.len() == transformed_output.len()
    });
}

接下来的任务是想出一些方法来调整输入,这些方法不应该影响我返回的总搜索结果数量。一些示例包括更改结果排序顺序、更改每页结果数量等。

runner.add_transformation(|&mut request| {
    request.sort_order = ... // Sort by some parameter
});
runner.add_transformation(|&mut request| {
    request.page_results = ... // Some number of results per page
});

最后一件要做的事情是告诉测试运行器对每个请求执行什么操作以生成输出(例如,将其发送到服务器),并运行测试。

runner.set_operation(|&request| {
    // send the request
});
runner.run().unwrap();

测试运行器将输入通过所有提供的转换组合进行运行,如果关系不满足则引发恐慌。

错误报告

错误报告的最终格式尚未确定。目前,测试运行器将识别哪个测试用例失败(哪个转换输入导致了失败),但这是作为 MonarchError::TestFailure(Reason) 返回的,其中 Reason 有一个 message 方法,它将返回一个 String 解释失败原因。

许可证

根据以下任一许可证授权:

由您选择。

贡献

除非您明确说明,否则您提交给工作内容的任何有意贡献,根据 Apache-2.0 许可证定义,应按上述方式双重许可,无需附加条款或条件。

常见问题解答

  • 为什么是“monarch”?
    • 形态测试 -> 形态变化 -> 蝴蝶 -> 君主
  • 我应该使用这个吗?
    • 将来有一天,但不是今天
  • 你在寻找贡献者吗?
    • 一旦我启动了,贡献将会很棒!

无运行时依赖