单位测试的平等包括。 NaNs

问题描述:

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

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

+1

[isequaln](https://uk.mathworks.com/help/matlab/ref/isequaln.htmll)? – Zep

+0

或者如果您需要进行元素比较:'a == b |(isnan(a)&isnan(b))' –

+0

@Zep'isequaln'使用命令行生成正确的结果。但是,我需要将此测试纳入单元测试课程。现在,我正在使用'verifyEqual',比如'testCase.verifyEqual(actual,expected)' - 不知道如何合并'isequaln'! – Andi

编辑 目前的时间表确实使用isequal而非isequaln。然而,我们正在考虑使用isequaln而不是isequal默认用于未来版本的MATLAB。

在此期间,您目前的解决方法将工作,但以下两种方法可能让你更好的诊断:

  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)); 
    

在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应该给你你想要的东西。

这些类型的数组是双精度型的吗?如果这样的话应该是你需要的(并且会给你比你的解决方法更好的诊断)。

如果verifyEqual不起作用,你能告诉我你正在使用哪个版本的MATLAB和不需要你想要的verifyEqual调用吗?

+0

我在比较2017a的时间表。我认为verifyEqual与数组(和表?)协同工作,但与时间表无关。 – Andi