1 个不稳定版本

0.1.0 2020年6月7日

#1570 in 文本处理

每月下载 22次

ISC许可证

11KB
173

platina

Build Status

简单的参数化金测试。

金文件是测试的一种强大方式:它们使将测试与测试数据分离变得方便。然而,由于大多数金测试库将单个测试文件视为一个案例,这可能会导致一些不便。此库提供了一种通过简单的基于字符串的API参数化金测试的方法。

例如,假设我们有一个用于计算字符串之间levenshtein距离的库。通常测试会被写成这样

#[test]
fn test1() {
  assert_eq!(lev_dist("a", "b"), 1);
}

#[test]
fn test2() {
  assert_eq!(lev_dist("c", "d"), 1);
}

虽然这并不糟糕,但大多数真实世界的测试场景需要更多的设置。在测试中反复重复相同的代码行有时会感到非常沮丧。更糟糕的是,当你发现代码中的错误并需要手动更新所有测试答案时(当你感觉这可以自动化时),会发生什么。这就是参数化金测试的用武之地。

我们可以用platina和以下数据文件来表示我们的测试

[case1]
[input1]
a
----------
[input2]
b
----------
[output]
1
----------
==========

[case1]
[input1]
c
----------
[input2]
d
----------
[output]
1
----------
==========

然后我们可以这样编写测试

struct LevTester;

impl platina::Testable for LevTester {
    fn run_testcase(&mut self, case: &mut TestCase) {
       let input1 = case.get_param("input1").unwrap();
       let input2 = case.get_param("input2").unwrap();
       case.compare_and_update_param("output",
                                     format!("{}", lev_dist(input1, input2)));
    }
}

#[test]
fn test_diff() {
  let mut t = LevTester;
  let mut f = platina::TestFile("test.txt").run_tests(&mut t).unwrap();
}


#[test]
#[ignore]
fn test_update() {
  let mut t = LevTester;
  let mut f = platina::TestFile("test.txt").run_tests_and_update(&mut t).unwrap();
}

现在要更新你的测试,你只需要运行 cargo test -- --ignored

这种场景可能感觉像是为做简单的事情而做了很多工作,但是当你需要传递更复杂的输入、标志等到你的测试设置中,并且突然需要调整输出时,这种测试类型是无价的。

无运行时依赖