当前位置: 首页 > news >正文

Rust 软件测试

Rust 第18节 软件测试

测试已写的函数
在创建每一个lib crate时,rust都会自动生产一个测试 mod;名字为tests;
tests mod 被属性 #[cfg(test)] 修饰,用于测试;
在mod 内,需要在函数头上加属性 #[test]进行修饰,让其变为测试函数


pub fn add(left: usize, right: usize) -> usize {left + right
}mod tests {use super::*;#[test]fn test1() {let result = add(2, 2);assert_eq!(result, 4);}
}

进行测试

运行 cargo test 命令运行所有的测试函数;
当使用 cargo test 命令时,Rust会构建一个 Test Runner 可执行文件,他会运行标注了 test 的 函数,并报告其运行是否成功。
主线程监视每一个测试函数的返回结果,如果报错,就认为测试失败
在创建库项目时,会自动创建测试函数 ;创建库项目命令: cargo new name --lib

assert!()、assert_eq!() 和 assert_nq!() 宏

断言 宏 ; assert!(); 检查状态是否为 true ;
true 测试通过;否则,调用 painc! 测试失败

assert_eq!() 判断两个数是否相等
assert_ne!() 判断两个数是不是不等
这两个宏,当断言失败时都会打出两个参数的值;
这三个宏都可以添加自定义信息,当出错时会打印出来;在固定的参数后边,有一个自定义参数

    #[test]fn test_eque() {assert!(my_eque(12, 10),"结果不对");}#[test]fn add_two_test(){assert_eq!(4,add_two(2));}#[test]fn add_two_test_v2(){assert_ne!(5,add_two(2));}

对于panic进行测试

在特定情况下测试是否会发生panic
加属性 should_panic;如果发生painc ,测试通过,没有发生painc,测试不通过

pub fn get_value(value : i32) -> i32 {if value > 500 {panic!("数据过大");}value
}...#[test]#[should_panic]fn get_value_test() {get_value(1000);}
...

让 should_panic 更加精准;
单纯的should_panic 只能检测是否发生 panic;但是不确定是否为我们期待的painc;
可以加上 expected ,跟上字符串;进行panic 匹配

pub fn value_config(value : i32) {if value > 100 {panic!("value is more 100");} if value < 0 {panic!("value is less 0");}
}
...#[test]#[should_panic(expected = "value is more 100")]fn value_config_test() {value_config(120);}
...

Result 作为测试结果

除了让测试程序painc;还可以通过测试函数的返回值来进行判断测试结果。
需要测试函数的返回值为Restul类型;
返回Ok;测试通过; 返回Err();测试不通过

    #[test]fn test_result() -> Result<(),String> {if 2 + 2 == 4 {Ok(())} else {Err("测试执行失败".to_string())}}

cargo test 命令

当cargo test 不加参数时,会进行默认行为:
1、并行运行
2、所有测试
3、正常时捕获(屏蔽)所有输出;异常时才会显示

它的参数
分为 
1) cargo test的参数
2) cargo test -- 的参数;--后的参数,后边有空格;是给测试生成的二进制文件用的cargo test --help; 显示1 可用参数cargo test -- --help 显示 --后可用参数并行测试时,需要保证测试项之间没有依赖,且没用共用的全局变量或环境变量等;指定并行线程个数 cargo test -- --test-threads=1显示函数执行时的输出cargo test -- --show-output按测试的名称运行测试单个测试cargo test 测试函数名参数只能传一个
多个测试参数写 测试名的一部分 或者模块名

忽略某个测试项

    测试项加属性 ignore默认运行cargo test 时,就不会运行该测试项;也可以单独运行 ignore 类型的测试项cargo test -- --ignored
    #[test]#[ignore]fn test_ignore() {assert_eq!(10,100);}

测试的分类

1) 单元测试

上边均为集成测试的例子小,专注某一段代码;对某一段代码进行隔离测试一般在代码相同路径,建立 tests 模块;并加属性标注 #[cfg(test)]这样只有在执行cargo test 时才会编译和运行代码;而一般的cargo run 不会进行编译运行

单元测试可以测试私有函数

fn fun_2(a : i32,b : i32) -> i32 {a + b
}// 私有函数#[test]fn test_p() {assert_eq!(2,fun_2(1, 1));}

2) 集成测试

    测试代码不在同一路径下,不用属性标注 #[cfg(test)]完全位于被测试库外边只能调用测试库的外部接口创建tests目录每一个单独的测试文件都是一个单独的crate
use adder; //导入要测试的lib #[test]
fn test_v1() {assert_eq!(4,adder::add(2, 2));}

tests 目录会被单独处理;
只有运行cargo test 时,才会编译运行

    运行指定的集成测试; cargo test 函数名运行某个文件下所有集成测试      cargo test --test 文件名由于每个文件都被作为单独的crate,所以各个文件之间数据不共享;如果想用不被当做单独的crate进行测试,只需要再建一个目录,然后在该目录下新建文件即可;新的子目录不会被rust当做测试的crate,不会在 cargo test 中调用;单元测试的crate都可以访问这个文件;作为数据共享

binary crate 的集成测试

    如果只有 src/main.rs;没有 src/lib.rs则,不能在tests下创建集成测试;无法将main.rs 中的函数导入作用域只有 library crate 才能暴露函数给其他crate用binary crate 意味着独立运行

相关文章:

Rust 软件测试

Rust 第18节 软件测试 测试已写的函数 在创建每一个lib crate时&#xff0c;rust都会自动生产一个测试 mod;名字为tests; tests mod 被属性 #[cfg(test)] 修饰&#xff0c;用于测试&#xff1b; 在mod 内&#xff0c;需要在函数头上加属性 #[test]进行修饰&#xff0c;让其变为…...

win11下配置visual studio 2022+PCL1.13.1

第一部分&#xff1a;visual studio2022 安装 vs官网网址如下&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 第一步&#xff1a;我们打开官网链接&#xff0c;按如下操作点击下载免费版本的exe文件 第二步&#xff1a;打开下载目录下的安装文件进行安装&#…...

智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.…...

【分享】4个方法打开PDF文件

PDF是很多人工作中经常使用的电子文档格式&#xff0c;但是可能有些刚接触的小伙伴不知道用什么工具来打开PDF文件&#xff0c;今天小编就来分享一下4种常用的工具。 1. 使用浏览器 只要有电脑基本都会安装一到两款浏览器&#xff0c;其实浏览器也可以用来打开PDF文件。 只需…...

React 调试

React 调试 console 调试 console.log console.info console.warn console.error console.time() & console.timeEnd() console.count() debugger调试 chrome断点调试 chrome条件断点 HTML节点复制 选中节点&#xff0c;使用 $0复制 JavaScript对象复制 copy…...

List 流的使用

摘要 本文将介绍在 Java 1.8 中对 List 进行流操作的使用方法。引入的 java.util.stream 包为开发者提供了一种更为便捷和强大的方式来处理集合数据。通过使用流&#xff0c;我们能够以声明性的方式进行集合操作&#xff0c;减少了样板代码&#xff0c;提高了代码的可读性和可…...

设计模式:单例模式(使用c++分别实现饿汉式单例、带双重检查锁定机制的懒汉式单例以及IoDH技术的单例)

单例模式 引言正文1. 饿汉式单例2. 带双重检查锁定机制的懒汉式单例3. IoDH技术的单例 结论优点饿汉式单例带双重检查锁定机制的懒汉式单例IoDH技术的单例 缺点饿汉式单例带双重检查锁定机制的懒汉式单例IoDH技术的单例 引言 在软件开发中&#xff0c;单例模式是一种很常用的设…...

[编程相关]正则表达式Regex语法

--目录-- 0. 前言1. 正则语法2. 正则搜索语法&#xff08;1&#xff09;字符集 Character_Classes&#xff08;2&#xff09;锚定符 Anchors&#xff08;3&#xff09;计数 Quantifiers&#xff08;4&#xff09;分组与索引 Group_And_Reference&#xff08;5&#xff09;周围 …...

axios实例配置和使用

一.vite项目中引入axios 1.1.安装axios pnpm add axios --save 二.配置axios实例 2.1实例配置 import axios from ‘axios’ import router from ‘/router’ const instance axios.create({ baseURL:“http://127.0.0.1:8080”, timeout:10*1000, //最长响应时间 }) instan…...

uni-app 工程目录结构介绍

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

YOLOv8改进 | 主干篇 | 利用SENetV2改进网络结构 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫)&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何…...

TUP实现一对一聊天

package TCP; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * 发送消息线程 */ class Send ext…...

Kafka设计原理详解

Kafka核心总控制器 (Controller) 在Kafka集群中&#xff0c;通常会有一个或多个broker&#xff0c;其中一个会被选举为控制器 (Kafka Controller)&#xff0c;其主要职责是管理整个集群中所有分区和副本的状态。具体来说&#xff1a; 当某个分区的leader副本出现故障时&#…...

光耦继电器

光耦继电器(光电继电器) AQW282SX 282SZ 280SX 280SZ 284SX 284SZ 212S 212SX 21 2SZ 文章目录 光耦继电器(光电继电器)前言一、光耦继电器是什么二、光耦继电器的类型三、光电耦合器的应用总结前言 光耦继电器在工业控制、通讯、医疗设备、家电及汽车电子等领域得到广泛应…...

【C++练级之路】【Lv.5】动态内存管理(都2023年了,不会有人还不知道new吧?)

目录 一、C/C内存分布二、new和delete的使用方式2.1 C语言内存管理2.2 C内存管理2.2.1 new和delete操作内置类型2.2.2 new和delete操作自定义类型 三、new和delete的底层原理3.1 operator new与operator delete函数3.2 原理总结3.2.1 内置类型3.2.2 自定义类型 四、定位new表达…...

2016年第五届数学建模国际赛小美赛A题臭氧消耗预测解题全过程文档及程序

2016年第五届数学建模国际赛小美赛 A题 臭氧消耗预测 原题再现&#xff1a; 臭氧消耗包括自1970年代后期以来观察到的若干现象&#xff1a;地球平流层&#xff08;臭氧层&#xff09;臭氧总量稳步下降&#xff0c;以及地球极地附近平流层臭氧&#xff08;称为臭氧空洞&#x…...

springMVC-与spring整合

一、基本介绍 在项目开发中&#xff0c;spring管理的 Service和 Respository&#xff0c;SrpingMVC管理 Controller和ControllerAdvice,分工明确 当我们同时配置application.xml, springDispatcherServlet-servlet.xml , 那么注解的对象会被创建两次&#xff0c; 故…...

【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调双向队列 二叉树 题目 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动…...

如何使用树莓派Bookworm系统中配置网络的新方法NetworkManager

树莓派在 10 月新出的 Bookworm 版本系统中&#xff0c;将使用多年的 dhcpcd 换成了 NetworkManager&#xff08;以前是在rasp-config中可选&#xff09;&#xff0c;这是因为 Raspberry Pi OS 使用的是 Debian 内核&#xff08;和 Ubuntu 一样&#xff09;&#xff0c;所以树莓…...

恶意软件分析沙箱在网络安全策略中处于什么位置?

恶意软件分析沙箱提供了一种全面的恶意软件分析方法&#xff0c;包括静态和动态技术。这种全面的评估可以更全面地了解恶意软件的功能和潜在影响。然而&#xff0c;许多组织在确定在其安全基础设施中实施沙箱的最有效方法方面面临挑战。让我们看一下可以有效利用沙盒解决方案的…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...