如何使用MATLAB写测试(4)重复劳动?TestMethodSetup!
原文:如何使用MATLAB写测试(4)重复劳动?TestMethodSetup! - 知乎 (zhihu.com)
我们来自俄罗斯的实习生是学Computer Vision的,最近他为我们展示了一个全新的程序
function imOut = bokehfilter(imIn)
se = strel('ball',6,1,8);
imOut = imdilate(imIn,se);
我问他,这啥?他说,你看
>> im = imread('myFoliage.jpg');
>> imout = bokehfilter(im);
>> imshowpair(im,imout,'montage')
原来还是个小清新,那你测试写了吗?
当然了,给你看我现在的Test
classdef myTest < matlab.unittest.TestCase
methods (Test)
function testSingleImage(test)
im = imread('peppers.png');
imSingle = im2single(im);
imOut = bokehfilter(imSingle);
test.verifyTrue(isa(imOut,'single'));
end
function testDoubleImage(test)
im = imread('peppers.png');
imDouble = im2double(im);
imOut = bokehfilter(imDouble);
test.verifyTrue(isa(imOut,'double'));
end
function testUint8Image(test)
im = imread('peppers.png');
imUint8 = im2uint8(im);
imOut = bokehfilter(imUint8);
test.verifyTrue(isa(imOut,'uint8'));
end
function testSize(test)
im = imread('peppers.png');
imOut = bokehfilter(im);
test.verifyEqual(size(im),size(imOut));
end
end
end
我看了后说,你老板要发飙的,上次学的TestParameter呢? 他赶紧回去返工
classdef myTest < matlab.unittest.TestCase
properties(TestParameter)
type = {'single','double','uint8'}
imConversion = {@im2single, @im2double, @im2uint8};
end
methods (Test, ParameterCombination = 'sequential')
function testImageClass(test,type,imConversion)
im = imread('peppers.png');
imIn = imConversion(im);
imOut = bokehfilter(imIn);
test.verifyTrue(isa(imOut,type));
end
function testSize(test)
im = imread('peppers.png');
imOut = bokehfilter(im);
test.verifyEqual(size(im),size(imOut));
end
end
end
哟,不错,熟练掌握了TestParameter以及function handle,确实是名合格的实习生。
可是每次我还是需要读取图片,如果以后需要改测试图片,要改好多个地方,有没有一劳永逸的方法?
实习生翻阅了文档后,发现了这篇文章,原来可以用TestMethodSetup来做一些重复的初始化工作。
classdef myTest < matlab.unittest.TestCase
properties(TestParameter)
type = {'single','double','uint8'}
imConversion = {@im2single, @im2double, @im2uint8};
end
properties
testImage; %不是TestParamter, 只是普通的Class property
end
methods (TestMethodSetup)
function readImage(test)
% TestMethodSetup里面的function会在每一个test method开始前运行一次
% 类似的还有TestClassSetup, 是在整个test class运行前运行一次
test.testImage = imread('peppers.png');
end
end
methods (Test, ParameterCombination = 'sequential')
function testImageClass(test,type,imConversion)
im = test.testImage;
imIn = imConversion(im);
imOut = bokehfilter(imIn);
test.verifyTrue(isa(imOut,type));
end
function testSize(test)
im = test.testImage;
imOut = bokehfilter(im);
test.verifyEqual(size(im),size(imOut));
end
end
end
类似的还有在test method运行后做收尾工作的TestMethodTeardown和TestClassTeardown。
实习生非常满意自己的Unit test, 感觉可以转正了……