2017-10-20 78 views
1

我正在做一些使用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

回答

1

編輯 目前的時間表確實使用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