Main Content

matlab.unittest.constraints.Tolerance 类

命名空间: matlab.unittest.constraints

容差的基础接口

描述

matlab.unittest.constraints.Tolerance 类提供容差的接口。容差这个概念定义的是给定数据类型的近似相等,可应用于 IsEqualTo 约束以及某些使用 Within 名称-值参量的比较器。

该类有三个抽象方法。要创建自定义容差类,请从 matlab.unittest.constraints.Tolerance 中派生您的类并实现所有抽象方法。

类属性

Abstract
true

有关类属性的信息,请参阅类属性

方法

全部展开

示例

全部折叠

确定两个 DNA 序列是否具有指定容差范围内的汉明距离。对于相同长度的两个 DNA 序列,汉明距离是一个序列的核苷酸(字母)与另一个序列的核苷酸(字母)之间相差的位置数。

创建 DNA

要表示 DNA 序列,请在当前文件夹中名为 DNA.m 的文件中创建 DNA 类。

classdef DNA
    properties (SetAccess=immutable)
        Sequence char {mustHaveValidLetters}
    end

    methods
        function dna = DNA(sequence)
            dna.Sequence = sequence;
        end
    end
end

function mustHaveValidLetters(sequence)
validLetters = ...
    sequence == 'A' | ...
    sequence == 'C' | ...
    sequence == 'T' | ...
    sequence == 'G';

if ~all(validLetters,"all")
    error("Sequence contains one or more invalid letters.")
end
end

创建 HammingDistance

在当前文件夹的名为 HammingDistance.m 的文件中,通过子类化 matlab.unittest.constraints.Tolerance 来创建 HammingDistance 类。添加属性 Value,以便您可以指定允许的最大汉明距离。

Tolerance 类派生的类必须实现 supportssatisfiedBygetDiagnosticFor 方法:

  • supports 方法 - 指定容差必须支持 DNA 类的对象。

  • satisfiedBy 方法 - 指定在容差范围内的实际值和预期值必须大小相同,并且其汉明距离必须小于或等于容差值。

  • getDiagosticFor 方法 - 创建并返回一个 StringDiagnostic 对象,其中包含有关比较的诊断信息。

classdef HammingDistance < matlab.unittest.constraints.Tolerance
    properties
        Value
    end

    methods
        function tolerance = HammingDistance(value)
            tolerance.Value = value;
        end

        function tf = supports(~,expected)
            tf = isa(expected,"DNA");
        end

        function tf = satisfiedBy(tolerance,actual,expected)
            if ~isSameSize(actual.Sequence,expected.Sequence)
                tf = false;
                return
            end
            tf = hammingDistance(actual.Sequence,expected.Sequence) <= ...
                tolerance.Value;
        end

        function diagnostic = getDiagnosticFor(tolerance,actual,expected)
            import matlab.automation.diagnostics.StringDiagnostic
            if ~isSameSize(actual.Sequence,expected.Sequence)
                str = "The DNA sequences have different lengths.";
            else
                str = "The DNA sequences have a Hamming distance of " ...
                    + hammingDistance(actual.Sequence,expected.Sequence) ...
                    + "." + newline + "The allowable distance is " ...
                    + tolerance.Value + ".";
            end
            diagnostic = StringDiagnostic(str);
        end
    end
end

function tf = isSameSize(str1,str2)
tf = isequal(size(str1),size(str2));
end

function distance = hammingDistance(str1,str2)
distance = nnz(str1 ~= str2);
end

比较 DNA 序列

要使用容差来比较 DNA 序列,请首先导入必要的类,并为交互式测试创建一个测试用例。

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
testCase = TestCase.forInteractiveUse;

创建两个 DNA 对象,在不指定容差的情况下比较它们。测试失败,因为对象不相等。

sampleA = DNA("ACCTGAGTA");
sampleB = DNA("ACCACAGTA");
testCase.verifyThat(sampleA,IsEqualTo(sampleB))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> ObjectComparator failed.
        --> The objects are not equal using "isequaln".
        
        Actual Value:
          DNA with properties:
        
            Sequence: 'ACCTGAGTA'
        Expected Value:
          DNA with properties:
        
            Sequence: 'ACCACAGTA'
    ------------------
    Stack Information:
    ------------------
    In C:\work\CreateCustomToleranceExample.m (CreateCustomToleranceExample) at 45

验证 DNA 序列在汉明距离 1 的范围内相等。测试失败,测试框架显示由 getDiagnosticFor 方法产生的附加诊断信息。

testCase.verifyThat(sampleA,IsEqualTo(sampleB,"Within",HammingDistance(1)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> ObjectComparator failed.
        --> The objects are not equal using "isequaln".
        --> The DNA sequences have a Hamming distance of 2.
            The allowable distance is 1.
        
        Actual Value:
          DNA with properties:
        
            Sequence: 'ACCTGAGTA'
        Expected Value:
          DNA with properties:
        
            Sequence: 'ACCACAGTA'
    ------------------
    Stack Information:
    ------------------
    In C:\work\CreateCustomToleranceExample.m (CreateCustomToleranceExample) at 51

验证 DNA 序列在汉明距离 2 的范围内相等。测试通过。

testCase.verifyThat(sampleA,IsEqualTo(sampleB,"Within",HammingDistance(2)))
Verification passed.

版本历史记录

在 R2013a 中推出