我喜欢将我的 Assert.AreEqual 扩展到许多不同的类,已知的当然是 CollectionAssert,但我可以想到更多,例如:ImageAssert、 XmlAssert 等。
您是否创建了自己的 Assert 类?你想创造什么样的新事物?
我喜欢将我的 Assert.AreEqual 扩展到许多不同的类,已知的当然是 CollectionAssert,但我可以想到更多,例如:ImageAssert、 XmlAssert 等。
您是否创建了自己的 Assert 类?你想创造什么样的新事物?
这就是我的解决方案:
using MyStuff;
using A = Microsoft.VisualStudio.TestTools.UnitTesting.Assert;
namespace Mytestproj.Tests
{
public static class Assert
{
public static void AreEqual(object expected, object actual)
{
A.AreEqual(expected, actual);
}
// my extension
public static void AreEqual(MyEnum expected, int actual)
{
A.AreEqual((int)expected, actual);
}
public static void IsTrue(bool o)
{
A.IsTrue(o);
}
public static void IsFalse(bool o)
{
A.IsFalse(o);
}
public static void AreNotEqual(object notExpected, object actual)
{
A.AreNotEqual(notExpected, actual);
}
public static void IsNotNull(object o)
{
A.IsNotNull(o);
}
public static void IsNull(object o)
{
A.IsNull(o);
}
}
}
我喜欢 Assert 类的感觉,但想要更多用作通用验证框架的东西。我从 Roger Alsing 关于使用扩展方法的文章开始,现在有一个系统,其工作方式如下:
Enforce.That(variable).IsNotNull();
Enforce.That(variable).IsInRange(10, 20);
Enforce.That(variable).IsTypeOf(typeof(System.String));
etc.
如果任何强制执行失败,则会引发异常。我一直在考虑重构,以便我还可以合并一个不会引发异常的非关键评估。有些人喜欢 Check.That 作为 Enforce.That 的变体,它将返回布尔值,但具有具有相同签名的扩展方法。
到目前为止,我喜欢这种方法的地方在于,我可以在我的单元测试中使用它们,以及在我的实际代码中使用它们来解决验证前和验证后的问题,而无需引用 Microsoft.VisualStudio.QualityTools.UnitTestFramework 程序集。我将它放在我的应用程序框架的根程序集中,而 Enforce 位于根目录,因此很容易获得。
我的许多测试都围绕着加载一个具有已知良好状态的对象(如切割路径)。执行测试,然后将结果与加载的对象进行比较。如果它们不同,那么“发生”某些事情会导致代码发生变化。
这种方法可以节省大量时间,并允许在需要时进行自定义比较。
我认为,如果您重构测试以减少重复,那么您最终会创建自己的框架作为副产品,当然您的测试框架将拥有在您的上下文中有意义的断言助手。
我想到的一个例子是,在测试 xhtml 报告时,我们最终得到的测试看起来像:
assertCoverageEquals(45.5);
断言覆盖的背后是这样的:
assertPercentage(COVERAGE_ID, 45.5);
然后后面是使用 xpath 获取值的方法和另一种知道百分比格式的方法。
正如我在上面写的那样(在我的问题中),我刚刚向ImageAssert添加了一个实现,我很高兴听到更多此类示例
[TestMethod]
public void CompareImagesSize()
{
Image expected = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\ExpectedImage.png");
Image actual = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\RhinoDiagram.png");
Bitmap expectedBitmap = new Bitmap(expected);
Bitmap actualBitmap = new Bitmap(actual);
ImageAssert.HasTheSameSize(expectedBitmap, actualBitmap);
}
[TestMethod]
public void CompareTwoSameImagesButWithDifferenExtension()
{
Image expected = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\Image2.png");
Image actual = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\Image1.jpg");
Bitmap expectedBitmap = new Bitmap(expected);
Bitmap actualBitmap = new Bitmap(actual);
ImageAssert.AreEqual(expectedBitmap, actualBitmap);
}
public class ImageAssert
{
//public static void MoreMethods(Bitmap expected, Bitmap actual)
//{
// //Compare image extensions
// //Compare Thumbnail...
//}
public static void HasTheSameSize(Bitmap expected, Bitmap actual)
{
if ((expected.Height != actual.Height)
|| (expected.Width != actual.Width))
HandleFail("ImageAssert.HasTheSameSize", String.Empty);
}
public static void AreEqual(Bitmap expected, Bitmap actual)
{
for (int i = 0; i < expected.Width; i++)
{
for (int j = 0; j < expected.Height; j++)
{
Color expectedBit = expected.GetPixel(i, j);
Color actualBit = actual.GetPixel(i, j);
if (!expectedBit.Equals(actualBit))
{
HandleFail("ImageAssert.AreEqual", String.Empty, i, j);
return;
}
}
}
}
internal static void HandleFail(string assertionName, string message, params object[] parameters)
{
throw new AssertFailedException(String.Format(assertionName));
}
}