当前位置:首页 > 科技  > 软件

在Rust中编写自动化测试

来源: 责编: 时间:2024-01-08 17:10:28 139观看
导读1.摘要Rust中的测试函数是用来验证非测试代码是否是按照期望的方式运行的, 测试函数体通常需要执行三种操作:设置任何所需的数据或状态;运行需要测试的代码;断言其结果是我们所期望的。本篇文章主要探讨了Rust自动化

1.摘要

Rust中的测试函数是用来验证非测试代码是否是按照期望的方式运行的, 测试函数体通常需要执行三种操作:pDi28资讯网——每日最新资讯28at.com

  • 设置任何所需的数据或状态;
  • 运行需要测试的代码;
  • 断言其结果是我们所期望的。

本篇文章主要探讨了Rust自动化测试的几种常见场景。pDi28资讯网——每日最新资讯28at.com

pDi28资讯网——每日最新资讯28at.com

2.测试函数详解

在Rust项目工程中, 可以对任意函数进行自动化测试, 前提是需要在被测试函数上面加上#[test]注解, 然后运行cargo test命令进行函数自动化测试, Rust会查找所有被#[test]注解的函数并自动进行测试。pDi28资讯网——每日最新资讯28at.com

先看下面一段代码:pDi28资讯网——每日最新资讯28at.com

#[test]fn add_calc() {    let result = 1 + 2;    assert_eq!(result, 3);}

在上面的代码中, 我实现了一个加法计算的函数: add_calc(), 将加法结果保存到不可变变量result中, 并使用了assert_eq!宏来断言1+2的结果, assert!宏由标准库提供, 在希望确保测试过程中一些条件为true时非常有用。在函数上方加上了#[test]注解, 表示该函数将执行自动化测试, 运行: cargo test看下结果:pDi28资讯网——每日最新资讯28at.com

pDi28资讯网——每日最新资讯28at.com

从测试结果中, 可以看到test add_calc ... ok 这行, 表示该函数测试通过了。pDi28资讯网——每日最新资讯28at.com

现在我修改下断言的结果, 将代码修改为:pDi28资讯网——每日最新资讯28at.com

#[test]fn add_calc() {    let result = 1 + 2;    assert_eq!(result, 4);}

再次运行cargo test命令, 返回结果如下:pDi28资讯网——每日最新资讯28at.com

pDi28资讯网——每日最新资讯28at.com

可以看到, 计算的结果是3, 但断言相等的条件是等于4, 因此函数执行失败, add_calc()函数自动化测试不通过。pDi28资讯网——每日最新资讯28at.com

接下来我们再加入一个函数, 看看在具有多个函数的前提下, 同时具备成功和失败的情况, 代码如下:pDi28资讯网——每日最新资讯28at.com

#[test]fn add_calc() {    let result = 1 + 2;    assert_eq!(result, 3);}#[test]fn another_method() {    panic!("执行失败,抛出一个异常!")}

在上面的代码中, 增加了一个名为another_method()的函数, 该函数直接使用panic!抛出一个异常, 直接扮演了函数执行失败的角色, 而上面的add_calc()函数我讲assert_eq!宏修改正确, 将扮演执行成功的角色, 使用cargo test命令看下结果:pDi28资讯网——每日最新资讯28at.com

pDi28资讯网——每日最新资讯28at.com

可以看到, add_calc()函数测试没问题, 后面用绿色ok表示, 而another_method()函数执行失败, 使用红色的FAILED标记。pDi28资讯网——每日最新资讯28at.com

3.自定义失败信息

在上面的案例中, 我使用了assert_eq!宏来断言结果, 同样, 也可以向宏传递一个可选的失败信息参数, 可以在测试失败时将自定义的失败信息一并打印出来, 使用自定义信息有个好处, 当测试失败时, 能更好的理解代码到底出了什么问题, 看一段下面的代码:pDi28资讯网——每日最新资讯28at.com

pub fn make_string(name: &str) -> String {    format!("Hello,{}!", name)}#[test]fn is_contain_name() {    let result = make_string("cargo");    assert!(result.contains("cargo"));}

在这段代码中, 定义了一个函数make_string, 该函数接收一个字符串参数, 并在函数内部通过format!宏格式化字符串后返回, 在函数is_contain_name()中, 传入一个字符串"cargo", assert!会判断make_string()函数返回的字符串中是否会包含"cargo"字符串,如果包含就是成功的,否则就失败, 这里我们能预言结果应该是成功的, 测试一下看看:pDi28资讯网——每日最新资讯28at.com

pDi28资讯网——每日最新资讯28at.com

结果跟我们预想的一样, 现在再加入一些更详细的变化信息看看, 代码如下:pDi28资讯网——每日最新资讯28at.com

pub fn make_string(name: &str) -> String {    format!("Hello,{}!", name)}#[test]fn is_contain_name() {    let result = make_string("rustup");    assert!(result.contains("cargo"), "make_string中不包含该字符串,值为:`{}`", result);}

我在assert!宏中加入了变量打印, 假如make_string()函数没有返回预期的结果, 那结果到底是什么,这里我们将能看到失败原因, 测试结果如下:pDi28资讯网——每日最新资讯28at.com

pDi28资讯网——每日最新资讯28at.com

从结果可以看到, 函数的确测试失败了, 但我们看到了关键信息, 失败的原因是因为make_string()函数返回的字符串内容为:Hello,rustup!,这个结果与断言中的result.contains("cargo")结果是不同的, “Hello,rustup!”字符串中并不包含"cargo"字符串,所以函数测试失败。pDi28资讯网——每日最新资讯28at.com

4.检查崩溃异常

除了使用断言宏之外, Rust还提供了一个should_panic用来检测程序中的panic,并且提供了一个名为expected的参数用来自定义消息,看一段下面的代码:pDi28资讯网——每日最新资讯28at.com

pub fn number_calc(value: i32) -> i32 {    let ret_value = 40;    if value < 0 {        panic!("值必须大于0,传参的值为:{}", value)    }    return ret_value}#[test]#[should_panic(expected = "传参不能小于0")]fn is_contain_name() {    let result = number_calc(-1);}

在number_calc()函数中, 如果判断参数传入的值小于0, 会抛出一个panic, 为了监视是什么原因导致, 在函数is_contain_name()上面使用should_panic进行监控, 并使用expected参数指定自定义消息, 如果遇到传入的参数小于0, 将触发该消息打印, 使用cargo test运行一下看看结果:pDi28资讯网——每日最新资讯28at.com

pDi28资讯网——每日最新资讯28at.com

从结果可以看到, 的确检测到了panic产生, panic打印了本身的消息, 最后一行shoud_panic也触发了消息, 并打印出失败的原因。pDi28资讯网——每日最新资讯28at.com

5.使用Result<T, E>测试

先看一段下面的代码:pDi28资讯网——每日最新资讯28at.com

pub fn number_calc(value: i32) -> i32 {    let ret_value = 40;    if value < 0 {        return 30    }    return ret_value}#[test]fn is_contain_name() -> Result<(), String>{    if number_calc(2) == 40 {      OK(())  }else{    Err(String::from("结果不等于40,请检查原因!"))  }}

在上面的代码中, is_contain_name()函数的返回类型现在变为:Result<(), String>, 在函数体中, 不同于调用assert_eq!,现在如果测试通过,将返回Ok(()), 在测试失败时, 返回带有String的Err错误。现在传入参数为2, 将显示正常的结果:pDi28资讯网——每日最新资讯28at.com

pDi28资讯网——每日最新资讯28at.com

现在我们再传入一个小于0的负值看看,结果如下:pDi28资讯网——每日最新资讯28at.com

pDi28资讯网——每日最新资讯28at.com

可以看到, 如果使用Result<(), String>接收结果, 当出来错误时, 将返回一个Error,并打印对应的自定义消息。pDi28资讯网——每日最新资讯28at.com

6.总结

在本篇文章中, 我们使用#[test]注解完成了对指定函数的自动化测试, 使用assert!宏对错误进行断言, 在断言中自定义错误显示消息用于查看更详细的错误原因。使用了should_panic对panci错误进行了监控, 最后使用Result<T, E>替代断言分别完成了代码测试和自定义错误消息打印, 在以后的实际应用中, 可能还会有一些组合测试的场景出现, 到时候再具体问题具体分析。pDi28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-58900-0.html在Rust中编写自动化测试

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 线程池系统设置最全指南!

下一篇: 四行代码让大模型上下文暴增3倍,羊驼Mistral都适用

标签:
  • 热门焦点
  • 三言两语说透设计模式的艺术-简单工厂模式

    三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • K6:面向开发人员的现代负载测试工具

    K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾&ldquo;低价&rdquo;口号。而过去与他们错位竞争的拼多多,靠
  • ESG的面子与里子

    ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 网红炒股不为了赚钱,那就是耍流氓!

    网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 认真聊聊东方甄选:如何告别低垂的果实

    认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • Windows 11发布,微软一改往常对老机型开放的态度

    Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • 最薄的14英寸游戏笔记本电脑  Alienware X14已可以购买

    最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
  • “买真退假” 这种“羊毛”不能薅

    “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top