动态过滤的测试
假设失败会生成已过滤的测试。在 matlab.unittest.TestResult
类中,此类测试标记为 Incomplete
。
因为通过使用假设过滤测试内容不会产生测试失败,所以这可能生成无效的测试代码。要避免此结果,需要监视已过滤的测试。
测试方法
如果在带有 Test
属性的 TestCase
方法内部遇到假设失败,整个方法将标记为已过滤,但 MATLAB® 会运行后续 Test
方法。
下面的类包含 Test
块中的其中一个方法的假设失败。
classdef ExampleTest < matlab.unittest.TestCase methods(Test) function testA(testCase) testCase.verifyTrue(true) end function testB(testCase) testCase.assumeEqual(0,1) % remaining test code is not exercised end function testC(testCase) testCase.verifyFalse(true) end end end
因为 testB
方法包含假设失败,所以当您运行测试时,测试框架过滤该测试并将其标记为未完成。在 testB
中的假设失败之后,测试框架会继续执行 testC
,其中包含验证失败。
ts = matlab.unittest.TestSuite.fromClass(?ExampleTest); res = ts.run;
Running ExampleTest . ================================================================================ ExampleTest/testB was filtered. Details ================================================================================ . ================================================================================ Verification failed in ExampleTest/testC. --------------------- Framework Diagnostic: --------------------- verifyFalse failed. --> The value must evaluate to "false". Actual logical: 1 ------------------ Stack Information: ------------------ In C:\work\ExampleTest.m (ExampleTest.testC) at 11 ================================================================================ . Done ExampleTest __________ Failure Summary: Name Failed Incomplete Reason(s) ================================================================ ExampleTest/testB X Filtered by assumption. ---------------------------------------------------------------- ExampleTest/testC X Failed by verification.
如果您检查 TestResult
,则会注意到有一个通过的测试,一个失败的测试和一个由于假设失败而未完成的测试。
res
res = 1×3 TestResult array with properties: Name Passed Failed Incomplete Duration Details Totals: 1 Passed, 1 Failed, 1 Incomplete. 2.4807 seconds testing time.
测试框架跟踪未完成的测试,以便监视已过滤测试中是否有未执行的测试代码。您可以在 TestResult
对象中查看有关这些测试的信息。
res([res.Incomplete])
ans = TestResult with properties: Name: 'ExampleTest/testB' Passed: 0 Failed: 0 Incomplete: 1 Duration: 2.2578 Details: [1×1 struct] Totals: 0 Passed, 0 Failed, 1 Incomplete. 2.2578 seconds testing time.
要仅从已过滤测试创建经过修改的测试套件,请从原始测试套件选择未完成的测试。
tsFiltered = ts([res.Incomplete])
tsFiltered = Test with properties: Name: 'ExampleTest/testB' ProcedureName: 'testB' TestClass: "ExampleTest" BaseFolder: 'C:\work' Parameterization: [0×0 matlab.unittest.parameters.EmptyParameter] SharedTestFixtures: [0×0 matlab.unittest.fixtures.EmptyFixture] Tags: {1×0 cell} Tests Include: 0 Parameterizations, 0 Shared Test Fixture Classes, 0 Tags.
方法设置和拆解代码
如果在带有 TestMethodSetup
属性的 TestCase
方法内遇到假设失败,MATLAB 会过滤本应为该实例运行的方法。如果某测试使用 TestMethodSetup
块中的假设,则考虑使用 TestClassSetup
块中的假设,这同样会过滤该类中的所有 Test
方法,但不够详尽而效果更高。
ExampleTest.m
中的以下 TestMethodSetup
块中的一个方法包含假设失败。
methods(TestMethodSetup) function setupMethod1(testCase) testCase.assumeEqual(1,0) % remaining test code is not exercised end function setupMethod2(testCase) disp('* Running setupMethod2 *') testCase.assertEqual(1,1) end end
当您运行测试时,您会看到该框架执行完 TestMethodSetup
块中不包含假设失败的所有方法,并将 Test
块中的所有方法标记为未完成。
ts = matlab.unittest.TestSuite.fromClass(?ExampleTest); res = ts.run;
Running ExampleTest ================================================================================ ExampleTest/testA was filtered. Details ================================================================================ * Running setupMethod2 * . ================================================================================ ExampleTest/testB was filtered. Details ================================================================================ * Running setupMethod2 * . ================================================================================ ExampleTest/testC was filtered. Details ================================================================================ * Running setupMethod2 * . Done ExampleTest __________ Failure Summary: Name Failed Incomplete Reason(s) ================================================================ ExampleTest/testA X Filtered by assumption. ---------------------------------------------------------------- ExampleTest/testB X Filtered by assumption. ---------------------------------------------------------------- ExampleTest/testC X Filtered by assumption.
Test
方法未更改,但由于 TestMethodSetup
块中存在假设失败,所有 3 个均已过滤。测试框架执行 TestMethodSetup
块中不含假设失败的方法,例如 setupMethod2
。和预期一样,测试框架执行 setupMethod2
3 次,每个 Test
方法之前各一次。
类设置和拆解代码
如果在带有 TestClassSetup
或 TestClassTeardown
属性的 TestCase
方法内遇到假设失败,MATLAB 会过滤整个 TestCase
类。
ExampleTest.m
中的以下 TestClassSetup
块中的方法包含假设失败。
methods(TestClassSetup) function setupClass(testCase) testCase.assumeEqual(1,0) % remaining test code is not exercised end end
当您运行测试时,您会看到该框架不执行 TestMethodSetup
或 Test
中的任何方法。
ts = matlab.unittest.TestSuite.fromClass(?ExampleTest); res = ts.run;
Running ExampleTest ================================================================================ All tests in ExampleTest were filtered. Details ================================================================================ Done ExampleTest __________ Failure Summary: Name Failed Incomplete Reason(s) ================================================================ ExampleTest/testA X Filtered by assumption. ---------------------------------------------------------------- ExampleTest/testB X Filtered by assumption. ---------------------------------------------------------------- ExampleTest/testC X Filtered by assumption.
Test
和 TestMethodSetup
方法未更改,但由于 TestClassSetup
块中存在假设失败,所有内容均已过滤。
另请参阅
matlab.unittest.qualifications.Assumable
| matlab.unittest.TestCase
| matlab.unittest.TestResult