本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

使用类来编写设置代码和拆解代码

测试脚手架

测试脚手架是设置和拆解代码,用于设置系统的预测试状态并在运行测试后将其恢复为原始状态。设置和拆解方法在 TestCase 类中由以下方法属性定义:

  • TestMethodSetupTestMethodTeardown 方法在每个测试方法之前和之后运行。

  • TestClassSetupTestClassTeardown 方法在测试用例中的所有测试方法之前和之后运行。

该测试框架保证在子类中执行 TestMethodSetupTestClassSetup 方法之前先执行超类的对应方法。

测试作者最好使用 addTeardown 方法从 TestMethodSetupTestClassSetup 块中执行所有拆解活动,而不是在 TestMethodTeardownTestClassTeardown 块中实现相应的拆解方法。这样可保证拆解按与设置相反的顺序执行,还可确保测试内容满足异常安全条件。

包含方法级设置代码的测试用例

以下测试用例 FigurePropertiesTest 包含方法级设置代码。TestMethodSetup 方法在运行每个测试之前创建一个图窗,TestMethodTeardown 在运行测试之后关闭图窗。如前所述,您应该尽量使用 addTeardown 方法来定义拆解活动。但为了直观易懂,以下示例显示了 TestMethodTeardown 块的实现。

classdef FigurePropertiesTest < matlab.unittest.TestCase
 
    properties
        TestFigure
    end
 
    methods(TestMethodSetup)
        function createFigure(testCase)
            % comment
            testCase.TestFigure = figure;
        end
    end
 
    methods(TestMethodTeardown)
        function closeFigure(testCase)
            close(testCase.TestFigure)
        end
    end
 
    methods(Test)
 
        function defaultCurrentPoint(testCase)
 
            cp = testCase.TestFigure.CurrentPoint;
            testCase.verifyEqual(cp, [0 0], ...
                'Default current point is incorrect')
        end
 
        function defaultCurrentObject(testCase)
            import matlab.unittest.constraints.IsEmpty
 
            co = testCase.TestFigure.CurrentObject;
            testCase.verifyThat(co, IsEmpty, ...
                'Default current object should be empty')
        end
 
    end
 
end

包含类级设置代码的测试用例

以下测试用例 BankAccountTest 包含类级设置代码。

要设置 BankAccountTest(用于测试开发类 - 典型工作流中所述的 BankAccount 类示例),请添加一个 TestClassSetup 方法 addBankAccountClassToPath。此方法添加指向 BankAccount 示例文件的路径。通常,您使用 PathFixture 设置路径。为了直观易懂,以下示例采用手动方式执行设置和拆解活动。

classdef BankAccountTest < matlab.unittest.TestCase
    % Tests the BankAccount class.
    
    methods (TestClassSetup)
        function addBankAccountClassToPath(testCase)
            p = path;
            testCase.addTeardown(@path,p);
            addpath(fullfile(matlabroot,'help','techdoc','matlab_oop',...
                'examples'));
        end
    end
    
    methods (Test)
        function testConstructor(testCase)
            b = BankAccount(1234, 100);
            testCase.verifyEqual(b.AccountNumber, 1234, ...
                'Constructor failed to correctly set account number');
            testCase.verifyEqual(b.AccountBalance, 100, ...
                'Constructor failed to correctly set account balance');
        end
        
        function testConstructorNotEnoughInputs(testCase)
            import matlab.unittest.constraints.Throws;
            testCase.verifyThat(@()BankAccount, ...
                Throws('MATLAB:minrhs'));
        end
        
        function testDesposit(testCase)
            b = BankAccount(1234, 100);
            b.deposit(25);
            testCase.verifyEqual(b.AccountBalance, 125);
        end
        
        function testWithdraw(testCase)
            b = BankAccount(1234, 100);
            b.withdraw(25);
            testCase.verifyEqual(b.AccountBalance, 75);
        end
        
        function testNotifyInsufficientFunds(testCase)
            callbackExecuted = false;
            function testCallback(~,~)
                callbackExecuted = true;
            end
            
            b = BankAccount(1234, 100);
            b.addlistener('InsufficientFunds', @testCallback);
            
            b.withdraw(50);
            testCase.assertFalse(callbackExecuted, ...
                'The callback should not have executed yet');
            b.withdraw(60);
            testCase.verifyTrue(callbackExecuted, ...
                'The listener callback should have fired');
        end
    end
end

另请参阅

|

相关主题