我正在做一些使用matlab.unittest
框架的測試。我需要比較確實相同的數組。但是,它們包含一些NaN
值(在相同的位置)。現在,如果您發出命令isequal(NaN,NaN)
,則結果將爲假,因爲每個定義的NaNs
都不相等。這意味着我的測試在使用verifyEqual
命令時失敗。單位測試的平等包括。 NaNs
我應該如何使用單元測試框架測試兩個數組是否相等,當這些數組確實相同但包含一些NaN
值?
我正在做一些使用matlab.unittest
框架的測試。我需要比較確實相同的數組。但是,它們包含一些NaN
值(在相同的位置)。現在,如果您發出命令isequal(NaN,NaN)
,則結果將爲假,因爲每個定義的NaNs
都不相等。這意味着我的測試在使用verifyEqual
命令時失敗。單位測試的平等包括。 NaNs
我應該如何使用單元測試框架測試兩個數組是否相等,當這些數組確實相同但包含一些NaN
值?
編輯 目前的時間表確實使用isequal
而非isequaln
。然而,我們正在考慮使用isequaln
而不是isequal
默認用於未來版本的MATLAB。
在此期間,您目前的解決方法將工作,但以下兩種方法可能讓你更好的診斷:
首先時間表轉換爲表格。當它失敗時,你會得到更好的診斷,這實際上指向你的時間表失敗的部分。這也將允許您對時間表的值應用公差。一個缺點是,診斷將把它們顯示爲表格,而不是它們的真實時間表 - 時間表。
>> 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
並直接調用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
調用嗎?
我在比較2017a的時間表。我認爲verifyEqual與數組(和表?)協同工作,但與時間表無關。 – Andi
[isequaln](https://uk.mathworks.com/help/matlab/ref/isequaln.htmll)? – Zep
或者如果您需要進行元素比較:'a == b |(isnan(a)&isnan(b))' –
@Zep'isequaln'使用命令行生成正確的結果。但是,我需要將此測試納入單元測試課程。現在,我正在使用'verifyEqual',比如'testCase.verifyEqual(actual,expected)' - 不知道如何合併'isequaln'! – Andi