32 个版本 (8 个重大更改)
使用旧的 Rust 2015
0.9.9 | 2018 年 1 月 17 日 |
---|---|
0.9.6 | 2017 年 12 月 25 日 |
0.7.3 | 2017 年 5 月 20 日 |
#443 在 测试 中排名
每月 69 次下载
255KB
330 行

Polish
Polish 正确实施测试驱动开发
入门
安装包
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个日志功能(pass
、fail
、warn
和info
)。这些函数都接受一个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
。
作者
依赖项
约2.5MB
约38K SLoC