۱۳۸۷/۱۰/۱۸

آشنايي با آزمايش واحد (unit testing) در دات نت، قسمت 5


ادامه آشنايي با NUnit

حالت‌هاي مختلف Assert :

NUnit framework حالت‌هاي مختلفي از دستور Assert را پشتيباني مي‌كند كه در ادامه با آنها آشنا خواهيم شد.

كلاس Assertion :
اين كلاس داراي متدهاي زير است:
public static void Assert(bool condition)
public static void Assert(string message, bool condition)

تنها در حالتي اين بررسي موفقيت آميز گزارش خواهد شد كه condition مساوي true باشد
public static void AssertEquals(string message, object expected, object actual)
public static void AssertEquals(string message, float expected, float actual, float delta)
public static void AssertEquals(string message, double expected, double actual, double delta)
public static void AssertEquals(string message, int expected, int actual)
public static void AssertEquals(int expected, int actual)
public static void AssertEquals(object expected, object actual)
public static void AssertEquals(float expected, float actual, float delta)
public static void AssertEquals(double expected, double actual, double delta)

تنها در صورتي اين بررسي به اثبات خواهد رسيد كه اشياء actual و expected يكسان باشند. (دلتا در اينجا به عنوان تلرانس آزمايش درنظر گرفته مي‌شود)

public static void AssertNotNull(string message, object anObject)
public static void AssertNotNull(object anObject)

اين بررسي تنها در صورتي موفقيت آميز گزارش مي‌شود كه شيء مورد نظر نال نباشد.

public static void AssertNull(string message, object anObject)
public static void AssertNull(object anObject)

اين بررسي تنها در صورتي موفقيت آميز گزارش مي‌شود كه شيء مورد نظر نال باشد.

public static void AssertSame(string message, object expected, object actual)
public static void AssertSame(object expected, object actual)

تنها در صورتي اين بررسي به اثبات خواهد رسيد كه اشياء actual و expected يكسان باشند.

public static void Fail(string message)
public static void Fail()

همواره Fail خواهد شد. (در مورد كاربرد آن در قسمت بعد توضيح داده خواهد شد)


نكته:
در يك متد آزمايش واحد شما مجازيد به هرتعدادي كه لازم است از متدهاي Assertion استفاده نمائيد. در اين حالت اگر تنها يكي از متدهاي assertion با شكست روبرو شود، كل متد آزمايش واحد شما مردود گزارش شده و همچنين عبارات بعدي Assertion بررسي نخواهند شد. بنابراين توصيه مي‌شود به ازاي هر متد آزمايش واحد، تنها از يك Assertion استفاده نمائيد.

مهم!
كلاس Assertion منسوخ شده است و توصيه مي‌شود بجاي آن از كلاس Assert استفاده گردد.

آشنايي با كلاس Assert :
اين كلاس از متدهاي زير تشكيل شده است:

الف) بررسي حالت‌هاي تساوي

Assert.AreEqual( object expected, object actual );

جهت بررسي تساوي دو شيء مورد بررسي و شيء مورد انتظار بكار مي‌رود.

Assert.AreNotEqual( object expected, object actual );

جهت بررسي عدم تساوي دو شيء مورد بررسي و شيء مورد انتظار بكار مي‌رود.
براي مشاهده انواع و اقسام overload هاي آن‌ها مي‌توانيد به راهنماي NUnit كه پس از نصب، در پوشه doc آن قرار مي‌گيرد مراجعه نمائيد.

همچنين دو متد زير و انواع overload هاي آن‌ها جهت برسي اختصاصي حالت تساوي دو شيء بكار مي‌روند:

Assert.AreSame( object expected, object actual );
Assert.AreNotSame( object expected, object actual );

بعلاوه اگر نياز بود بررسي كنيم كه آيا شيء مورد نظر حاوي يك آرايه يا ليست بخصوصي است مي‌توان از متد زير و oveload هاي آن استفاده نمود:

Assert.Contains( object anObject, IList collection );

ب) بررسي حالت‌هاي شرطي:

Assert.IsTrue( bool condition );

تنها در حالتي اين بررسي موفقيت آميز گزارش خواهد شد كه condition مساوي true باشد

Assert.IsFalse( bool condition);

تنها در حالتي اين بررسي موفقيت آميز گزارش خواهد شد كه condition مساوي false باشد
Assert.IsNull( object anObject );

اين بررسي تنها در صورتي موفقيت آميز گزارش مي‌شود كه شيء مورد نظر نال باشد.
Assert.IsNotNull( object anObject );

اين بررسي تنها در صورتي موفقيت آميز گزارش مي‌شود كه شيء مورد نظر نال نباشد.

Assert.IsNaN( double aDouble );

اين بررسي تنها در صورتي موفقيت آميز گزارش مي‌شود كه شيء مورد نظر عددي نباشد (اگر با جاوا اسكريپت كار كرده باشيد حتما با isNan آشنا هستيد، is not a numeric ).

Assert.IsEmpty( string aString );
Assert.IsEmpty( ICollection collection );

جهت بررسي خالي بودن يك رشته يا ليست بكار مي‌رود.

Assert.IsNotEmpty( string aString );
Assert.IsNotEmpty( ICollection collection );

جهت بررسي خالي نبودن يك رشته يا ليست بكار مي‌رود.

ج) بررسي حالت‌هاي مقايسه‌اي

Assert.Greater( double arg1, double arg2 );
Assert.GreaterOrEqual( int arg1, int arg2 );
Assert.Less( int arg1, int arg2 );
Assert.LessOrEqual( int arg1, int arg2 );

نكته‌اي را كه در اينجا بايد در نظر داشت اين است كه همواره شيء اول با شيء دوم مقايسه مي‌شود. مثلا در حالت اول، اگر شيء اول بزرگتر از شيء دوم بود، آزمايش مورد نظر با موفقيت گزارش خواهد شد.
از ذكر انواع و اقسام overload هاي اين توابع جهت طولاني نشدن مطلب پرهيز شد.

د) بررسي نوع اشياء

Assert.IsInstanceOfType( Type expected, object actual );
Assert.IsNotInstanceOfType( Type expected, object actual );
Assert.IsAssignableFrom( Type expected, object actual );
Assert.IsNotAssignableFrom( Type expected, object actual );

اين توابع و Overload هاي آن‌ها امكان بررسي نوع شيء مورد نظر را ميسر مي‌سازند.

ه) متدهاي كمكي
Assert.Fail();
Assert.Ignore();

در حالت استفاده از ignore ، آزمايش واحد شما در حين اجرا نديد گرفته خواهد شد. از متد fail براي طراحي يك متد assertion سفارشي مي‌توان استفاده كرد. براي مثال:
طراحي متدي كه بررسي كند آيا يك رشته مورد نظر حاوي عبارتي خاص مي‌باشد يا خير:

public void AssertStringContains( string expected, string actual,
string message )
{
if ( actual.IndexOf( expected ) < 0 )
Assert.Fail( message );
}

و) متدهاي ويژه‌ي بررسي رشته‌ها

StringAssert.Contains( string expected, string actual );
StringAssert.StartsWith( string expected, string actual );
StringAssert.EndsWith( string expected, string actual );
StringAssert.AreEqualIgnoringCase( string expected, string actual );
StringAssert.IsMatch( string expected, string actual );

اين متدها و انواع overload هاي آن‌ها جهت بررسي‌هاي ويژه رشته‌ها بكار مي‌روند. براي مثال آيا رشته مورد نظر حاوي عبارتي خاص است؟ آيا با عبارتي خاص شروع مي‌شود يا با عبارتي ويژه، پايان مي‌پذيرد و امثال آن.

ز) بررسي فايل‌ها

FileAssert.AreEqual( Stream expected, Stream actual );
FileAssert.AreEqual( FileInfo expected, FileInfo actual );
FileAssert.AreEqual( string expected, string actual );

FileAssert.AreNotEqual( Stream expected, Stream actual );
FileAssert.AreNotEqual( FileInfo expected, FileInfo actual );
FileAssert.AreNotEqual( string expected, string actual );

اين متدها جهت مقايسه دو فايل بكار مي‌روند و ورودي‌هاي آن‌ها مي‌تواند از نوع stream ، شيء FileInfo و يا مسير فايل‌ها باشد.

ح) بررسي collections

CollectionAssert.AllItemsAreInstancesOfType( IEnumerable collection, Type expectedType );
CollectionAssert.AllItemsAreNotNull( IEnumerable collection );
CollectionAssert.AllItemsAreUnique( IEnumerable collection );
CollectionAssert.AreEqual( IEnumerable expected, IEnumerable actual );
CollectionAssert.AreEquivalent( IEnumerable expected, IEnumerable actual);
CollectionAssert.AreNotEqual( IEnumerable expected, IEnumerable actual );
CollectionAssert.AreNotEquivalent( IEnumerable expected,IEnumerable actual );
CollectionAssert.Contains( IEnumerable expected, object actual );
CollectionAssert.DoesNotContain( IEnumerable expected, object actual );
CollectionAssert.IsSubsetOf( IEnumerable subset, IEnumerable superset );
CollectionAssert.IsNotSubsetOf( IEnumerable subset, IEnumerable superset);
CollectionAssert.IsEmpty( IEnumerable collection );
CollectionAssert.IsNotEmpty( IEnumerable collection );

به صورت اختصاصي و ويژه نيز مي‌توان بررسي مقايسه‌اي را بر روي اشيايي از نوع IEnumerable انجام داد. براي مثال آيا معادل هستند، آيا شيء مورد نظر نال نيست و امثال آن.

نكته: در تمامي overload هاي اين توابع، آرگومان message نيز وجود دارد. از اين آرگومان زمانيكه آزمايش با شكست مواجه شد، جهت ارائه اطلاعات بيشتري استفاده مي‌گردد.

ادامه دارد...