#tdd #rust

polish

正确实施测试驱动开发

32 个版本 (8 个重大更改)

使用旧的 Rust 2015

0.9.9 2018 年 1 月 17 日
0.9.6 2017 年 12 月 25 日
0.7.3 2017 年 5 月 20 日

#443测试 中排名

Download history 7/week @ 2024-03-28 1/week @ 2024-04-04

每月 69 次下载

MIT 许可证

255KB
330

Build Status Crates Package Status License: MIT

Polish

Polish 正确实施测试驱动开发

asciicast

入门

安装包

crates.io 包会随着所有主要更改而更新,这意味着您只需在 Cargo.toml 中的 dependencies 部分包含以下内容即可使用它

polish = "*"

* 替换为上面 crates.io 徽章中显示的版本号

但如果您想使用最新版(nightly)的发布,您可以使用 GitHub 包存储库

polish = { git = "https://github.com/alkass/polish", branch = "master" }

编写测试用例

单个测试用例

最简单的测试用例可以采用以下形式

extern crate polish;

use polish::test_case::{TestRunner, TestCaseStatus, TestCase};
use polish::logger::Logger;

fn my_test_case(logger: &mut Logger) -> TestCaseStatus {
  // TODO: Your test case code goes here
  TestCaseStatus::PASSED // Other valid statuses are (FAILED, SKIPPED, and UNKNOWN)
}

fn main() {
  let test_case = TestCase::new("Test Case Title", "Test Case Criteria", Box::new(my_test_case));
  TestRunner::new().run_test(test_case);
}

这会产生以下结果

上述示例可在 此处 找到

您也可以传递一个 Rust 闭包 而不是函数指针,如下所示

extern crate polish;

use polish::test_case::{TestRunner, TestCaseStatus, TestCase};
use polish::logger::Logger;

fn main() {
  let test_case = TestCase::new("Test Case Title", "Test Case Criteria", Box::new(|logger: &mut Logger| -> TestCaseStatus {
    // TODO: Your test case code goes here
    TestCaseStatus::PASSED
  }));
  TestRunner::new().run_test(test_case);
}

上述示例可在 此处 找到

多个测试用例

您可以通过以下方式运行多个测试用例

extern crate polish;

use polish::test_case::{TestRunner, TestCaseStatus, TestCase};
use polish::logger::Logger;

fn main() {
  let mut runner = TestRunner::new();
  runner.run_test(TestCase::new("1st Test Case Title", "Test Case Criteria", Box::new(|logger: &mut Logger| -> TestCaseStatus {
    // TODO: Your test case code goes here
    TestCaseStatus::PASSED
  })));
  runner.run_test(TestCase::new("2nd Test Case Title", "Test Case Criteria", Box::new(|logger: &mut Logger| -> TestCaseStatus {
    // TODO: Your test case code goes here
    TestCaseStatus::PASSED
  })));
  runner.run_test(TestCase::new("3rd Test Case Title", "Test Case Criteria", Box::new(|logger: &mut Logger| -> TestCaseStatus {
    // TODO: Your test case code goes here
    TestCaseStatus::PASSED
  })));
}

但更方便的方法是将您的测试用例的 Vector 传递给 run_tests,如下所示

extern crate polish;

use polish::test_case::{TestRunner, TestCaseStatus, TestCase};
use polish::logger::Logger;

fn main() {
    let my_tests = vec![
      TestCase::new("1st Test Case Title", "1st Test Case Criteria", Box::new(|logger: &mut Logger| -> TestCaseStatus {
        // TODO: Your test case goes here
        TestCaseStatus::PASSED
      })),
      TestCase::new("2nd Test Case Title", "2nd Test Case Criteria", Box::new(|logger: &mut Logger| -> TestCaseStatus {
        // TODO: Your test case goes here
        TestCaseStatus::UNKNOWN
      })),
      TestCase::new("3rd Test Case Title", "3rd Test Case Criteria", Box::new(|logger: &mut Logger| -> TestCaseStatus {
        // TODO: Your test case goes here
        TestCaseStatus::FAILED
      }))];
    TestRunner::new().run_tests(my_tests);
}

这会产生以下结果

上述示例可在 此处 找到

嵌入式测试用例

您可以选择将一组测试用例作为测试对象的组成部分。为此,编写测试用例的一种干净的方法是实现 Testable 特性。以下是一个示例

extern crate polish;

use polish::test_case::{TestRunner, TestCaseStatus, TestCase, Testable};
use polish::logger::Logger;

struct MyTestCase;
impl Testable for MyTestCase {
  fn tests(self) -> Vec<TestCase> {
    vec![
      TestCase::new("Some Title #1", "Testing Criteria", Box::new(|logger: &mut Logger| -> TestCaseStatus {
        // TODO: Your test case goes here
        TestCaseStatus::PASSED
      })),
      TestCase::new("Some Title #2", "Testing Criteria", Box::new(|logger: &mut Logger| -> TestCaseStatus {
      // TODO: Your test case goes here
      TestCaseStatus::SKIPPED
    }))]
  }
}

fn main() {
  TestRunner::new().run_tests_from_class(MyTestCase {});
}

这会产生以下结果

上述示例可在 此处 找到

属性

属性允许您更改测试用例的运行行为。例如,默认情况下,您的 TestRunner 实例将运行所有测试用例,无论是否有任何失败。但是,如果您想更改此行为,则需要明确告诉您的 TestRunner 实例在第一个失败时停止进程。

此功能仍在开发中。一旦功能完成,本文档将更新技术细节。

日志记录

每个测试用例传递的logger对象提供了4个日志功能(passfailwarninfo)。这些函数都接受一个message参数,类型为String,允许您使用format!宏来格式化日志,例如。

logger.info(format!("{} + {} = {}", 1, 2, 1 + 2));
logger.pass(format!("{id}: {message}", id = "alkass", message = "this is a message"));
logger.warn(format!("about to fail"));
logger.fail(format!("failed with err_code: {code}", code = -1));

这会产生以下结果

上述示例可在此处找到。

如果您的测试用例返回状态为UNKNOWN,并且您在测试用例函数内部至少打印了一条fail日志,则您的测试用例结果将被标记为FAILED。否则,您的测试用例将被标记为PASSED

作者

Fadi Hanna Al-Kass

依赖项

约2.5MB
约38K SLoC