如何使用MATLAB写测试(4)重复劳动?TestMethodSetup!

发布于:2024-06-25 ⋅ 阅读:(122) ⋅ 点赞:(0)

如何使用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, 感觉可以转正了……