2017-10-20 5 views
1

Ich mache einige Tests mit dem matlab.unittest Framework. Ich muss mit Arrays vergleichen, die tatsächlich identisch sind. Sie enthalten jedoch einige NaN Werte (an den gleichen Orten). Wenn Sie nun den Befehl isequal(NaN,NaN) ausgeben, wird das Ergebnis falsch sein, da NaNs per Definition nicht gleich sind. Das bedeutet, dass mein Test fehlschlägt, wenn der Befehl verifyEqual verwendet wird.Einheitstest für Gleichheit inkl. NaNs

Wie soll ich zwei Arrays auf Gleichheit mit dem Unit-Test-Framework testen, wenn diese Arrays tatsächlich identisch sind, aber einige NaN Werte enthalten?

+1

Wie wäre es mit [isequaln] (https://uk.mathworks.com/help/matlab/ref/isequaln.htmll)? – Zep

+0

Oder wenn Sie einen elementweisen Vergleich benötigen: 'a == b | (isnan (a) & isnan (b))' –

+0

@Zep 'isequaln' erzeugt das korrekte Ergebnis über die Befehlszeile. Allerdings muss ich diesen Test in eine Unit-Test-Klasse einbeziehen. Im Moment verwende ich 'verifyEqual', wie' testCase.verifyEqual (actual, expected) '' - Nicht sicher, wie man 'isequaln' einbaut! – Andi

Antwort

1

EDIT Aktuelle Fahrpläne verwenden in der Tat isequal statt isequaln. Wir bevorzugen jedoch die Verwendung von isequaln über isequal standardmäßig für eine zukünftige Version von MATLAB.

In der Zwischenzeit würde Ihre aktuelle Problemumgehung arbeiten, aber die folgenden beiden Ansätze könnten Sie besser Diagnose erhalten:

  1. zuerst die Fahrpläne in Tabellen konvertieren. Wenn es scheitert, erhalten Sie eine bessere Diagnose, die tatsächlich auf den Teil Ihres Stundenplans zeigt, der fehlschlägt. Dies ermöglicht Ihnen auch, Toleranzen auf die Werte der Fahrpläne anzuwenden. Ein Nachteil, die Diagnose zeigt sie als Tabellen und nicht als das, was sie wirklich sind - Fahrpläne.

    >> 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. Verwenden verifyReturnsTrue und rufen Sie direkt isequaln. Dies zeigt zumindest den Funktionsgriff verwendet, um die Werte zu vergleichen, wenn es

    testCase.verifyReturnsTrue(@() isequaln(actTimeTable, expTimeTable)); 
    

Im verifyReturnsTrue Fall fehlschlägt, wenn Sie immer noch die tatsächlichen und erwarteten Tabellen in Fehlerdiagnose sehen wollen, können Sie sie in geben können als Testdiagnose. Das sieht wie folgt aus:

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

Je nachdem, was Datentypen Sie arbeiten (und die Freisetzung von MATLAB) verifyEqual sollten Sie geben, was Sie wollen.

Sind diese Arrays vom Typ double? Wenn dies der Fall ist, sollten verifyEqual alles sein, was Sie benötigen (und Ihnen bessere Diagnosen als Ihre Problemumgehung geben).

Wenn verifyEqual nicht funktioniert, können Sie mir wissen, welche Version von MATLAB Sie verwenden und die verifyEqual Anruf, der nicht das tut, was Sie suchen?

+0

Ich vergleiche Fahrpläne mit 2017a. Ich denke, verifyEqual arbeitet mit Arrays (und Tabellen?), Aber nicht mit Fahrplänen. – Andi