我可以抑制Matlab单元测试框架令人讨厌的调用堆栈的警告吗?

时间:2019-06-28 08:23:19

标签: matlab unit-testing

Matlab的UT框架似乎可以打印出框架本身内部方法的长调用堆栈。如果您的测试用例引起很多警告,那么这将导致令人讨厌的完全无用的信息泛滥。有没有办法抑制调用堆栈,而不是警告本身?

示例代码:

classdef fooTest < matlab.unittest.TestCase

    methods (Test)

        function bar(testCase)      
            testCase.verifyEqual(0,0);
            warning('!!!!!');
        end       
    end
end

运行测试:

>> result = run(fooTest);
Running fooTest
Warning: !!!!! 
> In fooTest/bar (line 7)
  In matlab.unittest.TestRunner/evaluateMethodCore (line 790)
  In matlab.unittest.TestRunner/evaluateMethodsOnTestContent (line 737)
  In matlab.unittest.TestRunner/runTestMethod (line 1061)
  In matlab.unittest.TestRunner/runTest (line 1015)
  In matlab.unittest.TestRunner/repeatTest (line 441)
  In matlab.unittest.TestRunner/runSharedTestCase (line 416)
  In matlab.unittest.TestRunner/runTestClass (line 943)
  In matlab.unittest.TestRunner/invokeTestContentOperatorMethod_ (line 838)
  In matlab.unittest.plugins.TestRunnerPlugin/runTestClass (line 407)
  In matlab.unittest.plugins.testrunprogress.ConciseProgressPlugin/runTestClass (line 61)
  In matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_ (line 696)
  In matlab.unittest.TestRunner/evaluateMethodOnPlugins (line 696)
  In matlab.unittest.TestRunner/runTestSuite (line 880)
  In matlab.unittest.TestRunner/invokeTestContentOperatorMethod_ (line 838)
  In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite (line 250)
  In matlab.unittest.plugins.FailureDiagnosticsPlugin/runTestSuite (line 106)
  In matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_ (line 696)
  In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite (line 250)
  In matlab.unittest.plugins.DiagnosticsRecordingPlugin/runTestSuite (line 184)
  In matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_ (line 696)
  In matlab.unittest.plugins.TestRunnerPlugin/runTestSuite (line 250)
  In sltest.testmanager.plugins.TestManagerResultsPlugin/runTestSuite (line 60)
  In matlab.unittest.plugins.TestRunnerPlugin/invokeTestContentOperatorMethod_ (line 696)
  In matlab.unittest.TestRunner/evaluateMethodOnPlugins (line 696)
  In matlab.unittest.TestRunner/run (line 288)
  In matlab.unittest.TestSuite/run (line 543)
  In matlab.unittest.internal.RunnableTestContent/run (line 48) 
.
Done fooTest
__________

2 个答案:

答案 0 :(得分:1)

您使用的是哪个版本的MATLAB?在较新的版本中,对这些堆栈框架进行了修剪,以便不包括框架堆栈,但仍显示从测试到测试代码的相关堆栈框架。

您的完全翻转堆栈框架的解决方案对于较早的版本可能是一个不错的解决方法,但这是一个很大的锤子,较新的版本应为您提供较少的无关信息,同时仍为您提供更可能有用。

此外,我当然会鼓励您以无任何警告的方式运行测试代码。它们肯定可以指示问题。实际上,您可以将运行程序配置为更严格,并且在出现这些警告时失败,以保持测试的清洁度。为此,请使用FailOnWarningsPluginruntests(..., 'Strict',true)。如果您确实有一个有效的警告,则您应该可以使用verifyWarning方法或IssuesWarnings约束对此进行测试,该约束条件与此工作流配合得很好并且可以正确执行。最后,如果在某些情况下您没有测试警告,但由于某种原因您无法避免发出警告,则可以利用SuppressedWarningsFixture

希望有帮助,

安迪

答案 1 :(得分:0)

我找到了:

  
    

warning('off','backtrace')