Matlab 相等性的单元测试,包括NaN

Matlab 相等性的单元测试,包括NaN,matlab,unit-testing,equality,Matlab,Unit Testing,Equality,我正在使用matlab.unittest框架进行一些测试。我需要与确实相同的数组进行比较。但是,它们包含一些NaN值(在相同的位置)。现在,如果发出命令isequal(NaN,NaN),结果将为false,因为NaN根据定义不相等。这意味着当使用verifyEqual命令时,我的测试失败 当两个数组确实相同但包含一些NaN值时,如何使用单元测试框架测试两个数组的相等性?编辑 目前,时间表确实使用了isequal而不是isequaln。然而,我们正在研究在未来版本的MATLAB中,默认情况下使用i

我正在使用
matlab.unittest
框架进行一些测试。我需要与确实相同的数组进行比较。但是,它们包含一些
NaN
值(在相同的位置)。现在,如果发出命令
isequal(NaN,NaN)
,结果将为false,因为
NaN
根据定义不相等。这意味着当使用
verifyEqual
命令时,我的测试失败

当两个数组确实相同但包含一些
NaN
值时,如何使用单元测试框架测试两个数组的相等性?

编辑 目前,时间表确实使用了
isequal
而不是
isequaln
。然而,我们正在研究在未来版本的MATLAB中,默认情况下使用
isequal
优于
isequal

同时,您当前的解决方案也会起作用,但以下两种方法可能会让您获得更好的诊断:

  • 首先将时间表转换为表。当它失败时,你将得到更好的诊断,它实际上指向你时间表中失败的部分。这也将允许您对时间表的值应用公差。一个缺点是,诊断将以表格的形式显示它们,而不是它们真正的样子-时间表

    >> testCase.verifyEqual(timetable2table(actual), timetable2table(actual));
    Interactive verification failed.
    
    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyEqual failed.
    --> Path to failure: <Value>.Data
        --> The values are not equal using "isequaln".
        --> Failure table:
                Index    Actual    Expected    Error    RelativeError
                _____    ______    ________    _____    _____________
    
                  1        50         20        30           1.5     
                  2        50         20        30           1.5     
    
        Actual double:
            50
            50
        Expected double:
            20
            20
    
    Actual Value:
      2×2 table
    
                Time            Data
        ____________________    ____
    
        20-Oct-2017 00:00:00     50 
        21-Oct-2017 00:00:00     50 
    Expected Value:
      2×2 table
    
                Time            Data
        ____________________    ____
    
        20-Oct-2017 00:00:00     20 
        21-Oct-2017 00:00:00     20 
    >>
    
  • 在verifyReturnsTrue案例中,如果您仍然希望在故障诊断中看到实际和预期的表,可以将它们作为测试诊断传递进来。如下所示:

    import matlab.unittest.diagnostics.Diagnostic;
    >> testCase.verifyReturnsTrue(@() isequaln(actual, expected),...
        Diagnostic.join(actual, expected))
    Interactive verification failed.
    
    ----------------
    Test Diagnostic:
    ----------------
      2×1 timetable
    
                Time            Data
        ____________________    ____
    
        20-Oct-2017 00:00:00     50 
        21-Oct-2017 00:00:00     50 
    
    ----------------
    Test Diagnostic:
    ----------------
      2×1 timetable
    
                Time            Data
        ____________________    ____
    
        20-Oct-2017 00:00:00     20 
        21-Oct-2017 00:00:00     20 
    
    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyReturnsTrue failed.
    --> The function handle did not evaluate to "true".
    --> Returned value:
              logical
    
               0
    
    Evaluated Function:
      function_handle with value:
    
        @()isequaln(actual,expected)
    >>
    
    /EDIT

    根据您使用的数据类型(以及MATLAB的哪个版本)
    verifyEqual
    应该为您提供所需的数据类型

    这些数组是double类型的吗?如果是这样的话,
    verifyEqual
    应该是您所需要的全部(并且将为您提供比解决方法更好的诊断)


    如果
    verifyEqual
    不起作用,您能告诉我您使用的是哪个版本的MATLAB以及
    verifyEqual
    调用不符合您的要求吗?

    怎么样?或者如果您需要元素级比较:
    a==b |(isnan(a)&isnan(b))
    @Zep
    isequaln
    正在使用命令行生成正确的结果。但是,我需要将此测试合并到单元测试类中。现在,我正在使用
    verifyEqual
    ,例如
    testCase.verifyEqual(实际的,预期的)
    -不确定如何合并
    isequaln
    !我从未使用过matlab.unittest,但看起来这个肮脏的解决方法可以工作:
    testCase.verifyEqual(isequaln(a,b),true)
    改进:
    testCase.verifyTrue(isequaln(a,b))
    我正在将时间表与2017a进行比较。我认为verifyEqual适用于数组(和表?),但不适用于时间表。
    import matlab.unittest.diagnostics.Diagnostic;
    >> testCase.verifyReturnsTrue(@() isequaln(actual, expected),...
        Diagnostic.join(actual, expected))
    Interactive verification failed.
    
    ----------------
    Test Diagnostic:
    ----------------
      2×1 timetable
    
                Time            Data
        ____________________    ____
    
        20-Oct-2017 00:00:00     50 
        21-Oct-2017 00:00:00     50 
    
    ----------------
    Test Diagnostic:
    ----------------
      2×1 timetable
    
                Time            Data
        ____________________    ____
    
        20-Oct-2017 00:00:00     20 
        21-Oct-2017 00:00:00     20 
    
    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyReturnsTrue failed.
    --> The function handle did not evaluate to "true".
    --> Returned value:
              logical
    
               0
    
    Evaluated Function:
      function_handle with value:
    
        @()isequaln(actual,expected)
    >>