matlabtest.selectors.DependsOn - Select TestSuite array elements by source code
dependency - MATLAB ([original](https://in.mathworks.com/help/matlab-test/ref/matlabtest.selectors.dependson-class.html)) ([raw](?raw))
Namespace: matlabtest.selectors
Superclasses: matlab.unittest.selectors.Selector
Select TestSuite
array elements by source code dependency
Since R2023a
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([sources](#mw%5F03253f22-efb8-40b5-b2c7-d3c734d67053))
creates a selector that selects TestSuite array elements that depend on the specified source code.
selector = matlabtest.selectors.DependsOn([sources](#mw%5F03253f22-efb8-40b5-b2c7-d3c734d67053),[Name=Value](#namevaluepairarguments))
specifies options using one or more name-value arguments. For example, 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
. sources
does not resolve to an existing file.
This argument sets the [Sources](matlabtest.selectors.dependson-class.html#mw%5Fa903896a-2b36-4be0-a083-64260335e65d)
property.
Example: pwd
Example: ["myFile.m" "myFolder"]
Example: ["folderA" "C:\work\folderB"]
Name-Value Arguments
Specify optional pairs of arguments asName1=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](matlabtest.selectors.dependson-class.html#mw%5Fc5aaafcd-bbbf-4c12-939f-cc517ab0e9e5)
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 bysources
.
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 folderC:\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 theTest
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 R2023a
When 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.