使用matlab进行算法开发时的单元测试写法

从今天起我们开始学习算法开发的单元测试框架使用方法,我们以之前写的求解一个范围内素数个数的算法为例,介绍单元测试框架的基本使用方法。

先将之前的代码写成function的形式,如下:

function [divNumberVectorLength] = primeNumberSolute(calculationRange)
 
numEnter = calculationRange;

if (numEnter <= 1)
    warning('MyComponent:incorrectRange','输入范围内不含有任何质数');
end


numVector = zeros(1,numEnter);
numVector(1,1) = 1;
% disp('2');
divNum = 2;                             % 设定质数变量的初始值
tempVector = find(~numVector);
divNumberVectorLength = 1;
 
while(divNum <= numEnter)
    for iloop1 = 1:length(tempVector)
        % 小于divNum的数字不需要重复判断,相较于从2开始计算,可以节省1/3的时间(numEnter = 100000时)
        if(mod(tempVector(iloop1),divNum) == 0)
            numVector(1,tempVector(iloop1)) = 1;
        end
    end
    
    tempVector = find(~numVector);       % 寻找所有原始向量中的零元素坐标
    if (min(size(tempVector))>0)
        divNum = tempVector(1,1);           % 剩余的零元素的第一个坐标就是下一个素数
    else
%         disp('end');
        break;
    end
%     disp(divNum);
    divNumberVectorLength = divNumberVectorLength + 1;
    % disp 命令会增加耗时5%左右
end

我们对这个算法进行以下几个测试:

1】先测试能不能完成主要功能,给函数一个输入参数100,验证函数的计算结果是否是25,(100以内有25个素数)

2】然后测试,当输入≤1的数的时候,函数是否能正确的进行警告(‘输入范围内不含有任何素数’)

3】对函数进行性能测试,测试函数的计算速度是多少

对于第一和第二个测试项,我们写一个测试函数如下:

function tests = testPrimeNumberSolute
    tests = functiontests(localfunctions);
end


%% 添加测试点
function testPrimerNumberAcount(testCase)
    testCase.verifyTrue(primeNumberSolute(100) == 25,'100以内质数个数求解错误')
end

function testWrongTypeInput(testCase)
    testCase.verifyWarning(@()primeNumberSolute(1),'MyComponent:incorrectRange');
    testCase.verifyWarning(@()primeNumberSolute(0),'MyComponent:incorrectRange');
    testCase.verifyWarning(@()primeNumberSolute(-3),'MyComponent:incorrectRange');
end

对于第三个测试项,我们写一个基于类的测试如下:

classdef TestPrimeNumberSoluteTimeCost < matlab.perftest.TestCase
    
    properties
        testRange = 10000;
    end
    
    methods (Test)
        function test1(testCase)
            timeCostRange1 = primeNumberSolute(testCase.testRange);
        end
        
        function test2(testCase)
            timeCostRange2 = primeNumberSolute(testCase.testRange*5);
        end
    end
end

完成以上两个测试文件的编写,我们再写一个测试脚本用于调用以上连个测试文件,测试脚本的内容如下:

clc
clear 
close all

results = runtests('testPrimeNumberSolute');
disp(results);

timeCost = runperf('TestPrimeNumberSoluteTimeCost');
% disp(timeCost);
disp(timeCost(1).Samples);
disp(timeCost(2).Samples);

这样我们就完成了一个完整的单元测试功能的编写,运行测试脚本,得到以下测试结果

Running testPrimeNumberSolute
..
Done testPrimeNumberSolute
__________

  1×2 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   2 Passed, 0 Failed, 0 Incomplete.
   0.027291 seconds testing time.

Running TestPrimeNumberSoluteTimeCost
..........
......
Done TestPrimeNumberSoluteTimeCost
__________

                   Name                    MeasuredTime         Timestamp          Host      Platform           Version                      RunIdentifier            
    ___________________________________    ____________    ___________________    _______    ________    _____________________    ____________________________________

    TestPrimeNumberSoluteTimeCost/test1    0.064758        2018-09-23 21:20:51    Dell-PC    win64       9.2.0.538062 (R2017a)    0d5543e6-9f94-41e5-9971-30415c4b478b
    TestPrimeNumberSoluteTimeCost/test1    0.064199        2018-09-23 21:20:51    Dell-PC    win64       9.2.0.538062 (R2017a)    0d5543e6-9f94-41e5-9971-30415c4b478b
    TestPrimeNumberSoluteTimeCost/test1    0.064643        2018-09-23 21:20:52    Dell-PC    win64       9.2.0.538062 (R2017a)    0d5543e6-9f94-41e5-9971-30415c4b478b
    TestPrimeNumberSoluteTimeCost/test1    0.064474        2018-09-23 21:20:52    Dell-PC    win64       9.2.0.538062 (R2017a)    0d5543e6-9f94-41e5-9971-30415c4b478b

                   Name                    MeasuredTime         Timestamp          Host      Platform           Version                      RunIdentifier            
    ___________________________________    ____________    ___________________    _______    ________    _____________________    ____________________________________

    TestPrimeNumberSoluteTimeCost/test2     1.177          2018-09-23 21:20:58    Dell-PC    win64       9.2.0.538062 (R2017a)    0d5543e6-9f94-41e5-9971-30415c4b478b
    TestPrimeNumberSoluteTimeCost/test2    1.1742          2018-09-23 21:20:59    Dell-PC    win64       9.2.0.538062 (R2017a)    0d5543e6-9f94-41e5-9971-30415c4b478b
    TestPrimeNumberSoluteTimeCost/test2    1.1775          2018-09-23 21:21:00    Dell-PC    win64       9.2.0.538062 (R2017a)    0d5543e6-9f94-41e5-9971-30415c4b478b
    TestPrimeNumberSoluteTimeCost/test2    1.1763          2018-09-23 21:21:01    Dell-PC    win64       9.2.0.538062 (R2017a)    0d5543e6-9f94-41e5-9971-30415c4b478b

>> 

通过测试结果,我们可以得知:

算法的两个功能测试完全通过,对算法进行性能测试,测试结果分别为0.64S、1.77S左右。

以上就是使用matlab编写单元测试的基本用法。

你可能感兴趣的:(matlab仿真,数学基础)