13

私は自分の Assert.AreEqual を多くの異なるクラスに拡張するのが大好きです。既知のクラスはもちろん CollectionAssert ですが、ImageAssert、 XmlAssert など、さらにいくつか考えられます。

独自の Assert クラスを作成しましたか? そして、どんな新しいものを作りたいですか?

4

5 に答える 5

5

それが私の解決策です:

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);
        }
    }
}
于 2012-08-03T11:53:44.007 に答える
4

私はAssertクラスの感触が好きですが、より一般的な検証フレームワークとして役立つものが欲しかったのです。拡張メソッドの使用に関するRogerAlsingの記事から始めて、次のようなシステムができました。

Enforce.That(variable).IsNotNull();
Enforce.That(variable).IsInRange(10, 20);
Enforce.That(variable).IsTypeOf(typeof(System.String));
etc.

強制が失敗すると、例外がスローされます。例外をスローしない重要でない評価も組み込むことができるように、リファクタリングを検討しています。ブール値を返すEnforce.ThatのバリアントとしてCheck.Thatのようなものもありますが、同じシグネチャを持つ拡張メソッドがあります。

これまでのところ、このアプローチで気に入っているのは、Microsoft.VisualStudio.QualityTools.UnitTestFrameworkアセンブリを参照しなくても、これらを単体テストで使用できることと、実際のコードでの事前検証と事後検証の問題に使用できることです。アプリケーションフレームワークのルートアセンブリに配置しましたが、Enforceがルートにあるため、簡単にアクセスできます。

于 2008-12-19T16:48:11.770 に答える
0

私のテストの多くは、(CuttingPath のような) 既知の良好な状態のオブジェクトをロードすることを中心に展開しています。テストを実行し、ロードされたオブジェクトと結果を比較します。それらが異なる場合、何かが「起こって」コードに変更が生じています。

このアプローチは時間を大幅に節約し、必要に応じてカスタム比較を可能にします。

于 2008-12-19T16:46:04.643 に答える
0

重複を減らすためにテストをリファクタリングしている場合、副産物として独自のフレームワークを作成することになると思います。もちろん、テスト フレームワークには、コンテキストで意味のあるアサート ヘルパーが含まれます。

私が念頭に置いている例は、xhtml レポートをテストしたときに、次のようなテストになったことです。

  assertCoverageEquals(45.5);

アサートカバレッジの背後にあるのは次のようなものでした:

  assertPercentage(COVERAGE_ID, 45.5);

その背後には、xpath を使用して値を取得するものと、パーセンテージの書式設定を知る別のメソッドがありました。

于 2008-12-20T06:42:52.800 に答える
0

上記のように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));
    }
}
于 2008-12-21T23:01:48.363 に答える