Как предотвратить тест Matlab с помощью «assertWarning» на вывод текста предупреждения на консоль? - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь внедрить базовую среду тестирования в Matlab в качестве моей первой попытки Test-Driven-Development. Один из тестов, которые я пытаюсь создать, предназначен для проверки того, что моя функция выдает конкретное предупреждение при определенных условиях ввода. Мой код проходит тесты, связанные с предупреждением, как и предполагалось, однако это вызывает огромное раздражение.

При выполнении (и прохождении) тестов, включающих функции «assertWarning» или «verifyWarning», предупреждения, которые должны быть вызваны, выводятся в командное окно и визуально нарушают распечатку моего набора тестов. Есть ли способ предотвратить печать (желаемого) предупреждения на консоли только при запуске в тестах, при этом проверяя, сработало ли предупреждение? Пример тестовой функции, которая вызывает эту надоедливую распечатку предупреждения: ниже.

function testAcceleratorMax(testCase)
% Validate that acceleration input is forced to be <=1 and throws warning
state = [0,0,0,0]; input = [2,0];
xd = getPointMass2D_dot(state,input);
assert(isequal(xd,[0,0,1,0]),'Acceleration not ceiled correctly');
verifyWarning(testCase,@(x) getPointMass2D_dot(state,input),...
    'MATLAB:CommandedAccelOutOfBounds');
end

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Я нашел способ уменьшить раздражение печати предупреждений при запуске набора тестов. Однако это может вызвать некоторые более поздние проблемы. В функции настройки для набора тестов вы можете установить краткие предупреждения и отключить обратную трассировку (и сбросить их до их состояния по умолчанию в функции разрыва).

function setup(testCase)
warning off verbose;
warning off backtrace;
end

function teardown(testCase)
warning on verbose;
warning on backtrace;
end

Как вы можете видеть ниже, это значительно сокращает объем печати текста предупреждения на консоль. Однако, если во время процесса TDD вы захотите использовать обратную трассировку непреднамеренного неудачного теста, вам придется включить обратную трассировку предупреждения. Я полагаю, вы можете вручную включить или отключить функцию обратного отслеживания в каждом функциональном тесте, но это все равно не кажется оптимальным решением.

Пример вывода командного окна с выключенным многословием, обратным ходом выключено:

> Running tests_getPointMass2D_dot  
> .....Warning: The acceleration commanded was set to the max accel allowed  
> .Warning: The acceleration commanded was set to the min accel allowed  
> .Warning: The steering commanded was set to the max steer allowed  
> .Warning: The steering commanded was set to the min steer allowed  
> .  
> Done tests_getPointMass2D_dot
> __________
> Totals:    9 Passed, 0 Failed, 0 Incomplete.   
> 0.19797 seconds testing time.

Пример вывода командного окна с подробным включением и обратным ходом:

> Running tests_getPointMass2D_dot .....Warning: The acceleration
> commanded was set to the max accel allowed (Type "warning off
> MATLAB:CommandedAccelOutOfBounds" to suppress this warning.)
>  
> > In getPointMass2D_dot (line 43)   In tests_getPointMass2D_dot>testAcceleratorMax (line 55)   In
> matlab.unittest.FunctionTestCase/test (line 98)   In
> matlab.unittest.TestRunner/evaluateMethodCore (line 995)   In
> matlab.unittest.TestRunner/evaluateMethodsOnTestContent (line 936)  
> In matlab.unittest.TestRunner/runTestMethod (line 1287)   In
> matlab.unittest.TestRunner/runTest (line 1244)   In
> matlab.unittest.TestRunner/repeatTest (line 586)   In
> matlab.unittest.TestRunner/runSharedTestCase (line 548)   In
> matlab.unittest.TestRunner/runTestClass (line 1170)   In
> matlab.unittest.TestRunner/invokeTestContentOperatorMethod_ (line
> 1037)   In matlab.unittest.plugins.TestRunnerPlugin/runTestClass (line
> 378)   In
> matlab.unittest.plugins.testrunprogress.ConciseProgressPlugin/runTestClass
> (line 68)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.TestRunner/evaluateMethodOnPlugins
> (line 895)   In matlab.unittest.TestRunner/runTestSuite (line 1102)  
> In matlab.unittest.TestRunner/invokeTestContentOperatorMethod_ (line
> 1037)   In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite (line
> 229)   In
> matlab.unittest.plugins.FailureDiagnosticsPlugin/runTestSuite (line
> 95)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite
> (line 229)   In
> matlab.unittest.internal.plugins.ListenerAdderPlugin/runTestSuite
> (line 29)   In
> matlab.unittest.plugins.DiagnosticsRecordingPlugin/runTestSuite (line
> 165)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.TestRunner/evaluateMethodOnPlugins
> (line 895)   In matlab.unittest.TestRunner/run (line 307)   In
> runtests (line 90)  .Warning: The acceleration commanded was set to
> the min accel allowed (Type "warning off
> MATLAB:CommandedAccelOutOfBounds" to suppress this warning.)
>  
> > In getPointMass2D_dot (line 47)   In tests_getPointMass2D_dot>testAcceleratorMin (line 64)   In
> matlab.unittest.FunctionTestCase/test (line 98)   In
> matlab.unittest.TestRunner/evaluateMethodCore (line 995)   In
> matlab.unittest.TestRunner/evaluateMethodsOnTestContent (line 936)  
> In matlab.unittest.TestRunner/runTestMethod (line 1287)   In
> matlab.unittest.TestRunner/runTest (line 1244)   In
> matlab.unittest.TestRunner/repeatTest (line 586)   In
> matlab.unittest.TestRunner/runSharedTestCase (line 548)   In
> matlab.unittest.TestRunner/runTestClass (line 1170)   In
> matlab.unittest.TestRunner/invokeTestContentOperatorMethod_ (line
> 1037)   In matlab.unittest.plugins.TestRunnerPlugin/runTestClass (line
> 378)   In
> matlab.unittest.plugins.testrunprogress.ConciseProgressPlugin/runTestClass
> (line 68)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.TestRunner/evaluateMethodOnPlugins
> (line 895)   In matlab.unittest.TestRunner/runTestSuite (line 1102)  
> In matlab.unittest.TestRunner/invokeTestContentOperatorMethod_ (line
> 1037)   In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite (line
> 229)   In
> matlab.unittest.plugins.FailureDiagnosticsPlugin/runTestSuite (line
> 95)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite
> (line 229)   In
> matlab.unittest.internal.plugins.ListenerAdderPlugin/runTestSuite
> (line 29)   In
> matlab.unittest.plugins.DiagnosticsRecordingPlugin/runTestSuite (line
> 165)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.TestRunner/evaluateMethodOnPlugins
> (line 895)   In matlab.unittest.TestRunner/run (line 307)   In
> runtests (line 90)  .Warning: The steering commanded was set to the
> max steer allowed (Type "warning off MATLAB:CommandedSteerOutOfBounds"
> to suppress this warning.)
>  
> > In getPointMass2D_dot (line 54)   In tests_getPointMass2D_dot>testSteeringMax (line 73)   In
> matlab.unittest.FunctionTestCase/test (line 98)   In
> matlab.unittest.TestRunner/evaluateMethodCore (line 995)   In
> matlab.unittest.TestRunner/evaluateMethodsOnTestContent (line 936)  
> In matlab.unittest.TestRunner/runTestMethod (line 1287)   In
> matlab.unittest.TestRunner/runTest (line 1244)   In
> matlab.unittest.TestRunner/repeatTest (line 586)   In
> matlab.unittest.TestRunner/runSharedTestCase (line 548)   In
> matlab.unittest.TestRunner/runTestClass (line 1170)   In
> matlab.unittest.TestRunner/invokeTestContentOperatorMethod_ (line
> 1037)   In matlab.unittest.plugins.TestRunnerPlugin/runTestClass (line
> 378)   In
> matlab.unittest.plugins.testrunprogress.ConciseProgressPlugin/runTestClass
> (line 68)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.TestRunner/evaluateMethodOnPlugins
> (line 895)   In matlab.unittest.TestRunner/runTestSuite (line 1102)  
> In matlab.unittest.TestRunner/invokeTestContentOperatorMethod_ (line
> 1037)   In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite (line
> 229)   In
> matlab.unittest.plugins.FailureDiagnosticsPlugin/runTestSuite (line
> 95)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite
> (line 229)   In
> matlab.unittest.internal.plugins.ListenerAdderPlugin/runTestSuite
> (line 29)   In
> matlab.unittest.plugins.DiagnosticsRecordingPlugin/runTestSuite (line
> 165)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.TestRunner/evaluateMethodOnPlugins
> (line 895)   In matlab.unittest.TestRunner/run (line 307)   In
> runtests (line 90)  .Warning: The steering commanded was set to the
> min steer allowed (Type "warning off MATLAB:CommandedSteerOutOfBounds"
> to suppress this warning.)
>  
> > In getPointMass2D_dot (line 58)   In tests_getPointMass2D_dot>testSteeringMin (line 82)   In
> matlab.unittest.FunctionTestCase/test (line 98)   In
> matlab.unittest.TestRunner/evaluateMethodCore (line 995)   In
> matlab.unittest.TestRunner/evaluateMethodsOnTestContent (line 936)  
> In matlab.unittest.TestRunner/runTestMethod (line 1287)   In
> matlab.unittest.TestRunner/runTest (line 1244)   In
> matlab.unittest.TestRunner/repeatTest (line 586)   In
> matlab.unittest.TestRunner/runSharedTestCase (line 548)   In
> matlab.unittest.TestRunner/runTestClass (line 1170)   In
> matlab.unittest.TestRunner/invokeTestContentOperatorMethod_ (line
> 1037)   In matlab.unittest.plugins.TestRunnerPlugin/runTestClass (line
> 378)   In
> matlab.unittest.plugins.testrunprogress.ConciseProgressPlugin/runTestClass
> (line 68)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.TestRunner/evaluateMethodOnPlugins
> (line 895)   In matlab.unittest.TestRunner/runTestSuite (line 1102)  
> In matlab.unittest.TestRunner/invokeTestContentOperatorMethod_ (line
> 1037)   In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite (line
> 229)   In
> matlab.unittest.plugins.FailureDiagnosticsPlugin/runTestSuite (line
> 95)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite
> (line 229)   In
> matlab.unittest.internal.plugins.ListenerAdderPlugin/runTestSuite
> (line 29)   In
> matlab.unittest.plugins.DiagnosticsRecordingPlugin/runTestSuite (line
> 165)   In
> matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_
> (line 658)   In matlab.unittest.TestRunner/evaluateMethodOnPlugins
> (line 895)   In matlab.unittest.TestRunner/run (line 307)   In
> runtests (line 90)  . Done tests_getPointMass2D_dot
> __________
> 
> 
> Totals:    9 Passed, 0 Failed, 0 Incomplete.  
>    0.20351 seconds testing time.
0 голосов
/ 24 августа 2018

Хотя это может быть не самое элегантное решение, я нашел гораздо менее навязчивый метод!

Шаг 1. Отключите определенные предупреждения, которые вы намеренно запускаете, в функции настройки набора тестов. Вы также можете сделать это и шаг 2 в каждой тестовой функции индивидуально, если это необходимо. Даже если предупреждение отключено и не выводится на экран в командном окне, вы можете получить доступ к подавленному предупреждению, используя «lastwarn».

function setup(testCase)
warning('off','MATLAB:CommandedAccelOutOfBounds');
warning('off','MATLAB:CommandedSteerOutOfBounds');
end

Шаг 2. Снова включите специальные предупреждения в функции разрыва комплекта тестов, чтобы вернуть matlab в правильное состояние после запуска комплекта тестов.

function teardown(testCase)
warning('on','MATLAB:CommandedAccelOutOfBounds');
warning('on','MATLAB:CommandedSteerOutOfBounds');
end

Шаг 3. Вместо использования функций «verifyWarning» или «assertWarning» для теста используйте «lastwarn» и «strcmp».

function testAcceleratorMax(testCase)
% Validate that acceleration input is forced to be <=1 and throws warning
state = [0,0,0,0]; input = [2,0];
xd = getPointMass2D_dot(state,input);
assert(isequal(xd,[0,0,1,0]),'Acceleration not ceiled correctly');
[~,warnID] = lastwarn; % Gets last warning, even though it was "off"
assert(strcmp(warnID,'MATLAB:CommandedAccelOutOfBounds'), 'Correct warning not thrown')
end
0 голосов
/ 24 августа 2018

Я не знаю много о том, что делает ваш код, но вы всегда можете сделать что-то вроде:

A = eye(2);
B = [3 6; 4 8];
evalc('C=B\A'); % the warning gets suppressed. It also gets outputted by this function, but it can also output other command window prints
lastwarn; %grab the last warning

Но ОСТОРОЖНО! evalc оценивает все, что попадает внутрь. Это включает в себя команды, которые уничтожат ваш компьютер, как system('suda rm -rf/')*

* опечатка специально.

...