MATLAB: Как автоматически прервать неудачный юнит-тест - PullRequest
0 голосов
/ 29 мая 2019

Мне интересно, как я могу сделать модульный тест для автоматической остановки при возникновении ошибки в тестируемой системе (sut)?

Предположим, что модульный тест запускает около 1000 различных входных комбинаций, ипредполагается, что результаты соответствуют ожиданиям.Теперь давайте предположим, что в sut есть простая синтаксическая ошибка, которая вызывает ошибку.В этом случае я бы хотел, чтобы модульный тест автоматически останавливался и вызывал метод срыва.

Возможно ли это?

Редактировать:

Я заимствовал пример MATLAB изих справочный сайт (https://de.mathworks.com/help/matlab/matlab_prog/create-basic-parameterized-test.html), чтобы более четко показать, что я имею в виду:

Здесь вы можете увидеть тестовый класс:

classdef TestCarpet < matlab.unittest.TestCase

    properties (TestParameter)
        type = {'single','double','uint16'};
        level = struct('small', 2,'medium', 4, 'large', 6);
        side = struct('small', 9, 'medium', 81,'large', 729);
    end

    methods (Test)
        function testRemainPixels(testCase, level)
            % expected number pixels equal to 1
            expPixelCount = 8^level;
            % actual number pixels equal to 1
            actPixels = find(sierpinski(level));
            testCase.verifyNumElements(actPixels,expPixelCount)
        end

        function testClass(testCase, type, level)
            testCase.verifyClass(...
                sierpinski(level,type), type)
        end

        function testDefaultL1Output(testCase)
            exp = single([1 1 1; 1 0 1; 1 1 1]);
            testCase.verifyEqual(sierpinski(1), exp)
        end
    end

    methods (Test, ParameterCombination='sequential')
        function testNumel(testCase, level, side)
            import matlab.unittest.constraints.HasElementCount
            testCase.verifyThat(sierpinski(level),...
                HasElementCount(side^2))
        end
    end
end

Вот тестируемая система:

function carpet = sierpinski(nLevels,classname)
if nargin == 1
    classname = 'single';
end

% original line: mSize = 3^nLevels;
mSize = "That's clearly wrong here";
carpet = ones(mSize,classname);

cutCarpet(1,1,mSize,nLevels) % begin recursion

    function cutCarpet(x,y,s,cL)
        if cL
            ss = s/3; % define subsize
            for lx = 0:2
                for ly = 0:2
                    if lx == 1 && ly == 1  
                        % remove center square
                        carpet(x+ss:x+2*ss-1,y+ss:y+2*ss-1) = 0;
                    else
                        % recurse
                        cutCarpet(x + lx*ss, y + ly*ss, ss, cL-1)
                    end
                end
            end
        end
    end
end

Я изменил определение mSize на строку, чтобы вызвать ошибку. Теперь, если я запускаю тесты, все тесты приведут к ошибке. Мне интересно, можно ли остановитьтесты как можно скорее, т. е. после появления первой ошибки?

Проблема, которую я вижу, состоит в том, что тестовый код даже не достигнет последней строки testRemainPixels (testCase.verifyNumElements(actPixels,expPixelCount)). FatalAssert не помогает приэта точка, верно?

1 Ответ

0 голосов
/ 30 мая 2019

Предполагая, что вы используете тестовую среду, встроенную в MATLAB, взгляните на типы квалификаций, в частности на маркированный список в верхней части этой страницы:

https://www.mathworks.com/help/matlab/matlab_prog/types-of-qualifications.html

Если вы хотите остановить весь сеанс тестирования, вы можете использовать фатальные утверждения. Если вы хотите, чтобы другие тесты продолжались, вы можете использовать утверждения. Если вы хотите пропустить все тестовые методы (и параметризации) в одном файле, вы можете использовать утверждение в TestClassSetup или просто добавить базовый шаг упражнения на уровне «дыма» кода в TestClassSetup, и если он ошибается, он будет вести себя как утверждение .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...