matlabtest.selectors.DependsOn Class
Namespace: matlabtest.selectors
Superclasses: matlab.unittest.selectors.Selector
Description
The matlabtest.selectors.DependsOn class provides a selector for filtering
a test suite based on the source code that tests depend on.
Creation
Description
selector = matlabtest.selectors.DependsOn(
specifies options using one or more name-value arguments. For example, sources,Name=Value)selector =
matlabtest.selectors.DependsOn(pwd,IncludingSubfolders=true) creates a
selector that selects tests that depend on the source code in the current folder and its
subfolders.
Input Arguments
Names of source files and folders, specified as a string vector, character vector,
or cell vector of character vectors. You can specify paths relative to the current
folder or full paths. If sources includes folders, the selector
extracts the paths to the files in the folders.
The selector throws an error for these conditions:
You explicitly specify a missing file or folder in
sources.sourcesdoes not resolve to an existing file.
This argument sets the Sources property.
Example: pwd
Example: ["myFile.m" "myFolder"]
Example: ["folderA" "C:\work\folderB"]
Name-Value Arguments
Specify optional pairs of arguments as
Name1=Value1,...,NameN=ValueN, where Name is
the argument name and Value is the corresponding value.
Name-value arguments must appear after other arguments, but the order of the
pairs does not matter.
Example:
selector = matlabtest.selectors.DependsOn(pwd,IncludingSubfolders=true)
Option to include source code in the subfolders of sources, specified as a numeric or logical 0
(false) or 1 (true). By
default, the selector ignores the source code defined in the subfolders of the
folder specified in sources.
Maximum search depth for dependency analysis, specified as a positive integer scalar. The depth of a dependency is a measure of how directly a test depends on a source file. A file that is directly used by a test has a depth of 1. A file directly used by such a file has a depth of 2, and so on. By default, the selector considers all direct and transitive dependencies.
This argument sets the MaxDepth property.
Data Types: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
Properties
Names of source files and folders, specified as a string vector, character vector, or cell vector of character vectors, and stored as a string column vector. Tests must depend on these source files and folders to be included in the filtered test suite.
This property is set by the sources
input argument. The property contains the full paths to the source files specified by
sources.
Attributes:
GetAccess | public |
SetAccess | immutable |
Maximum search depth for dependency analysis, specified as a positive integer scalar, and stored as a double scalar. By default, the selector considers all the direct and transitive dependencies.
This property is set by the MaxDepth name-value argument.
Attributes:
GetAccess | public |
SetAccess | immutable |
Examples
Create filtered test suites by selecting tests using the DependsOn class.
Open the example to access the required files and folders. When you open the example, the tests subfolder of your current folder contains tests defined in the BankAccountTest.m and DocPolynomTest.m files. The source subfolder contains the source code required by the tests.
BankAccountTest Class Definition
This code shows the contents of the BankAccountTest class definition file, which uses a shared fixture to access the folder that defines the BankAccount class. For more information about the BankAccount class and to view the class code, see Developing Classes That Work Together.
classdef (SharedTestFixtures={ ... matlab.unittest.fixtures.PathFixture( ... fullfile("..","source"))}) ... 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
DocPolynomTest Class Definition
This code shows the contents of the DocPolynomTest class definition file, which uses a shared fixture to access the folder that defines the DocPolynom class. For more information about the DocPolynom class and to view the class code, see Representing Polynomials with Classes.
classdef (SharedTestFixtures={ ... matlab.unittest.fixtures.PathFixture( ... fullfile("..","source"))}) ... DocPolynomTest < matlab.unittest.TestCase properties TextToDisplay = "Equation under test: " end methods (Test) function testConstructor(testCase) p = DocPolynom([1 0 1]); testCase.verifyClass(p,?DocPolynom) end function testAddition(testCase) p1 = DocPolynom([1 0 1]); p2 = DocPolynom([5 2]); actual = p1 + p2; expected = DocPolynom([1 5 3]); diagnostic = [testCase.TextToDisplay ... "(x^2 + 1) + (5*x + 2) = x^2 + 5*x + 3"]; testCase.verifyEqual(actual,expected,diagnostic) end function testMultiplication(testCase) p1 = DocPolynom([1 0 3]); p2 = DocPolynom([5 2]); actual = p1 * p2; expected = DocPolynom([5 2 15 6]); diagnostic = [testCase.TextToDisplay ... "(x^2 + 3) * (5*x + 2) = 5*x^3 + 2*x^2 + 15*x + 6"]; testCase.verifyEqual(actual,expected,diagnostic) end end end
Create Test Suites
First, import the DependsOn class and add the source folder to the path.
import matlabtest.selectors.DependsOn addpath("source")
Create a test suite from the tests subfolder of your current folder. Then, display the names of the TestSuite array elements. The test suite contains five tests from the BankAccountTest class and three tests from the DocPolynomTest class.
suite = testsuite("tests");
disp({suite.Name}') {'BankAccountTest/testConstructor' }
{'BankAccountTest/testConstructorNotEnoughInputs'}
{'BankAccountTest/testDeposit' }
{'BankAccountTest/testWithdraw' }
{'BankAccountTest/testNotifyInsufficientFunds' }
{'DocPolynomTest/testConstructor' }
{'DocPolynomTest/testAddition' }
{'DocPolynomTest/testMultiplication' }
Select all the tests that depend on the DocPolynom class definition file. The filtered test suite contains the tests from the DocPolynomTest class because only these tests depend on the specified source code.
suite1 = suite.selectIf(DependsOn("source\DocPolynom.m"));
disp({suite1.Name}') {'DocPolynomTest/testConstructor' }
{'DocPolynomTest/testAddition' }
{'DocPolynomTest/testMultiplication'}
Select all the tests that do not depend on the DocPolynom class definition file. The filtered test suite contains the tests from the BankAccountTest class.
suite2 = suite.selectIf(~DependsOn("source\DocPolynom.m"));
disp({suite2.Name}') {'BankAccountTest/testConstructor' }
{'BankAccountTest/testConstructorNotEnoughInputs'}
{'BankAccountTest/testDeposit' }
{'BankAccountTest/testWithdraw' }
{'BankAccountTest/testNotifyInsufficientFunds' }
Select all the tests that depend on the current folder and any of its subfolders. The resulting test suite contains all the tests in the original test suite.
suite3 = suite.selectIf(DependsOn(pwd,IncludingSubfolders=true));
disp({suite3.Name}') {'BankAccountTest/testConstructor' }
{'BankAccountTest/testConstructorNotEnoughInputs'}
{'BankAccountTest/testDeposit' }
{'BankAccountTest/testWithdraw' }
{'BankAccountTest/testNotifyInsufficientFunds' }
{'DocPolynomTest/testConstructor' }
{'DocPolynomTest/testAddition' }
{'DocPolynomTest/testMultiplication' }
Create a filtered test suite by selecting tests in a project that depend on the modified files in the project.
First, import the classes used in this example.
import matlab.unittest.TestSuite import matlabtest.selectors.DependsOn
This example assumes that a project exists in the folder
C:\work\myProject. Open the project and return the modified files
in the project.
proj = openProject("C:\work\myProject");
modifiedFiles = listModifiedFiles(proj);
Create an array containing the names of the modified files.
sources = [modifiedFiles.Path];
Create a test suite from the test files in the project with the
Test label. Then, create a filtered test suite that contains only
the tests that depend on the modified files.
suite = TestSuite.fromProject(proj); filteredSuite = TestSuite.empty; if ~isempty(sources) filteredSuite = suite.selectIf(DependsOn(sources)); end
Tips
To identify tests that depend on source code, the selector runs a dependency analysis similar to that of the Dependency Analyzer app. For more information about dependency analysis and its limitations, see Dependency Analyzer Scope and Limitations.
Version History
Introduced in R2023aWhen selecting function-based or class-based tests, the selector selects tests that depend on the specified source code with greater accuracy. If the selector can determine which individual tests in the test file depend on the source code, then it selects only the dependent tests and excludes the rest. Otherwise, the selector includes all the tests in the test file.
In previous releases, the selector includes all the tests in a test file if the file depends on the specified source code, without attempting to exclude tests that are not dependent on the source code.
A selector created with the DependsOn class supports source files of
any type. In previous releases, the selector supports
files only with a .m, .p, .mlx,
.mlapp, .mat, or .slx
extension.
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)