rust学习十二、测试

news/2024/11/27 19:28:24/文章来源:https://www.cnblogs.com/lzfhope/p/18570723

测试从来不是一件简单的事情,我本人深有体会!

书本作者引用了很重要的话:软件测试是证明 bug 存在的有效方法,而证明其不存在时则显得令人绝望的不足  (Edsger W. Dijkstra 在其 1972 年的文章【谦卑的程序员】(“The Humble Programmer”))

注:Edsger W. Dijkstra在1972获得图灵奖

 

本人学过一些语言,看过不少类似书籍,但是在书籍中间部分就让入门者注意测试,的确是挺特别的。

这充分地体现了作者对测试的重视。

既然专家都这么注意测试,我辈自当也需要格外注意。Rust由于其语言特性,应该是需要更加重视测试!

 

把测试当做无足轻重,或者认为不需要什么技术水平的,都是不专业的行为!it新人或者一些水平有问题的常常会有这个方面的看法!

本章节的内容比较多,但只要按照作者的例子作一遍,那么基本能够掌握!

rust测试需要用到cargo test命令,这个命令有许多选项,部分会在本章节中提到,还有许多是没有提到的。

把test命令的各个选项都熟悉下,也需要耗费不少时间!

 

本文所涉及到内容都是入门级别的,属于基本的粗浅的。但是掌握这些基本上已经可以做需要的测试了。

至于测试技巧,是另外一门学问了,和rust没有关系。

 

一、编写单元测试代码

本例模仿书上的,在库中编写单元测试代码。

按照惯例:创建一个tests模块,并在tests下编写测试代码

关键词:

#[cfg(test)] -- 告诉编译器运行的时候不要编辑

#[test]   --  告诉编译器这是一个测试单元

#[should_panic] - 告诉测试程序,如果不出意外就是失败

函数: assert_eq!,assert_ne!,assert!

二、控制测试

关键问题:

  1. 如何控制并发
  2. 如何控制需要测试的
  3. 如何忽略,或者如何只测试被标记为忽略的

控制并发

默认是多线程,但也可以通过一下方式指定需要的线程

-- --test-threads=n

控制测试目标

cargo test xxx ,xxx是测试的名称,即单元测试方法的名称.属于模糊匹配
cargo test --test xxx 指定集成测试的文件名,模糊匹配

忽略

#[ingore] -- 用于标记测试方法为被忽略

cargo test -- --ignored 只测试被忽略的

三、测试的组织结构

如何做单元测试

固定的规范-- 使用#[cfg(test)] 标记测试代码,并使用#[test]标记测试函数。其次模块通常也命名位tests

如何做集成测试

创建和src同i的目录tests,在tests下放任意个rs,每个rs都是一个单元包

每个单元包都可以应用tests的公共模块。

 

集成测试中的公共模块

使用老的模块定义规范:目录+mod.rs

如上图,haha模块在tests/haha下,其下有mod.rs

 

四、完整测试代码和示例

这个例子是基于一个库项目,有三个文件:

src/lib.rs 库 ,单元测试文件

tests/itest1.rs 集成测试文件之一

tests/haha/mod.rs 集成测试的模块haha

lib.rs

pub fn add(left: u64, right: u64) -> u64 {left + right
}#[cfg(test)]
mod tests {use super::add;//测试宏 assert_eq!
    #[test]fn it_works1() {let result = add(2, 2);assert_eq!(result, 4);}//测试宏 assert!.并测试自定义的错误信息
    #[test]fn it_works2() {let result = add(1, 3);assert!(result==5,"1+3={},而不是5",result);}//测试宏 assert_ne!
    #[test]fn it_works3() {let result = add(1, 4);println!("这一句将在--show-output 的时候打印:1+4={}",result);assert_ne!(result,6);}//测试fail! 
    #[test]#[should_panic]fn it_fail() {//fail!("this test will fail");let result = add(1, 4);assert_eq!(result,6);}#[test]#[should_panic]fn access_outof_range() {let mut v = vec![1,2];  v[2] = 3;}    //如果返回Err,则测试失败
    #[test]fn test_result()->Result<(),String> {if 1==2 {Ok(())} else {Err("error".to_string())}}#[test]#[ignore]fn test_ignore() {assert_eq!(1,2, "1!={}",2);}
}

 

itest1.rs

use lzfmath::*;
mod haha;#[test]
fn itest_add() {haha::haha();assert_eq!(add(1, 2), 3);
}

 

mod.rs

pub fn haha(){println!("哈哈!");
}

 

 

4.1标准单元测试结果

4.2设置并发和查看标准输出

 

4.3只测试it开头的单元测试

 

4.4只测试被忽略的

 

4.5集成测试+集成测试模块

 

五、小结

   代码测试主要有三个部分内容:
   1.如何编写测试
     主要涉及到几个编译标记/指令和几个函数/宏,Result
     编译指令
       a.#[cfg(test)]     一个条件编译指令,用于指定紧随其后的代码块或项(如函数、模块等)仅在测试环境下编译
       b.#[test]          函数测试标记,cargo的测试的时候,会找出有这些标记的函数,并执行测试
       c.#[should_panic]  函数测试标记,标记的函数会期待panic,如果函数没有panic就会测试失败。
     函数
       a.assert!      断定表达式为真。如果为真就是成功
       b.assert_eq!   断定两个值是否相等。如果相等就是成功
       c.assert_ne!   断定两个值是否不相等。如果不相等就是成功
       d.assert_matches! 断定表达式匹配模式。如果匹配就是成功.特别适用于枚举和结构等类型
       f.fail!        断定测试失败,并打印出字符串
       assert类函数,可以在标准参数之外再传递其它参数,比如失败时打印的字符串。rust会调用格式化字符串,并打印出参数。
     Result类型
       a.Result<T,E>  枚举类型,表示成功或失败。T为成功时的类型,E为错误类型
   2.如何控制测试
     默认的测试行为
       a.cargo test 在测试模式下编译代码并运行生成的测试二进制文件
       b.cargo test 产生的二进制文件的默认行为是并发运行所有的测试,并截获测试运行过程中产生的输出,阻止它们被显示出来,使得阅读测试结果相关的内容变得更容易
     
     如何控制(控制cargo test的行为)
       a.控制并发  -- --test-threads=1  只允许一个线程运行测试
       b.控制输出  -- --show-output   显示测试运行过程中产生的输出。这样可以输出通过部分的打印输出
       c.控制测试   <name> 只运行指定名称的测试 。注意这是模糊匹配   
                   add  测试包含add的测试。即cargo test add
                  --test xxx 指定具体文件名  cargo test --test itest1    测试文件名带itest1的测试
     忽略项目
       a.#[ignore]   在代码中标记需要忽略的内容
       b.测试被忽略项目  -- --ignored    ,这样只会测试被标记为#[ignore]的内容
 
     示例
       cargo test result  -- --test-threads=2  --show-output   在开启两个线程的情况下,测试包含result的测试,同时那些产生的输出也会显示出来
       cargo test -- --ignored  测试被标记为#[ignore]的内容
   3.测试的组织结构  
     如何作单元测试
       a.固定的规范-- 使用#[cfg(test)] 标记测试代码,并使用#[test]标记测试函数。其次模块通常也命名位tests
       
     如何作集成测试
       a.在项目下创建tests目录,然后在该目录下创建测试文件  。注意tests目录和src是同级的. 这个目录应该是可以是别的,也许可以通过test的选项来指定
       b.在测试目录tests可以创建任意多个文件,cargo会把每一个文件当做一个单元包进行测试
       c.运行 cargo test即可,但是这样会把单元测试一起执行。
       d.通过指定集成测试文件的方式,可以只运行指定的测试文件 cargo test --test itest1.也可以通过指定测试名称的方式
         carggo test xxx   
       综合起来,cargo test --test xxx 也许是更好的选择。
     
     集成测试的公共模块
       a.必须先创建一个目录,假设是haha
       b.在haha下创建mod.rs文件
       c.tests下的其它rs可以调用haha,并且haha不会被测试。haha的内容只会被集成测试代码调用。
       也就是说集成测试目录下的模块组织方式,反而使用的是旧的模块定义规范:基于目录+mod.rs
 
     为什么很多项目既有src/main.rs,src/lib.rs
       这都是为了方便测试。
       引入在集成测试中导入src/main.rs的模块并不容易。 main.rs是一个二进制文件,而lib.rs是库。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842443.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NOIP2024加赛8

如此状态,如何NOIP状态很不好,恼了。虚拟机太卡了,根本交不上去。 flandre 发现选取的肯定是从大到小排序后的一个后缀,然后就做完了,时间复杂度\(O(n\log n)\)。点此查看代码 #include<bits/stdc++.h> using namespace std; #define rep(i,s,t,p) for(int i = s;i …

根据条件显示不同背景色

1. 概述1.1 问题描述 在 FineReport 中制作报表时,经常遇到在满足一定条件下「单元格/行/列」需要显示为不同的背景色,那么该如何实现呢? 1.2 解决思路 可以通过添加「条件属性>背景」来实现。 设置「当前格子/当前行/当前列」的原理一样,本文以「当前格子」和「当前行」…

Linux下打包Qt应用程序

linux下打包应用程序 非常复杂 接下来一步一步实现 第一步:下载linuxdeployqt程序 我已经保存在了百度网盘,记住qt5用老一些的版本 第二步:下载好后重命名为linuxdeployqt好用一点 然后将其移动到/usr/local/bin目录下 并且授权 记住 一定要授权 检查是否成功 sudo lin…

Linux ubuntu命令行安装图形界面

前言全局说明服务器上默认是没有图形界面的,但是需要时,只能单独安装。或者安装时没有装图形界面,后期又用到。一、说明 环境: Ubuntu 18.04.6 LTS (Linux qt-vm 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux)…

H5-6 文本

<em>  定义着重文字<b>   定义粗体文本<i>   定义斜体字<strong> 定义加重语气 <del>  定义删除字<span> 元素没有特定的含义  常用文本标签和段落是不同的,段落代表一段文本,而文本标签一般表示文本词汇 可以嵌套在&l…

app实战运用

一、打开模拟器 二、cmd中打开dos命令 adb connect 127.0.0.1:62001 三、安装测试包 adb install D:\app\baiduyuedu_3760.apk 四、打开appium五、( 定位元素没有xpath的就删除原有uiautomatorviewer.bat,替换成新的) 开始定位,定位插件案例1: from appium import…

WebRTC 创建者刚加入了 OpenAI,他是如何思考语音 AI 的未来?

WebRTC 的早期创建者之一,Fixie.ai 联合创始人兼 CTO Justin Uberti 近日宣布加入 OpenAI,领导实时 AI (Real-Time AI)项目的开发。Uberti 在 2011 年于 Google 参与创建并领导了 WebRTC 项目,并推动其成为 W3C 和 IETF 标准。从最早参与 AOL Instant Messenger(AIM)开始…

win10 查看 特定网络 详细信息

使用以下命令查看某个网络的详细信息(替换<NetworkName>为实际的网络名称):TEXTnetsh wlan show profile name="<NetworkName>" key=clear

#20222309 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息: DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理位置 PS:使用whois、dig、nslookup、traceroute、以及各类在线和离线工…

web js 逆向小记, x-sourcemap特性

最近在搞事情 发现了一个神奇的现象,js能正确执行,但是当准备调试时,显示无法加载。 这个刷新的我的认知。如图: 这些方法都能正确执行,当你准备调试这个go方法时,显示无法加载: ================================= 搞了这么久的开发和逆向,这还是第一次遇到, 真牛逼…

Qt中字节与浮点数互转

1 十六进制字节数转浮点数 注意:使用此函数时传入的参数格式 例如QString str1 = "068400040002847D";字符串中间没有空格 float MainWindow::hexBytesToFloat(const QString &hexString) {QByteArray byteArray; // 创建一个QByteArray对象byteArrayfor (int i…

H5-4 图片路径详解

绝对路径 相对路径 网络路径 1、绝对路径:电脑的盘符储存与访问的具体地址D:\qianduan\qianduan1.jpg <img src="D:\qianduan\qianduan1.jpg" > 2、相对路径:两者相对的关系,两者在同一路径下可以访问子集关系: /父级关系:../同级关系:./ (可以省略) …