Day 08 - 编写自动化测试 命令行读取 文件 IO 操作 项目开发

本贴最后更新于 726 天前,其中的信息可能已经时移世改

image

img

📚 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); }

  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...