如何使用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