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目录。

相关推荐
Victor3561 小时前
MySQL(169)如何理解MySQL的二级缓存?
后端
Victor3561 小时前
MySQL(170)如何使用MySQL的性能模式(Performance Schema)?
后端
OKkankan2 小时前
string类的模拟实现
开发语言·数据结构·c++·算法
好好研究4 小时前
使用JavaScript实现轮播图的自动切换和左右箭头切换效果
开发语言·前端·javascript·css·html
汽车功能安全啊5 小时前
利用对称算法及非对称算法实现安全启动
java·开发语言·安全
paopaokaka_luck5 小时前
基于Spring Boot+Vue的吉他社团系统设计和实现(协同过滤算法)
java·vue.js·spring boot·后端·spring
Flobby5296 小时前
Go语言新手村:轻松理解变量、常量和枚举用法
开发语言·后端·golang
nbsaas-boot7 小时前
SQL Server 窗口函数全指南(函数用法与场景)
开发语言·数据库·python·sql·sql server
东方佑7 小时前
递归推理树(RR-Tree)系统:构建认知推理的骨架结构
开发语言·r语言·r-tree
Warren987 小时前
Java Stream流的使用
java·开发语言·windows·spring boot·后端·python·硬件工程