Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

matlab.unittest.plugins.CodeCoveragePlugin クラス

名前空間: matlab.unittest.plugins

コード カバレッジ情報へのアクセスを提供するプラグイン

説明

MATLAB® ソース コードのコード カバレッジ情報を収集してアクセスするには、matlab.unittest.plugins.CodeCoveragePlugin クラスのインスタンスをテスト ランナーに追加します。テスト スイートが実行されると、プラグインにより、テストによって実行されたソース コードの部分を示す情報が収集されます。この情報には、プログラムまたはコード カバレッジ レポートからアクセスできます。

matlab.unittest.plugins.CodeCoveragePlugin クラスは handle クラスです。

作成

CodeCoveragePlugin の静的メソッドのいずれかを使用してそのインスタンスを作成します。

  • ファイル内のソース コードのコード カバレッジ情報へのアクセスを提供するプラグインを作成するには、静的メソッド forFile を使用します。

  • フォルダー内のソース コードのコード カバレッジ情報へのアクセスを提供するプラグインを作成するには、静的メソッド forFolder を使用します。

  • パッケージ内のソース コードのコード カバレッジ情報へのアクセスを提供するプラグインを作成するには、静的メソッド forPackage を使用します。

プロパティ

すべて展開する

収集する最上位のカバレッジ メトリクス。次の表のいずれかの値として返されます。既定では、プラグインはステートメントと関数のカバレッジ メトリクスを収集します。

MetricLevel の値含まれるカバレッジのタイプ
"statement"ステートメント カバレッジ、関数カバレッジ

"decision" (MATLAB Test™ が必要)

ステートメント カバレッジ、関数カバレッジ、判定カバレッジ

"condition" (MATLAB Test が必要)

ステートメント カバレッジ、関数カバレッジ、判定カバレッジ、条件カバレッジ

"mcdc" (MATLAB Test が必要)

ステートメント カバレッジ、関数カバレッジ、判定カバレッジ、条件カバレッジ、改良条件判定カバレッジ (MC/DC)

このプロパティを設定するには、CodeCoveragePlugin クラスのいずれかの静的メソッドを使用してプラグインを作成するときに名前と値の引数 MetricLevel を指定します。カバレッジのタイプの詳細については、Types of Code Coverage for MATLAB Source Code (MATLAB Test)を参照してください。

属性:

GetAccess
public
SetAccess
immutable

メソッド

すべて展開する

すべて折りたたむ

ソース コードに対してテスト スイートを実行して HTML 形式のコード カバレッジ レポートを生成します。

現在のフォルダー内の sourceFolder という名前のフォルダーに、関数 quadraticSolver を作成します。この関数は入力として 2 次多項式の係数をとり、多項式の根を返します。係数を非数値として指定した場合、関数はエラーをスローします。

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

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

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

end

関数 quadraticSolver をテストするには、現在のフォルダー内の testsFolder という名前のフォルダーに SolverTest クラスを作成します。実数解、虚数解、非数値入力について関数をテストする 3 つの Test メソッドを定義します。

classdef SolverTest < matlab.unittest.TestCase
    methods(Test)
        function realSolution(testCase)
            actSolution = quadraticSolver(1,-3,2);
            expSolution = [2 1];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function imaginarySolution(testCase)
            actSolution = quadraticSolver(1,2,10);
            expSolution = [-1+3i -1-3i];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function nonnumericInput(testCase)
            testCase.verifyError(@()quadraticSolver(1,"-3",2), ...
                "quadraticSolver:InputMustBeNumeric")
        end
    end
end

テストを実行してコード カバレッジ レポートを生成するには、まず sourceFolder をパスに追加します。

addpath("sourceFolder")

testsFolder からテスト スイートを作成します。

suite = testsuite("testsFolder");

テスト ランナーを作成し、sourceFolder 内のコードの HTML コード カバレッジ レポートを生成するプラグインを使用してテスト ランナーをカスタマイズします。プラグインの出力を現在のフォルダー内の coverageReport という名前のフォルダーに書き込むように指定します。

import matlab.unittest.plugins.CodeCoveragePlugin
import matlab.unittest.plugins.codecoverage.CoverageReport
runner = testrunner("textoutput");
sourceCodeFolder = "sourceFolder";
reportFolder = "coverageReport";
reportFormat = CoverageReport(reportFolder);
p = CodeCoveragePlugin.forFolder(sourceCodeFolder,"Producing",reportFormat);
runner.addPlugin(p)

テストを実行します。この例では、すべてのテストがパスし、ソース コードはフル カバレッジの評価を受けます。プラグインにより、現在のフォルダー内の指定フォルダー coverageReport に HTML コード カバレッジ レポートが生成されます。既定では、レポートのメイン ファイルは index.html です。

results = runner.run(suite);
Running SolverTest
...
Done SolverTest
__________

MATLAB code coverage report has been saved to:
 C:\work\coverageReport\index.html

レポートのメイン ファイルを開きます。

open(fullfile("coverageReport","index.html"))

ソース コードに対してテスト スイートを実行して Cobertura XML 形式のコード カバレッジ レポートを生成します。

現在のフォルダー内のファイルに、関数 quadraticSolver を作成します。この関数は入力として 2 次多項式の係数をとり、多項式の根を返します。係数を非数値として指定した場合、関数はエラーをスローします。

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

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

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

end

関数 quadraticSolver をテストするには、現在のフォルダーに SolverTest クラスを作成します。実数解、虚数解、非数値入力について関数をテストする 3 つの Test メソッドを定義します。

classdef SolverTest < matlab.unittest.TestCase
    methods(Test)
        function realSolution(testCase)
            actSolution = quadraticSolver(1,-3,2);
            expSolution = [2 1];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function imaginarySolution(testCase)
            actSolution = quadraticSolver(1,2,10);
            expSolution = [-1+3i -1-3i];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function nonnumericInput(testCase)
            testCase.verifyError(@()quadraticSolver(1,"-3",2), ...
                "quadraticSolver:InputMustBeNumeric")
        end
    end
end

SolverTest クラスからテスト スイートを作成します。

suite = testsuite("SolverTest");

テスト ランナーを作成し、ファイル quadraticSolver.m 内のソース コードの Cobertura XML コード カバレッジ レポートを生成するプラグインを使用してテスト ランナーをカスタマイズします。プラグインが現在のフォルダー内の coverageReport.xml という名前のファイルに出力を書き込むように指定します。

import matlab.unittest.plugins.CodeCoveragePlugin
import matlab.unittest.plugins.codecoverage.CoberturaFormat
runner = testrunner("textoutput");
sourceCodeFile = "quadraticSolver.m";
reportFile = "coverageReport.xml";
reportFormat = CoberturaFormat(reportFile);
p = CodeCoveragePlugin.forFile(sourceCodeFile,"Producing",reportFormat);
runner.addPlugin(p)

テストを実行します。この例では、すべてのテストがパスし、ソース コードはフル カバレッジの評価を受けます。プラグインにより、現在のフォルダーに Cobertura XML コード カバレッジ レポートが生成されます。

results = runner.run(suite);
Running SolverTest
...
Done SolverTest
__________

継続的インテグレーション (CI) プラットフォームで生成されたコード カバレッジ レポートを処理できます。また、open(reportFile)disp(fileread(reportFile)) などのコマンドを使用してコンテンツを表示することもできます。

テスト スイートを実行してコード カバレッジの結果を収集します。その後、結果からステートメント カバレッジに関する情報を取得します。

現在のフォルダー内の quadraticSolver.m という名前のファイルで、関数 quadraticSolver を作成します。この関数は入力として 2 次多項式の係数をとり、多項式の根を返します。係数を非数値として指定した場合、関数はエラーをスローします。

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

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

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

end

関数 quadraticSolver をテストするには、現在のフォルダー内の SolverTest.m という名前のファイルで SolverTest クラスを作成します。実数解、虚数解、非数値入力について関数をテストする 3 つの Test メソッドを定義します。

classdef SolverTest < matlab.unittest.TestCase
    methods (Test)
        function realSolution(testCase)
            actSolution = quadraticSolver(1,-3,2);
            expSolution = [2 1];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function imaginarySolution(testCase)
            actSolution = quadraticSolver(1,2,10);
            expSolution = [-1+3i -1-3i];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function nonnumericInput(testCase)
            testCase.verifyError(@()quadraticSolver(1,"-3",2), ...
                "quadraticSolver:InputMustBeNumeric")
        end
    end
end

この例で使用するクラスをインポートします。

import matlab.unittest.plugins.CodeCoveragePlugin
import matlab.unittest.plugins.codecoverage.CoverageResult

SolverTest クラスからテスト スイートを作成します。

suite = testsuite("SolverTest");

テスト ランナーを作成し、ファイル quadraticSolver.m 内のソース コードのコード カバレッジ情報へのプログラムによるアクセスを提供するプラグインを使用してカスタマイズします。

runner = testrunner("textoutput");
format = CoverageResult;
p = CodeCoveragePlugin.forFile("quadraticSolver.m",Producing=format);
runner.addPlugin(p)

テストを実行します。テストの実行後、formatResult プロパティにカバレッジの結果が格納されます。この例では、すべてのテストがパスします。

runner.run(suite);
Running SolverTest
...
Done SolverTest
__________

ステートメント カバレッジの概要にアクセスします。返されるベクトルは、テストでソース コード内の 4 つのステートメントがすべて実行されたことを示しています。

result = format.Result;
summary = coverageSummary(result,"statement")
summary = 1×2

     4     4

コード カバレッジ解析の説明を使用して、各ステートメントの実行回数を取得します。

[~,description] = coverageSummary(result,"statement")
description = struct with fields:
    statement: [1×4 struct]

disp([description.statement.ExecutionCount])
   3   1   2   2

コード カバレッジ情報を収集するために、単一のテスト ランナーに複数のプラグインを追加できます。たとえば、現在のフォルダー内の MATLAB コードについてのカバレッジの結果を収集するプラグインを追加し、さらに現在のフォルダー内の C/C++ 生成コードについての結果を収集する別のプラグインを追加できます。テスト ランナーをこのようにカスタマイズした場合、各プラグインで個別に解析を実行するように、プラグインごとにカバレッジの形式をそれぞれ指定する必要があります。

この例では、2 つのプラグインをテスト ランナーに追加し、各プラグインで異なるファイルのコード カバレッジ情報を収集する方法を示します。テストの実行後、2 つのカバレッジの結果を組み合わせてコード カバレッジ レポートを生成します。この例を開いて、必要なテスト ファイルとソース ファイルにアクセスします。例を開くと、BankAccountTest.m ファイルと DocPolynomTest.m ファイルで定義されたテストが現在のフォルダーに格納されます。さらに、テストに必要なソース ファイルも現在のフォルダーに格納されます。

openExample("matlab/GenerateCodeCoverageReportUsingPluginsExample")

BankAccountTest クラスの定義

次のコードは、BankAccount クラスのテストを定義する BankAccountTest クラス定義ファイルの内容を示しています。BankAccount クラスの詳細とクラス コードの表示方法については、連携するクラスの開発を参照してください。

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

DocPolynomTest クラスの定義

次のコードは、DocPolynom クラスのテストを定義する DocPolynomTest クラス定義ファイルの内容を示しています。DocPolynom クラスの詳細とクラス コードの表示方法については、クラスによる多項式の表現を参照してください。

classdef 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

テストの実行とコード カバレッジ レポートの生成

この例で使用するクラスをインポートします。

import matlab.unittest.plugins.CodeCoveragePlugin
import matlab.unittest.plugins.codecoverage.CoverageResult

テキスト出力用に構成されたテスト ランナーを作成します。

runner = testrunner("textoutput");

ファイル BankAccount.m 内のソース コードのコード カバレッジ情報へのプログラムによるアクセスを提供するプラグインをテスト ランナーに追加します。

format1 = CoverageResult;
plugin1 = CodeCoveragePlugin.forFile("BankAccount.m",Producing=format1);
runner.addPlugin(plugin1)

ファイル DocPolynom.m 内のソース コードのコード カバレッジ情報へのプログラムによるアクセスを提供する別のプラグインをテスト ランナーに追加します。

format2 = CoverageResult;
plugin2 = CodeCoveragePlugin.forFile("DocPolynom.m",Producing=format2);
runner.addPlugin(plugin2)

テスト クラス BankAccountTestDocPolynomTest からテスト スイートを作成し、テストを実行します。この例では、すべてのテストがパスします。

suite = testsuite(["BankAccountTest" "DocPolynomTest"]);
runner.run(suite);
Running BankAccountTest
.....
Done BankAccountTest
__________

Running DocPolynomTest
...
Done DocPolynomTest
__________

テストの実行後、形式オブジェクトの Result プロパティに、対応するプラグインで収集されたカバレッジの結果が格納されます。テスト実行全体のカバレッジの集計をレポートするには、カバレッジの結果の結合から HTML コード カバレッジ レポートを生成します。

result1 = format1.Result;
result2 = format2.Result;
generateHTMLReport(result1 + result2)

詳細

すべて展開する

バージョン履歴

R2014b で導入

すべて展開する