单位测试的平等包括。 NaNs
我正在做一些使用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