如何使用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 zero
    out = zeros(size(in),'like',in);
end

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

  • 测试环节

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

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

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

>> result = runtests('myTest')
Running myTest
.
Done myTest
__________


result = 

  TestResult with properties:

          Name: 'myTest/testSingle'
        Passed: 1
        Failed: 0
    Incomplete: 0
      Duration: 0.0164
       Details: [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 zero
    out = 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:
             0
    Expected 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: 0
        Failed: 1
    Incomplete: 0
      Duration: 0.1812
       Details: [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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值