Main Content

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

测试脚手架

测试脚手架是设置和拆解代码,用于设置系统的预测试状态并在运行测试后将其恢复为原始状态。设置和拆解方法在 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)
            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

另请参阅

|

相关主题