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

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

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 回帖 • 3 关注

相关帖子

欢迎来到这里!

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

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