如何使用MATLAB写测试(1)初识unittests

如何使用MATLAB写测试(1)初识unittests

WHAT:

本文介绍如何在MATLAB中写简单的单元测试。

WHY:

在学生时代,我作为一名工科生喜欢用MATLAB的首要原因是可以进行快速的开发。无论是对算法的验证,调试,还是最后的展示,MATLAB都优于很多其他工具。

进入职场后,我发现学生时代的“一次性开发”,2000行的脚本,甚至是10+个函数相互调用,都不能满足一个成熟项目的稳定性和可维护性。相信很多不是CS背景的工科生都会有类似的经历。随后我接触到了Test-Driven Development(TDD)的概念,对于开发工作有相当大的帮助。

希望这篇文章可以帮助大家了解MATLAB中的测试环境和可用的工具,提高开发效率。

HOW:

MATLAB版本:本文基于MATLAB R2016a,但是MATLAB中的单元测试基本功能在R2013a就可以使用。

  • 开发环节

我们假设开发了一个产生0矩阵的程序,定义如下:

function out = foo(in)validateattributes(in,{'numeric'},{'nonempty'}); %Not now% Returns zeroout = zeros(size(in),'like',in);
end

该程序的作用为产生一个和输入矩阵一样大小,一样类型的全0矩阵。第一行validateattributes限定了输入必须为数值且非空。

  • 测试环节

MATLAB提供的所有单元测试工具可以在这里找到, 今天这里展示的是Class-Based Unit Tests

%% 所有的单元测试都需要从matlab.unittest.TestCase继承
classdef myTest < matlab.unittest.TestCase%% 定义以Test为attribute的methodsmethods (Test)% 定义你自己的测试function testSingle(test) %function唯一的参数test是你的测试对象% Verifies single input casein        = single(10);             %输入expOut    = zeros(1,'single');      %期待的输出actualOut = foo(in);                %调用待测程序test.verifyEqual(actualOut,expOut); %比较实际输出与期待输出endend
end

至此一个简单的测试例子就写好了,接下来就是要跑测试了。在MATLAB命令行输入:

>> result = runtests('myTest')
Running myTest
.
Done myTest
__________result = TestResult with properties:Name: 'myTest/testSingle'Passed: 1Failed: 0Incomplete: 0Duration: 0.0164Details: [1x1 struct]Totals:1 Passed, 0 Failed, 0 Incomplete.0.016414 seconds testing time.

测试通过。

十天后,我们不靠谱的实习生修改了foo函数

function out = foo(in)validateattributes(in,{'numeric'},{'nonempty'}); %Not now% Returns zeroout = 1 + zeros(size(in),'like',in);
end 

他没有忘记提交前跑一下现有的测试

>> result = runtests('myTest')
Running myTest================================================================================
Verification failed in myTest/testSingle.---------------------Framework Diagnostic:---------------------verifyEqual failed.--> The values are not equal using "isequaln".--> Failure table:Actual    Expected    Error    RelativeError______    ________    _____    _____________0         1           -1       -1           Actual single:0Expected single:1------------------Stack Information:------------------In /users/matlab/myTest.m (myTest.testSingle) at 12
================================================================================
.
Done myTest
__________Failure Summary:Name               Failed  Incomplete  Reason(s)================================================================myTest/testSingle    X                 Failed by verification.result = TestResult with properties:Name: 'myTest/testSingle'Passed: 0Failed: 1Incomplete: 0Duration: 0.1812Details: [1x1 struct]Totals:0 Passed, 1 Failed, 0 Incomplete.0.18124 seconds testing time.

发现错误后,他做出了修改,保住了工作,他感谢TDD,感谢MATLAB Unittest……

至此,我们有了一个再也没有bug的程序(并没有

希望对大家有帮助。

参考资料:

Class-Based Unit Tests

Testing Frameworks

Test-driven development

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

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

相关文章

【git pull 和 push详解】

git pull 和 push详解 1.背景2.命令和解释2.1 git pull简介详情 2.2 git push简介Git Push 参数及详细解释 1.背景 在分布式开发环境中&#xff0c;git pull和git push的使用确保了团队成员之间的代码一致性&#xff0c;减少了不同步导致的问题。它们简化了版本管理&#xff0c…

关于burp的intruder返回包空白问题

记录一下被自己蠢笑的问题 burp返回包为空怎么办&#xff0c;在查询无果后经过多次试验&#xff0c;确实没有效果 看那三个点还以为加载呢&#xff0c;攻击完了怎么一个显示没有 于是…… 鼠标到三个点&#xff0c;往下一拉 哈哈哈哈哈哈哈&#xff0c;真是被自己给蠢到了

[5] CUDA线程调用与存储器架构

CUDA线程调用与存储器架构 前几节简单讲了如何编写CUDA程序&#xff0c;利用GPU的处理能力并行执行多个线程和块。之前所有程序里的线程是相互独立的&#xff0c;没有多个线程之间的通信多是实际应用程序需要中间线程之间的通信&#xff0c;本文将仔细讲解线程调用以及CUDA的分…

@JsonFormat注解出现日期序列化以及反序列化问题(日期比实际日期少一天)

文章目录 前言一、场景如下所示二、问题分析三、JsonFormat注解是什么以下是 JsonFormat 注解的一些常用属性&#xff1a; 四、解决问题解决方式&#xff1a;只需要指定对应的时区就好效果如下&#xff1a; 五、JsonFormat 注解时出现日期问题总结 前言 在一次的偶然机会下发现…

Python基于PyQt6制作GUI界面——按钮

示例对应的制作的 ui文件 界面如下所示。 <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Form</class><widget class"QWidget" name"Form"><property name"geom…

ColossalAI Open-Sora 1.1 项目技术报告 (视频生成)

项目信息 项目地址&#xff1a;https://github.com/hpcaitech/Open-Sora技术报告&#xff1a; Open-Sora 1&#xff1a;https://github.com/hpcaitech/Open-Sora/blob/main/docs/report_01.mdOpen-Sora 1.1&#xff1a;https://github.com/hpcaitech/Open-Sora/blob/main/docs…

swift中json和字典Dict或者数组相互转换,JSONSerialization的强大使用

在Swift中&#xff0c;你可以使用JSONSerialization类将JSON字符串转换为字典。要将 Swift 字典转换为 JSON 字符串&#xff0c;我们可以使用JSONSerialization类的data(withJSONObject:options:)方法。这个方法将字典转换为二进制数据&#xff0c;然后我们可以使用String(data…

Day23:Leetcode:530.二叉搜索树的最小绝对差 + 501.二叉搜索树中的众数 + 236. 二叉树的最近公共祖先

LeetCode&#xff1a;530.二叉搜索树的最小绝对差 问题描述 解决方案&#xff1a; 1.思路 中序遍历 2.代码实现 class Solution {int pre;int ans;public int getMinimumDifference(TreeNode root) {ans Integer.MAX_VALUE;pre -1;dfs(root);return ans;}public void d…

TCP协议三次握手、四次挥手

目录 TCP协议三次握手的方式建立连接TCP协议四次挥手的方式关闭连接 TCP协议三次握手的方式建立连接 第一次握手&#xff08;SYN&#xff09;&#xff1a;客户端向服务器发送SYN报文&#xff0c;请求建立连接。该报文包含客户端选择的初始序列号&#xff08;ISN&#xff09;&a…

Unity射击游戏开发教程:(26)创建绕圈跑的效果

unity游戏 在本文中,我将介绍如何为敌人创建圆周运动。gif 中显示的确切行为是敌人沿着屏幕向下移动,直到到达某个点,一旦到达该点,它就会绕圈移动。

从浮点数定义到FP8: AI模型中不同的数据类型

背景&#xff1a;AI模型中不同的数据类型对硬件算力和内存的需求是不同的&#xff0c;为了提高模型在硬件平台的吞吐量&#xff0c;减少数据通信带宽需求&#xff0c;往往倾向于将高位宽数据运算转向较低位宽的数据运算。本文通过重新回顾计算机中整数和浮点数的定义&#xff0…

(delphi11最新学习资料) Object Pascal 学习笔记---第13章第3节 (内存管理技巧 )

13.3 内存管理技巧 Object Pascal中的内存管理遵循三个简单的规则&#xff1a;您必须创建每个对象并分配您需要的每个内存块&#xff1b;您必须销毁您创建和分配的每个对象和内存块&#xff1b;每个对象仅销毁一次。对于动态元素&#xff08;即不在堆栈和全局内存区域中的元素…

解决1万条数据前端渲染不卡的问题

万级数据前端渲染优化 解决思路requestAnimationFrame完整代码 解决思路 将数据分组&#xff0c;通过定时器或requestAnimationFrame两种方式分组渲染到Dom上 requestAnimationFrame 渲染数据-动画requestAnimationFram方法 使用requestAnimationFrame可以将动画的每一帧绘制…

HCIP-Datacom-ARST自选题库__ISIS简答【3道题】

1.IS-1S是链路状态路由协议&#xff0c;便用SPF算法进行路由计算。某园区同时部署了IPv4和IPV6井运行IS-IS实现网络的互联互通&#xff0c;如图所示&#xff0c;该网络IPv4和IPV6开销相同&#xff0c;R1和R4只支持IPV4。缺省情况下&#xff0c;计算形成的IPv6最短路径树中&…

MySQL-笔记-10.关系模式的规范化理论

目录 10.1 规范化内容和异常 问题1:数据冗余 问题2:更新异常 问题3:插入异常 问题4:删除异常 10.2 函数依赖 10.2.1 函数依赖的定义 10.2.2 函数依赖与属性之间类型有关 10.2.3 函数依赖的类型 10.2.3.1 平方函数依赖、非平凡函数依赖 10.2.3.2 完全函数依赖、部分函数…

python数据分析——字符串和文本数据2

参考资料&#xff1a;活用pandas库 1、字符串格式化 &#xff08;1&#xff09;格式化字符串 要格式化字符串&#xff0c;需要编写一个带有特殊占位符的字符串&#xff0c;并在字符串上调用format方法向占位符插入值。 # 案例1 varflesh wound s"Its just a {}" p…

solidworks画螺母学习笔记

螺母 单位mm 六边形 直径16mm&#xff0c;水平约束&#xff0c;内圆直径10mm 拉伸 选择两侧对称&#xff0c;厚度7mm 拉伸切除 画相切圆 切除深度7mm&#xff0c;反向切除 拔模角度45 镜像切除 倒角 直径1mm 异形孔向导 螺纹线 偏移打勾&#xff0c;距离为2mm…

Parquet文件格式详解(含行、列式存储区别)

Parquet文件格式详解 Parquet 是一种列式存储格式&#xff0c;旨在高效地存储和处理大规模数据集。它被设计用于在大数据生态系统中进行数据存储和分析&#xff0c;如 Apache Hadoop 和 Apache Spark。 行式存储 vs 列式存储 在了解 Parquet 文件格式之前&#xff0c;先来对…

java:static关键字用法

在静态方法中不能访问类的非静态成员变量和非静态方法&#xff0c; 因为非静态成员变量和非静态方法都必须依赖于具体的对象才能被调用。 从上面代码里看出&#xff1a; 1.静态方法不能调用非静态成员变量。静态方法test2()中调用非静态成员变量address&#xff0c;编译失败…