Rust之编写自动化测试

1、测试函数的构成:

在最简单的情形下,Rust中的测试就是一个标注有test属性的函数。属性 (attribute)是一种用于修饰Rust代码的元数据。只需要将#[test]添加到关键字fn的上一行便可以将函数转变为测试函数。当测试编写完成后,我们可以使用cargo test命令来运行测试。这个命令会构建并执行一个用于测试的可执行文件,该文件在执行的过程中会逐一调用所有标注了test属性的函数,并生成统计测试运行成功或失败的相关报告。

2、使用assert! 宏检查结果:

assert! 宏由标准库提供,它可以确保测试中某些条件的值为true。assert! 宏可以接收一个能够被计算为布尔类型的值作为参数。当这个值为true时,assert! 宏什么都不用做并正常通过测试。而当值为false时,assert! 宏就会调用panic! 宏,进而导致测试失败。

3、使用assert_eq! 宏和assert_ne! 宏判断相等性:

标准库中专门提供了一对可以简化编程的宏 :assert_eq! assert_ne!。这两个宏分别用于比较并断言两个参数相等或不相等。在断言失败时,它们还可以自动打印出两个参数的值,从而方便我们观察测试失败的原因。

4、使用should_panic检查panic:

为测试函数添加一个额外的新属性:should_panic。标记了这个属性的测试函数会在代码发生panic时顺利通过,而在代码不发生panic时执行失败。

5、使用Result<T, E>编写测试:

也可以用Result<T, E>来编写测试!在运行失败时返回一个Err值而不是触发panic。示例:

rust 复制代码
#[cfg(test)]
mod tests {
	#[test]
	fn it_works() -> Result<(), String> {
		if 2 + 2 == 4 {
			Ok(())
		} else {
			Err(String::from("two plus two does not equal four"))
		}
	}
}

6、测试的组织结构:

Rust社区主要从以下两个分类来讨论测试:单元测试(unit test)和集成测试(integration test)。单元测试小而专注,每次只单独测试一个模块或私有接口。而集成测试完全位于代码库之外,和正常从外部调用代码库一样使用外部代码,只能访问公共接口,并且在一次测试中可能会联用多个模块。

(1)、单元测试:

单元测试的目的在于将一小段代码单独隔离出来,从而迅速地确定这段代码的功能是否符合预期。我们一般将单元测试与需要测试的代码存放在src目录下的同一文件中。同时也约定俗成地在每个源代码文件中都新建一个tests模块来存放测试函数,并使用cfg(test)对该模块进行标注。

(2)、集成测试:

在Rust中,集成测试是完全位于代码库之外的。集成测试调用库的方式和其他的代码调用方式没有任何不同,这也意味着你只能调用对外公开提供的那部分接口。集成测试的目的在于验证库的不同部分能否协同起来正常工作。能够独立正常工作的单元代码在集成运行时也会发生各种问题,所以集成测试的覆盖率同样是非常重要的。为了创建集成测试,你首先需要建立一个tests目录。

相关推荐
hstar9527几秒前
三十五、面向对象底层逻辑-Spring MVC中AbstractXlsxStreamingView的设计
java·后端·spring·设计模式·架构·mvc
楽码3 分钟前
AI决策树:整理繁杂问题的简单方法
人工智能·后端·openai
星辰大海的精灵8 分钟前
基于Dify+MCP实现通过微信发送天气信息给好友
人工智能·后端·python
import_random17 分钟前
[深度学习]5大神经网络架构(介绍)
后端
flyair_China25 分钟前
【云架构】
开发语言·php
pengyu26 分钟前
【Java设计原则与模式之系统化精讲:壹】 | 编程世界的道与术(实战指导篇)
java·后端·设计模式
维维酱28 分钟前
Rust - 读写锁 (RwLock)
rust
陈随易30 分钟前
一行代码,将网页元素变成图片!比 html2canvas 快 93 倍的截图神器来了!
前端·后端·程序员
Source.Liu31 分钟前
【PhysUnits】15.17 比例因子模块 (ratio.rs)
rust
Kookoos31 分钟前
性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断
后端·c#·.net·abp vnext·miniprofiler