Динамически фильтруемые тесты

Отказы предположения производят отфильтрованные тесты. В классе matlab.unittest.TestResult таким тестом является отмеченный Incomplete.

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

Методы тестирования

Если с отказом предположения сталкиваются в методе TestCase с атрибутом Test, целый метод отмечен, как отфильтровано, но 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.

Setup метода и код отключения

Если с отказом предположения сталкиваются в методе TestCase с атрибутом TestMethodSetup, MATLAB фильтрует метод, который должен был быть запущен для того экземпляра. Если тест использует предположения из блока TestMethodSetup, рассмотрите вместо этого использование предположений в блоке TestClassSetup, который аналогично фильтрует все методы Test в классе, но менее многословен и более эффективен.

Один из методов в следующем блоке TestMethodSetup в ExampleTest.m содержит отказ предположения.

    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 не изменились, но все 3 отфильтрованы из-за отказа предположения в блоке TestMethodSetup. Среда тестирования выполняет методы в блоке TestMethodSetup без отказов предположения, таких как setupMethod2. Как ожидалось среда тестирования выполняет setupMethod2 3 раза, однажды каждый метод Test.

Setup класса и код отключения

Если с отказом предположения сталкиваются в методе TestCase с TestClassSetup или атрибутом TestClassTeardown, MATLAB фильтрует целый класс TestCase.

Методы в следующем блоке TestClassSetup в ExampleTest.m содержат отказ предположения.

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

 Обновленное определение класса ExampleTest

Когда вы запускаете тест, вы видите, что среда не выполняет ни одного из методов в 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.

Смотрите также

| |

Была ли эта тема полезной?