我正在使用matlab.unittest
框架进行一些测试。我需要比较确实相同的数组。但是,它们包含一些NaN
值(在相同位置)。现在,如果您发出命令isequal(NaN,NaN)
,结果将为false,因为NaNs
每个定义不相等。这意味着使用verifyEqual
命令时我的测试失败。
如果这些数组确实相同但包含一些NaN
值,我应该如何使用单元测试框架测试两个数组是否相等?
答案 0 :(得分:1)
<强> 修改 强>
目前,时间表确实使用isequal
而不是isequaln
。但是,对于未来版本的MATLAB,我们正在考虑默认使用isequaln
而不是isequal
。
与此同时,您当前的解决方法可行,但以下两种方法可能会让您获得更好的诊断:
首先将时间表转换为表格。如果失败,您将获得更好的诊断,实际上指向您的时间表失败的部分。这也允许您对时间表的值应用容差。一个缺点是,诊断程序会将它们显示为表格而不是它们的实际位置 - 时间表。
>> 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
应该为您提供所需的数据。
这些类型的数组是否为double?如果是这样的verifyEqual
应该是您所需要的(并且将为您提供比您的解决方法更好的诊断)。
如果verifyEqual
不起作用,您能否告诉我您使用的是哪个版本的MATLAB以及verifyEqual
哪些电话无法满足您的要求?< / p>