📚 Day 08 - 编写自动化测试简介
创建时间:
2023-04-03 03:01 星期一
测试其实就是一个函数,它用来验证非测试代码是否和预期一致
测试函数需要使用 test attribute #[test]
进行标注
attribute 就是一段 Rust 的代码元数据。
我们创建一个新的项目:
cargo new test_project --lib
看到我们的 lib.rs 有代码
pub fn add(left: usize, right: usize) -> usize {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}
我们利用 shell 语句 cargo test
进行运行。
PS Q:\2023-04-01\test_project\src> cargo test
...
test result: ok. 1 passed[表示测试成功]; 0 failed[失败]; 0 ignored[忽略];
0 measured[性能测试]; 0 filtered out[被过滤的测试]; finished in 0.00s
...
测试失败即 panic , 每个测试一个新的线程。主线程看到某个测试的线程 panic 即记录失败。
assert!
当 assert!
宏来自标准库的时候用来确认某个状态是否为 true
, 如果为 false
就 panic
他们都可以传入两个参数 a b
assert_eq!
: 判断 ab 是否相等
assert_ne!
: 判断 ab 是否不相等
无论是 assert!
assert_eq!
assert_ne!
他们都可以追加一个参数也就是提示
今天我们来开发一个类似 cat 的工具 他可以帮助我们从某个文件中搜索一些字符串 他的命令是:
cargo run main.py
他的功能就是在展示 main.py 的字符串。
Step 1: 读取命令行的参数
use std::env;
fn main(){
let arg:Vec<String> = env::args().collect();
//env::args() 可以获得命令行参数 但是他的类型是一个迭代器 collect
// 是将迭代器转换为集合
println!("{:?}", arg);
}
当我们输入指令
cargo run asd 123
时候我们打印了:
["Q:\\2023-03-09\\rustDay01\\target\\debug\\rustDay01.exe", "asd", "123"]
所以我们知道:env::args().collect()
返回的集合中第一个是执行程序的名称 后面的就是所谓的参数.
Step 2: 文件的读取
我们使用库 std::fs
可以对文件进行 IO 操作
use std::env;
use std::fs;
fn main() {
let arg: Vec<String> = env::args().collect(); // 获取 命令行的参数
let filename = &arg[1];
let argment = &arg[2];
let contents = fs::read_to_string(filename).expect(
&format!("无法读取这样的文件 {filename}")
); // 读取文件 可能会出错所以我们要加上except
println!("-----------文件内容读取完毕---------\r\n{}", contents);
}
重构
为了让函数单一职责,我们要对函数进行细节分离
use std::env;
use std::fs;
struct Config{
filename: String,
argument: String
}
impl Config {
fn new(commands : Vec<String> )->Config{
Config { filename: (&commands[1]).to_string(), argument: (&commands[2]).to_string()}
}
}
fn command_line_load() -> Config{
let commands : Vec<String> = env::args().collect();
if commands.len() != 2{
panic!("你需要两个参数 一个是文件名 一个是字符串")
}
Config::new(commands)
}
fn read_file(arg: &Config) -> String{
let filename = &arg.filename;
let argment = &arg.argument;
let contents = fs::read_to_string(filename).expect(&format!("无法读取这样的文件 {filename}")); // 读取文件 可能会出错所以我们要加上except
contents
}
fn main() {
let args = command_line_load();
let contents = read_file(&args);
println!("-----------文件内容读取完毕---------\r\n{}", contents);
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于