生成已部署的代码工件并进行等效性测试
您可以编写使用 MATLAB® Compiler SDK™ 的等效性测试来:
构建一个 Java® 或 Python® 包、一个 .NET 组件、一个可部署存档 (自 R2024a 起)或一个可部署 C++ 共享库 (自 R2024b 起)。构建的包、程序集或存档被称为已部署的代码工件。
使用指定的输入执行已部署的代码工件。
验证部署的代码工件和 MATLAB 源代码的执行是否匹配。
您可以通过指定其他构建选项和参数化测试。您还可以在测试之外构建已部署的代码工件,稍后可以使用等效性测试进行验证。
注意
如果您需要将 C++ 代码部署为 MEX 函数、静态库或动态链接库,则可以编写等效性测试,使用 MATLAB Coder™ 构建和测试 C++ 代码与 MATLAB 源代码的等效性。有关详细信息,请参阅Choose an Approach for Equivalence Testing Generated C++ Code (MATLAB Test)。
您无法在 MATLAB Online™ 中生成已部署的代码工件或测试它们是否等效。
前提条件
要生成和测试 Java 或 Python 包或 .NET 程序集,您必须安装第三方软件。
.NET
验证您的设备是否满足 MATLAB Compiler SDK .NET 目标要求。有关详细信息,请参阅MATLAB Compiler SDK .NET 目标要求。
安装 Microsoft® Visual Studio®。
Java
安装与 MATLAB Compiler SDK 兼容的 Java 版本。有关受支持的 Java 版本的信息,请参阅 MATLAB 支持的其他语言接口。
有关在安装后配置开发环境的信息,请参阅配置用于生成 Java 包的环境。
Python
安装与 MATLAB Compiler SDK 兼容的 Python 版本。有关详细信息,请参阅 MATLAB 支持的其他语言接口。使用 pyenv
验证您安装的 Python 版本是否可以发现。
编写等效性测试来测试已部署的代码工件
要编写等效性测试来构建和测试已部署的代码工件,请定义一个从 matlabtest.compiler.TestCase
(MATLAB Test) 继承的测试类。在您的测试类中,包含一个 methods
属性的 Test
模块来包含测试。在 methods
模块中,添加一个函数来包含测试。
classdef tDeployment < matlabtest.compiler.TestCase methods (Test) function equivalenceTest(testCase) end end end
等效性测试通常做三件事:
构建 - 使用
build
(MATLAB Test) 构建已部署的代码工件。执行 - 使用
execute
(MATLAB Test) 执行已部署的代码工件。限定 - 通过使用
verifyExecutionMatchesMATLAB
(MATLAB Test) 等方法将部署代码工件的执行与 MATLAB 源代码的执行进行比较来限定结果。有关详细信息,请参阅Table of Qualifications for Equivalence Tests (MATLAB Test)。
假设您想要为名为 makesquare
函数生成一个 Python 包,该函数生成一个 n × n 矩阵:
function y = makesquare(x) y = magic(x); end
5
函数,并验证该执行是否与函数的 MATLAB 执行相匹配。classdef tDeployment < matlabtest.compiler.TestCase methods (Test) function pythonEquivalence(testCase) buildResults = build(testCase,"makesquare.m", ... "pythonPackage"); executionResults = execute(testCase,buildResults,{5}); verifyExecutionMatchesMATLAB(testCase,executionResults); end end end
参数化等价性测试
等效性测试使用 MATLAB 测试框架,这意味着您可以使用 MATLAB 测试自定义,例如参数化。参数化测试允许您使用比单独编码每个组合更少的代码来测试不同的参数组合。有关详细信息,请参阅创建基本参数化测试。参数化等效性测试允许您构建一次部署的代码工件并使用不同的参数组合对其测试。
参数化输入
您可以参数化输入,以使用不同的输入多次运行单个等效性测试。
该等效性测试使用类级属性和测试设置方法构建一次部署的代码工件,但使用参数化使用不同的输入多次执行部署的代码工件。
classdef tDeployment < matlabtest.compiler.TestCase properties BuildResults end methods (TestClassSetup) function buildPackage(testCase) testCase.BuildResults = build(testCase,"makesquare.m", ... "pythonPackage"); end end properties (TestParameter) Inputs = {{3},{5}}; end methods (Test) function pythonEquivalence(testCase,Inputs) executionResults = execute(testCase, ... testCase.BuildResults,Inputs); verifyExecutionMatchesMATLAB(testCase,executionResults); end end end
参数化测试以验证多项函数
您可以编写单个等效性测试,通过参数化函数输入来验证同一部署代码工件中的多个函数。如果您的函数接受不同数量的输入,请使用顺序参数组合将具有正确大小的输入集传递给相应的函数。
假设您想要构建一个 Python 包,其中包含函数 makesquare
和一个名为 myAdd
的函数,该函数将两个输入相加并输出结果:
function y = myAdd(a,b) y = a + b; end
classdef tDeployment < matlabtest.compiler.TestCase properties BuildResults end methods (TestClassSetup) function buildPackage(testCase) functionsToDeploy = ["makesquare.m","myAdd.m"]; testCase.BuildResults = build(testCase, ... functionsToDeploy,"pythonPackage"); end end properties (TestParameter) Name = {"makesquare","myAdd"}; Inputs = {{5},{1,6}}; end methods (Test,ParameterCombination="sequential") function pythonEquivalence(testCase,Inputs,Name) executionResults = execute(testCase, ... testCase.BuildResults,Inputs,Name); verifyExecutionMatchesMATLAB(testCase,executionResults); end end end
makesquare
,输入设置为 5
,并验证结果。然后,它将输入设置为 myAdd
和 1
来执行 6
并验证结果。使用附加选项构建已部署的代码工件
要自定义 MATLAB Compiler SDK 在等效性测试中构建已部署代码工件的方式,请为所需的构建类型创建一个构建选项对象:
此等效性测试从 makesquare
构建并测试 Python 包,指定包名称,并提供要包含在包中的其他文件。
classdef tDeployment < matlabtest.compiler.TestCase methods (Test) function pythonEquivalence(testCase) func = "makesquare.m"; buildOpts = compiler.build.PythonPackageOptions(func); buildOpts.PackageName = "PackageUnderTest"; buildOpts.AdditionalFiles = "makesquareData.mat"; buildResults = build(testCase,buildOpts); executionResults = execute(testCase,buildResults,{2}); verifyExecutionMatchesMATLAB(testCase,executionResults); end end end
测试现有的已部署代码工件
您可以在测试之外构建已部署的代码工件,并使用等效性测试来验证已部署的代码工件。
您只能测试现有的已部署代码工件,其 compiler.build.Results
对象指定了构建文件位置的绝对路径。使用以下函数之一构建已部署的代码工件时,请使用 OutputDir
名称-值参量指定绝对路径:
此代码显示了如何在测试之外为 Python 包创建构建结果,您可以稍后使用等效性测试来验证该结果。
func = "makesquare.m"; dir = "C:\Users\jdoe\pythonBuilds"; buildResults = compiler.build.pythonPackage(func,OutputDir=dir); save("pythonBuild.mat","buildResults")
注意
构建可部署存档时,必须使用 compiler.build.ProductionServerArchiveOptions
函数中的 FunctionSignatures
名称-值参量指定 MATLAB 函数签名 JSON 文件。此代码显示了如何为可部署存档等效性测试创建构建结果。
dir = "C:\Users\jdoe\productionServerArchiveBuilds"; sig = "makesquareSignatures.json"; opts = compiler.build.ProductionServerArchiveOptions("makesquare.m", ... FunctionSignatures=sig,OutputDir=dir); buildResults = compiler.build.productionServerArchive(opts); save("makesquareBuild.mat","buildResults")
该等效性测试加载包含 MATLAB 构建结果的 Python 文件并执行并验证给定输入的结果。
classdef tDeployment < matlabtest.compiler.TestCase methods (Test) function existingPythonEquivalence(testCase) loadedData = load("pythonBuild.mat"); buildResults = loadedData.buildResults; executionResults = execute(testCase,buildResults,{5}); verifyExecutionMatchesMATLAB(testCase,executionResults); end end end
提示
测试现有的已部署代码工件可以节省测试时间,因为测试现有工件消除了在运行测试时构建工件的需要。但是,测试中使用的部署代码工件可能没有来自 MATLAB 源代码的最新更改。
运行测试并查看结果
您可以使用以下方法运行等效性测试:
MATLAB 命令行中的
runtests
函数编辑器选项卡中 MATLAB 编辑器工具条中的运行测试按钮
运行按钮
在测试浏览器中
运行按钮
在 MATLAB 测试管理器 (MATLAB Test)中
运行按钮
在 Code Quality Dashboard (MATLAB Test) 中
有关详细信息,请参阅Run MATLAB Tests (MATLAB Test)。
注意
您不能并行运行已部署的代码工件等效性测试。
另请参阅
类
matlabtest.compiler.TestCase
(MATLAB Test)
函数
build
(MATLAB Test) |execute
(MATLAB Test) |verifyExecutionMatchesMATLAB
(MATLAB Test)