Main Content

本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

matlab.unittest.plugins.CodeCoveragePlugin 类

包: matlab.unittest.plugins

生成代码覆盖率报告的插件

说明

要生成 MATLAB® 源代码的行覆盖率报告,请将 CodeCoveragePlugin 添加至 TestRunner。测试框架将运行测试,生成的覆盖率报告将指明已执行的代码行。覆盖率报告基于一个或多个文件夹或包中的源代码。源代码必须位于 MATLAB 路径上,且在测试运行期间保留在该路径中。

CodeCoveragePlugin 使用 MATLAB 探查器确定测试将执行的代码行。测试和源代码不应与探查器进行交互。在运行一套测试之前,插件将清除探查器收集的所有数据。

构造

使用以下静态方法之一实例化 CodeCoveragePlugin

要对一个或多个文件中的源代码进行报告,请使用 forFile 静态方法。要对一个或多个文件夹中的源代码进行报告,请使用 forFolder 静态方法。要对一个或多个包内的源代码进行报告,请使用 forPackage 静态方法。

方法

forFile为文件构造 CodeCoveragePlugin
forFolder为文件夹构造 CodeCoveragePlugin
forPackage为包构建 CodeCoveragePlugin

复制语义

句柄。要了解句柄类如何影响复制操作,请参阅复制对象

示例

全部折叠

在您的工作文件夹下的新文件 quadraticSolver.m 中,创建以下函数。

function roots = quadraticSolver(a,b,c)
% quadraticSolver returns solutions to the
% quadratic equation a*x^2 + b*x + c = 0.

checkInputs

roots(1) = (-b + sqrt(b^2 - 4*a*c)) / (2*a);
roots(2) = (-b - sqrt(b^2 - 4*a*c)) / (2*a);

    function checkInputs
        if ~isa(a,'numeric') || ~isa(b,'numeric') || ~isa(c,'numeric')
            error('quadraticSolver:InputMustBeNumeric', ...
                'Coefficients must be numeric.')
        end
    end
end

为该二次求解器创建一个测试。在 tests 包(+tests 子文件夹)中,创建包含以下测试类的 SolverTest.m

classdef SolverTest < matlab.unittest.TestCase
    % SolverTest tests solutions to the quadratic equation
    % a*x^2 + b*x + c = 0
    
    methods (Test)
        function testRealSolution(testCase)
            actSolution = quadraticSolver(1,-3,2);
            expSolution = [2,1];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function testImaginarySolution(testCase)
            actSolution = quadraticSolver(1,2,10);
            expSolution = [-1+3i, -1-3i];
            testCase.verifyEqual(actSolution,expSolution)
        end
    end
    
end

在命令提示符下,从您的原始工作文件夹下的 tests 包中创建测试套件。

import matlab.unittest.TestSuite
import matlab.unittest.TestRunner
import matlab.unittest.plugins.CodeCoveragePlugin

suite = TestSuite.fromPackage('tests');

创建一个测试运行程序。

runner = TestRunner.withTextOutput;

CodeCoveragePlugin 添加到运行程序并运行测试。将源代码文件夹指定为当前工作文件夹。如果您的当前工作文件夹中包含其他源代码文件,这些文件将显示在范围报告中。包含源代码 (quadraticSolver.m) 的文件夹必须位于 MATLAB 搜索路径上。

runner.addPlugin(CodeCoveragePlugin.forFolder(pwd))
result = runner.run(suite);
Running tests.SolverTest
..
Done tests.SolverTest
__________

MATLAB 在临时文件夹中为二次求解器函数创建代码覆盖率报告。

checkinputs 嵌套函数不包含完整代码。由于 SolverTest.m 中的测试不将非数值输入传递给 quadraticSolver,因此如果输入为非数值,MATLAB 将不执行引发错误的代码。要解决覆盖率缺失问题,可添加一个测试方法对错误条件进行测试。

在您的工作文件夹中,创建一个包含以下函数的文件 quadraticSolver.m

function roots = quadraticSolver(a,b,c)
    % quadraticSolver returns solutions to the
    % quadratic equation a*x^2 + b*x + c = 0.
    checkInputs
    roots(1) = (-b + sqrt(b^2 - 4*a*c)) / (2*a);
    roots(2) = (-b - sqrt(b^2 - 4*a*c)) / (2*a);
    
    function checkInputs
        if ~isa(a,'numeric') || ~isa(b,'numeric') || ~isa(c,'numeric')
            error('quadraticSolver:InputMustBeNumeric', ...
                'Coefficients must be numeric.')
        end
    end
end

ForFileSolverTest.m 中为二次求解器创建一个测试类。

classdef ForFileSolverTest < matlab.unittest.TestCase
    % SolverTest tests solutions to the quadratic equation
    % a*x^2 + b*x + c = 0
    
    methods (Test)
        function testRealSolution(testCase)
            actSolution = quadraticSolver(1,-3,2);
            expSolution = [2,1];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function testImaginarySolution(testCase)
            actSolution = quadraticSolver(1,2,10);
            expSolution = [-1+3i, -1-3i];
            testCase.verifyEqual(actSolution,expSolution)
        end
    end
end

在命令提示符下,为 ForFileSolverTest.m 创建测试套件,然后创建测试运行程序。

import matlab.unittest.TestRunner

testFile = 'ForFileSolverTest.m';
suite = testsuite(testFile);
runner = TestRunner.withTextOutput;

创建一个插件,以 Cobertura 格式输出源代码的代码覆盖率报告。

import matlab.unittest.plugins.CodeCoveragePlugin
import matlab.unittest.plugins.codecoverage.CoberturaFormat

sourceCodeFile = 'quadraticSolver.m';
reportFile = 'CoverageResults.xml';
reportFormat = CoberturaFormat(reportFile);
plugin = CodeCoveragePlugin.forFile(sourceCodeFile,'Producing',reportFormat);

将该插件添加到测试运行程序中并运行测试。

runner.addPlugin(plugin);
result = runner.run(suite);
Running ForFileSolverTest
..
Done ForFileSolverTest
__________

显示包含代码覆盖率结果的文件内容。

disp(fileread(reportFile))
<?xml version="1.0" encoding="utf-8"?>
<coverage branch-rate="NaN" branches-covered="NaN" branches-valid="NaN" complexity="NaN" line-rate="0.8" lines-covered="4" lines-valid="5" timestamp="737000.4343" version="NaN">
   <sources>
      <source>C:\work\</source>
   </sources>
   <packages>
      <package branch-rate="NaN" complexity="NaN" line-rate="0.8" name="">
         <classes>
            <class branch-rate="NaN" complexity="NaN" filename="quadraticSolver.m" line-rate="0.8" name="quadraticSolver">
               <methods/>
               <lines>
                  <line branch="NaN" condition-coverage="NaN" hits="2" number="4"/>
                  <line branch="NaN" condition-coverage="NaN" hits="2" number="5"/>
                  <line branch="NaN" condition-coverage="NaN" hits="2" number="6"/>
                  <line branch="NaN" condition-coverage="NaN" hits="2" number="9"/>
                  <line branch="NaN" condition-coverage="NaN" hits="0" number="10"/>
               </lines>
            </class>
         </classes>
      </package>
   </packages>
</coverage>
在 R2014b 中推出