我希望在NUnit中为以下场景创建以下测试:我们希望测试正在创建的新计算方法产生类似于旧系统的结果.所有值之间的可接受差异(或者更确切地说是重新定义)已被定义为
abs(old_val - new_val) < 0.0001
Run Code Online (Sandbox Code Playgroud)
我知道我可以循环遍历新列表中的每个值,并与旧列表中的值进行比较并测试上述条件.
如何使用Nunit的CollectionAssert.AreEqual方法(或某种CollectionAssert方法)实现这一目标?
目前的答案已经过时.从NUnit 2.5开始,有一个重载CollectionAssert.AreEqual,需要一个System.Collections.IComparer.
这是一个最小的实现:
public class Comparer : System.Collections.IComparer
{
private readonly double _epsilon;
public Comparer(double epsilon)
{
_epsilon = epsilon;
}
public int Compare(object x, object y)
{
var a = (double)x;
var b = (double)y;
double delta = System.Math.Abs(a - b);
if (delta < _epsilon)
{
return 0;
}
return a.CompareTo(b);
}
}
[NUnit.Framework.Test]
public void MyTest()
{
var a = ...
var b = ...
NUnit.Framework.CollectionAssert.AreEqual(a, b, new Comparer(0.0001));
}
Run Code Online (Sandbox Code Playgroud)
那么NUnit框架中的方法允许我对集合进行容差检查.请参阅Equal Constraint.一个使用AsCollection和Within扩展方法.在这方面,虽然我对这一陈述的含义并非100%肯定
如果要将要比较的数组视为简单集合,请使用AsCollection修饰符,这将导致逐个元素地进行比较,而不考虑数组的等级或维度.
[Test]
//[ExpectedException()]
public void CheckLists_FailsAt0()
{
var expected = new[] { 0.0001, 0.4353245, 1.3455234, 345345.098098 };
var result1 = new[] { -0.0004, 0.43520, 1.3454, 345345.0980 };
Assert.That(result1, Is.EqualTo(expected).AsCollection.Within(0.0001), "fail at [0]"); // fail on [0]
}
[Test]
//[ExpectedException()]
public void CheckLists_FailAt1()
{
var expected = new[] { 0.0001, 0.4353245, 1.3455234, 345345.098098 };
var result1a = new[] { 0.0001000000 , 0.4348245000 , 1.3450234000 , 345345.0975980000 };
Assert.That(result1a, Is.EqualTo(expected).AsCollection.Within(0.0001), "fail at [1]"); // fail on [3]
}
[Test]
public void CheckLists_AllPass_ForNegativeDiff_of_1over10001()
{
var expected = new[] { 0.0001, 0.4353245, 1.3455234, 345345.098098 };
var result2 = new[] { 0.00009900 , 0.43532350 , 1.34552240 , 345345.09809700 };
Assert.That(result2, Is.EqualTo(expected).AsCollection.Within(0.0001)); // pass
}
[Test]
public void CheckLists_StillPass_ForPositiveDiff_of_1over10001()
{
var expected = new[] { 0.0001, 0.4353245, 1.3455234, 345345.098098 };
var result3 = new[] { 0.00010100 , 0.43532550 , 1.34552440 , 345345.09809900 };
Assert.That(result3, Is.EqualTo(expected).AsCollection.Within(0.0001)); // pass
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4381 次 |
| 最近记录: |