从今天起我们开始学习算法开发的单元测试框架使用方法,我们以之前写的求解一个范围内素数个数的算法为例,介绍单元测试框架的基本使用方法。
先将之前的代码写成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编写单元测试的基本用法。