Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

动态过滤的测试

假设失败会生成已过滤的测试。在 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

 更新的 ExampleTest 类定义

当您运行测试时,您会看到该框架执行完 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 方法之前各一次。

类设置和拆解代码

如果在带有 TestClassSetupTestClassTeardown 属性的 TestCase 方法内遇到假设失败,MATLAB 会过滤整个 TestCase 类。

ExampleTest.m 中的以下 TestClassSetup 块中的方法包含假设失败。

    methods(TestClassSetup)
        function setupClass(testCase)
            testCase.assumeEqual(1,0)
            % remaining test code is not exercised
        end
    end

 更新的 ExampleTest 类定义

当您运行测试时,您会看到该框架不执行 TestMethodSetupTest 中的任何方法。

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.

TestTestMethodSetup 方法未更改,但由于 TestClassSetup 块中存在假设失败,所有内容均已过滤。

另请参阅

| |