Add Plugin to Test Runner - MATLAB & Simulink (original) (raw)

This example shows how to add a plugin to the test runner. The example adds a plugin created using the matlab.unittest.plugins.TestRunProgressPlugin class, which reports on test run progress.

Create Tests for BankAccount Class

In a file named BankAccount.m in your current folder, create the BankAccount class.

classdef BankAccount < handle properties (Access = ?AccountManager) AccountStatus = 'open'; end properties (SetAccess = private) AccountNumber AccountBalance end properties (Transient) AccountListener end events InsufficientFunds end methods function BA = BankAccount(accNum,initBal) BA.AccountNumber = accNum; BA.AccountBalance = initBal; BA.AccountListener = AccountManager.addAccount(BA); end function deposit(BA,amt) BA.AccountBalance = BA.AccountBalance + amt; if BA.AccountBalance > 0 BA.AccountStatus = 'open'; end end function withdraw(BA,amt) if (strcmp(BA.AccountStatus,'closed') && ... BA.AccountBalance < 0) disp(['Account ',num2str(BA.AccountNumber), ... ' has been closed.']) return end newbal = BA.AccountBalance - amt; BA.AccountBalance = newbal; if newbal < 0 notify(BA,'InsufficientFunds') end end function getStatement(BA) disp('-------------------------') disp(['Account: ',num2str(BA.AccountNumber)]) ab = sprintf('%0.2f',BA.AccountBalance); disp(['CurrentBalance: ',ab]) disp(['Account Status: ',BA.AccountStatus]) disp('-------------------------') end end methods (Static) function obj = loadobj(s) if isstruct(s) accNum = s.AccountNumber; initBal = s.AccountBalance; obj = BankAccount(accNum,initBal); else obj.AccountListener = AccountManager.addAccount(s); end end end end

In another file named BankAccountTest.m in your current folder, create a test class to test the BankAccount class.

classdef BankAccountTest < matlab.unittest.TestCase methods (Test) function testConstructor(testCase) b = BankAccount(1234,100); testCase.verifyEqual(b.AccountNumber,1234, ... "Constructor must correctly set account number.") testCase.verifyEqual(b.AccountBalance,100, ... "Constructor must correctly set account balance.") end

    function testConstructorNotEnoughInputs(testCase)
        import matlab.unittest.constraints.Throws
        testCase.verifyThat(@()BankAccount,Throws("MATLAB:minrhs"))
    end

    function testDeposit(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

Create Test Suite

Create a test suite from the BankAccountTest test class.

suite = matlab.unittest.TestSuite.fromClass(?BankAccountTest);

Run Tests with No Plugins

Create a test runner with no plugins, and use it to run the tests. The test runner runs the tests silently and does not display any messages.

runner = matlab.unittest.TestRunner.withNoPlugins; runner.run(suite);

Run Tests with Plugin

Add a TestRunProgressPlugin instance to the test runner, and run the tests again. The test runner now displays test run progress about BankAccountTest. (Default test runners already include this plugin.)

import matlab.unittest.plugins.TestRunProgressPlugin runner.addPlugin(TestRunProgressPlugin.withVerbosity(2)) runner.run(suite);

Running BankAccountTest ..... Done BankAccountTest


See Also

matlab.unittest.plugins