15.编写自动化测试(下)

news2024/12/26 11:01:13

标题

  • 三、控制测试流程
    • 3.1 添加测试参数
    • 3.2 并行或连续运行测试
    • 3.3 显示函数输出
    • 3.4 指定/过滤测试用例名称
    • 3.5 忽略某些测试用例
    • 3.6 只运行被忽略的测试
  • 四、测试的组织结构
    • 4.1 概念引入
    • 4.2 测试私有函数
    • 4.2 单元测试
    • 4.3 集成测试
    • 4.4 集成测试中的子模块
    • 4.5 二进制crate的集成测试

三、控制测试流程

3.1 添加测试参数

  • cargo test执行时并行执行所有的测试用例,并截断输出到屏幕;
  • cargo test和可执行测试用例的参数都可以被改变;
  • 运行cargo test时后跟cargo test和测试二进制文件的参数,中间用--分隔;
  • cargo test --help会提示 cargo test 的有关参数;
  • cargo test -- --help 会提示分隔符--之后使用的参数;

3.2 并行或连续运行测试

设置测试程序并行执行数

cargo test -- --test-threads=1

3.3 显示函数输出

不只显示测试程序通过与否,还需要显示println!的输出;

cargo test -- --show-output

3.4 指定/过滤测试用例名称

pub fn add_two(a: i32) -> i32 {
    a + 2
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn add_two_and_two() {
        assert_eq!(4, add_two(2));
    }

    #[test]
    fn add_three_and_two() {
        assert_eq!(5, add_two(3));
    }

    #[test]
    fn one_hundred() {
        assert_eq!(102, add_two(100));
    }
}

直接在cargo test后面加被#[test]标记的函数名称即可;
在这里插入图片描述

  • 红框中会运行所有包含add_名称的测试用例;
  • 蓝框中会运行add_three_and_two测试用例;

3.5 忽略某些测试用例

  • 使用#[ignore]标记运行cargo test运行时忽略的测试用例

例如为add_three_and_two添加#[ignore]属性
在这里插入图片描述

3.6 只运行被忽略的测试

cargo test -- --ignored

四、测试的组织结构

4.1 概念引入

测试主要分为单元测试(unit tests)与 集成测试(integration tests)

  • 单元测试:与其他部分隔离的环境中测试每一个单元的代码,以便于快速而准确的某个单元的代码功能是否符合预期;
  • 集成测试:对于自己的库来说完全是外部的。需要与其他外部代码一样,通过相同的方式使用代码;只测试公有接口而且每个测试都有可能会测试多个模块;

4.2 测试私有函数

  • Rust 的私有性规则允许对私有函数进行测试;
pub fn add_two(a: i32) -> i32 {
    internal_adder(a, 2)
}

fn internal_adder(a: i32, b: i32) -> i32 {
    a + b
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn internal() {
        assert_eq!(4, internal_adder(2, 2));
    }
}
  • internal_adder函数并没有标记为pub,所以它是个私有函数;
  • 它可以通过cargo test的运行;

4.2 单元测试

  • 单元测试与要测试的代码共同存放在位于src目录下相同的文件中;
  • 每个文件中创建包含测试函数的tests模块,并使用#cfg(test)标注模块;
  • 被标注为#cfg(test)的模块只有在cargo test时才会编译并执行,这样就减小了二进制包的体积;

4.3 集成测试

  • 目的是为了测试库的多个部分能否一起正常工作;
  • 需要创建一个与src同级的tests目录;
  • 只会在运行cargo test时编译这个目录中的文件;
  • 不需要tests目录下的任何rs文件中的任何代码标注#[cfg(test)]

创建集成测试用例: tests/integration_test.rs

#[test]
fn it_adds_two() {
    assert_eq!(4, adder::add_two(2));
}
  • 需要使用addr::引入要测试的模块;
  • addr就是创建cargo项目时指定的名字;
  • 下图中红框部分就是integration_test.rs测试文件中的运行结果;

在这里插入图片描述

  • 红框上面的部分是单元测试的结果
  • 红框中的部分是集成测试的结果
  • 红框下面的部分是文档测试的结果
  • 仍然可以只测试某个单独用例或使用cargo test --test integration_test测试integration_test.rs文件下的所有测试用例;

4.4 集成测试中的子模块

  • 每一个tests目录中的文件都被编译为单独的crate;
  • tests目录中的文件不能共享相同的行为;

假设setup函数需要被多个测试文件的测试函数调用,参考以下步骤

  1. 创建文件tests/common.rs并写入代码
pub fn setup() {
    // 编写特定库测试所需的代码
}

此时运行cargo test会看到输出在这里插入图片描述

  • 原意图只是希望它被其他测试文件调用而并不想要common出现在测试结果中;
  • 因此做如下修改
    1). 创建tests/common/mod.rs文件,这是在告诉 Rust 不要将 common 看作一个集成测试文件;
    2). 将common.rs文件中的代码移动到 mod.rs中,并删除common.rs文件;
    3). 此时执行cargo test就不出出现上面的情况了;

tests 目录中的子目录不会被作为单独的 crate 编译或作为一个测试结果部分出现在测试输出中。

  1. 然后就可以调用mod.rs中的函数;
mod common;

#[test]
fn it_adds_two() {
    common::setup();
    assert_eq!(4, adder::add_two(2));
}

在这里插入图片描述

4.5 二进制crate的集成测试

  • 只包含二进制可执行程序的create不能创建集成测试;
  • 只有库crate才会向其他 crate 暴露了可供调用和使用的函数;
  • 二进制crate只能单独运行;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞复现】畅捷通T+ keyEdit SQL注入漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

Confluence安装

Confluence安装 1.安装 #下载confluence版本(8.5.11) https://www.atlassian.com/software/confluence/download-archives #修改权限 chmod x atlassian-confluence-8.5.11-x64.bin #执行安装 ./atlassian-confluence-8.5.11-x64.bin按照以下提示输入&…

SD-WAN在教育行业的应用及优势解析

随着教育领域的数字化转型,网络技术的需求变得愈发迫切。作为一种前沿的网络解决方案,SD-WAN正在为教育行业提供强有力的支持。本文将详细探讨SD-WAN在教育行业的应用,并分析其为教育行业带来的众多优势。 实现多校区高效互联 教育机构通常拥…

稳了?L3规模化落地在即,激光雷达公司成首批赢家

作者 | 芦苇 编辑 | 德新 在中国,距L3级自动驾驶的规模化落地,又近了一步。 随着国内试点政策刷新,越来越多的车企在部分市域获得了自动驾驶测试牌照,能上路测试的L3级自动驾驶车辆正在快速增加。 其中一个重要节点是&#xf…

Python基础用法 之 转义字符

将两个字符进⾏转义 表示⼀个特殊的字符 \n ---> 换⾏,回⻋ \t ---> 制表符, tab键 注意: print( end\n): print() 函数中默认有⼀个 end\n, 所以,每个 print 结束之后, 都会输出⼀ 个换行。 未完待续。

Java数据类型及运算符及数组(与C语言对比)

Java和C语言在数据类型大部分相同,但是也有不同 1.新增了byte类型(相当于C语言中把char用作整数一样) 2.然后就是char类型的大小改为了2字节。 3.布尔型改名为boolean而不是bool,且大小没有明确规定,方便进行不同平台之间的移…

使用dev_dbg调试

首先内核要使能两个配置才可以使用。一般内核都是打开的。 CONFIG_DEBUG_FSy CONFIG_DYNAMIC_DEBUGy 当编译选项CONFIG_DYNAMIC_DEBUG打开的时候,在编译阶段,kernel会把所有使用dev_dbg()的信息记录在一个table中,这些信息我们可以从/sys/k…

在线预览多类型文件_全栈

目录 一、下载运行项目 二、项目功能 三、前端项目引用 四、文件预览样式更改 在做项目时经常用到在线预览文件,给大家介绍一个好用的在线预览文件项目。使用技术是后端Java,前端Freemarker模板。 FreeMarker 特别适应与 MVC 模式的 Web 应用&#x…

从“产品的RFM分析”看如何探索“职业方向”

我们在做产品分析时,经常会用到一种方法“产品的RFM分析”,它是一种客户细分和价值评估的常用方法,广泛应用于电子商务、零售和其他众多行业,它可以帮助企业和产品团队更好地理解用户行为,优化营销策略,提升…

解禁日大涨,爱玛科技的投资前景值得信任吗?

6月17日,爱玛迎来6.28亿股、金额超190亿元的解禁,占总股本72.91%。不过,爱玛股价在巨量解禁中反而迎来涨势,因为这部分股票中,创始人张剑持有的限售股数量几乎就占了爱玛总股本的七成。某种意义上,市场认为…

【产品经理】订单处理4-拆单策略

上次讲解了订单的促销策略,本次讲解下订单处理过程中的拆单策略。 订单拆单策略分为自动拆单、手动拆单,拆单时机也分为订单未被审核前拆单、订单审核后因仓库/快递情况的拆单,本次主要讲解订单未被审核前拆单、订单审核后快递超重的拆单&am…

ollama模型CPU轻量化部署

一、定义 ollama 定义环境部署demo加载本地模型方法基本指令关闭开启ollamaollama 如何同时 运行多个模型, 多进程ollama 如何分配gpu修改模型的存储路径 二、实现 ollama 定义 ollama 是llama-cpp 的进一步封装,更加简单易用,类似于docker. 模型网址…

SFNC —— 标准特征命名约定(一)

系列文章目录 SFNC —— 标准特征命名约定(一) 文章目录 系列文章目录1、介绍1.1 约定(Conventions)功能名称和接口(Feature Name and Interface)功能类别(Feature Category)功能级别…

菜单栏(骆驼书)

代码如下: 效果图:

使用宝塔面板部署Django应用(不成功Kill Me!)

使用宝塔面板部署Django应用 文章目录 使用宝塔面板部署Django应用 本地操作宝塔面板部署可能部署失败的情况 本地操作 备份数据库 # 备份数据库 mysqldump -u root -p blog > blog.sql创建requirements # 创建requirements.txt pip freeze > requirements.txt将本项目…

揭示SOCKS5代理服务器列表的重要性

在复杂的网络安全领域中,SOCKS5代理在保护在线活动方面发挥着关键作用。本文深入探讨了SOCKS5代理服务器列表的细节,探讨了它们的应用、优势以及在增强在线安全和隐私方面不可或缺的功能。 一、理解SOCKS5代理服务器列表 作为在客户端和服务器之间进行通…

522. 最长特殊序列 II

题目 给定字符串列表 strs ,返回其中最长的特殊序列的长度。如果最长特殊序列不存在,返回 -1。 特殊序列定义如下:该序列为某字符串独有的子序列(即不能是其他字符串的子序列)。 字符串 s 的子序列可以通过删去字符…

Plonky3和Binius中的Brakedown多项式承诺协议解析及优化(3)

3.2 Expander Graph and Linear-Time Encodable Linear Code 线性时间编码是线性纠错码的一种,核心是扩展图(Expander Graph),如下图所示: Figure 3 Expander Graph Expander Graph是一种具有强连通性的稀疏图&#…

ensp防火墙web密码重置(前提通过console可以登录)

客户电脑是命令行没有用户名直接输入密码就可以登录了,但是web端不知道admin的密码 前两天遇到运维单位的一台防火墙web网页不知道用户名密码,默认的登录不了,但是通过console可以登录命令行,今天就记录下如何通过命令行修改web页…

iOS 18 照片应用程序增加了新分类用于查找二维码、收据、插图等

苹果照片应用 苹果在iOS 18的照片应用中引入了全新的设计,将图库和推荐部分合并为一个更集成的多合一视图。重新设计的实用工具部分经过全面改造,使得查找不同类型的图片更加容易。 实用工具 在iOS 17中,照片应用的实用工具部分只包括导入…