相等的单元测试包括NaN的

时间:2017-10-20 10:06:58

标签: matlab unit-testing equality

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

如果这些数组确实相同但包含一些NaN值,我应该如何使用单元测试框架测试两个数组是否相等?

1 个答案:

答案 0 :(得分:1)

<强> 修改 目前,时间表确实使用isequal而不是isequaln。但是,对于未来版本的MATLAB,我们正在考虑默认使用isequaln而不是isequal

与此同时,您当前的解决方法可行,但以下两种方法可能会让您获得更好的诊断:

  1. 首先将时间表转换为表格。如果失败,您将获得更好的诊断,实际上指向您的时间表失败的部分。这也允许您对时间表的值应用容差。一个缺点是,诊断程序会将它们显示为表格而不是它们的实际位置 - 时间表。

    >> 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 
    >>
    
  2. 使用verifyReturnsTrue并直接致电isequaln。这至少显示了用于在失败时比较值的函数句柄

    testCase.verifyReturnsTrue(@() isequaln(actTimeTable, expTimeTable));
    
  3. 在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哪些电话无法满足您的要求?< / p>