۱۳۸۷/۱۰/۰۹

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


آشنايي با NUnit

NUnit يكي از فريم ورك‌هاي آزمايش واحد سورس باز مخصوص دات نت فريم ورك است. (كلا در دات نت هرجايي ديديد كه N ، به ابتداي برنامه‌اي يا كتابخانه‌اي اضافه شده يعني نمونه منتقل شده از محيط جاوا به دات نت است. براي مثال NHibernate از Hibernate جاوا گرفته شده است و الي آخر)
اين برنامه با سي شارپ نوشته شده است اما تمامي زبان‌هاي دات نتي را پشتيباني مي‌كند (اساسا با زبان نوشته شده كاري ندارد و فايل اسمبلي برنامه را آناليز مي‌كند. بنابراين فرقي نمي‌كند كه در اينجا چه زباني بكار گرفته شده است).

ابتدا NUnit را دريافت نمائيد:
http://nunit.org/index.php?p=download

يك برنامه ساده از نوع console را در VS.net آغاز كنيد.
كلاس MyList را با محتواي زير به پروژه اضافه كنيد:
using System.Collections.Generic;

namespace sample
{
public class MyList
{
public static List<int> GetListOfIntItems(int numberOfItems)
{
List<int> res = new List<int>();

for (int i = 0; i < numberOfItems; i++)
res.Add(i);

return res;
}
}

}

يكبار پروژه را كامپايل كنيد.

اكنون بر روي نام پروژه در قسمت solution explorer كليك راست كرده و گزينه add->new project را انتخاب كنيد. نوع اين پروژه را كه متدهاي آزمايش واحد ما را تشكيل خواهد داد، class library انتخاب كنيد. با نام مثلا TestLibrary (شكل زير).



با توجه به اينكه NUnit ، اسمبلي برنامه (فايل exe يا dll آن‌را) آناليز مي‌كند، بنابراين مي‌توان پروژه تست را جداي از پروژه اصلي ايجاد نمود و مورد استفاده قرار داد.
پس از ايجاد پروژه class library ، بايد ارجاعي از NUnit framework را به آن اضافه كنيم. به محل نصب NUnit مراجعه كرده (پوشه bin آن) و ارجاعي به فايل nunit.framework.dll را به پروژه اضافه نمائيد (شكل زير).



سپس فضاهاي نام مربوطه را به كلاس آزمايش واحد خود اضافه خواهيم كرد:

using NUnit.Framework;
using NUnit.Framework.SyntaxHelpers;

اولين نكته‌اي را كه بايد در نظر داشت اين است كه كلاس آزمايش واحد ما بايد Public باشد تا در حين آناليز اسمبلي پروژه توسط NUint، قابل دسترسي و بررسي باشد.
سپس بايد ويژگي جديدي به نام TestFixture را به اين كلاس اضافه كرد.

[TestFixture]
public class TestClass

اين ويژگي به NUnit‌ مي‌گويد كه در اين كلاس به دنبال متدهاي آزمايش واحد بگرد. (در NUnit از attribute ها براي توصيف عملكرد يك متد و همچنين دسترسي runtime به آن‌ها استفاده مي‌شود)
سپس هر متدي كه به عنوان متد آزمايش واحد نوشته مي‌شود، بايد داراي ويژگي Test باشد تا توسط NUnit بررسي گردد:

[Test]
public void TestGetListOfIntItems()

نكته: متد Test ما بايد public‌ و از نوع void باشد و همچنين هيچ پارامتري هم نبايد داشته باشد.

اكنون براي اينكه بتوانيم متد GetListOfIntItems برنامه خود را در پروژه ديگري تست كنيم، بايد ارجاعي را به اسمبلي آن اضافه كنيم. همانند قبل، از منوي project‌ گزينه add reference ، فايل exe برنامه كنسول خود را انتخاب كرده و ارجاعي از آن‌را به پروژه class library اضافه مي‌كنيم. بديهي است امكان اينكه كلاس تست در همان پروژه هم قرار مي‌گرفت وجود داشت و صرفا جهت جداسازي آزمايش از برنامه اصلي اين‌كار صورت گرفت.
پس از اين مقدمات، اكنون متد آزمايش واحد ساده زير را در نظر بگيريد:

[Test]
public void TestGetListOfIntItems()
{
const int count = 5;
List<int> items = sample.MyList.GetListOfIntItems(count);
Assert.That(items.Count,Is.EqualTo(5));
}

قصد داريم بررسي كنيم آيا متد GetListOfIntItems واقعا همان تعداد آيتمي را كه بايد برگرداند، بازگشت مي‌دهد؟ عدد 5 به آن پاس شده است و در ادامه قصد داريم بررسي كنيم، count شيء حاصل (items در اينجا) آيا واقعا مساوي عدد 5 است؟
اگر آن را (سطر مربوط به Assert را) كلمه به كلمه بخواهيم به فارسي ترجمه كنيم به صورت زير خواهد بود:
مي‌خواهيم اثبات كنيم كه count مربوط به شيء items مساوي 5 است.

پس از اضافه كردن متد فوق، پروژه را كامپايل نمائيد.

اكنون برنامه nunit.exe را اجرا كنيد تا NUnit IDE ظاهر شود (در همان دايركتوري bin مسير نصب NUnit قرار دارد).
از منوي File آن يك پروژه جديد را آغاز نموده و آنرا ذخيره كنيد.
سپس از منوي project آن، با استفاده از گزينه add assembly ، فايل dll كتابخانه تست خود را اضافه نمائيد.
احتمالا پس از انجام اين عمليات بلافاصله با خطاي زير مواجه خواهيد شد:

---------------------------
Assembly Not Loaded
---------------------------
System.ApplicationException : Unable to load TestLibrary because it is not located under
the AppBase
----> System.IO.FileNotFoundException : Could not load file or assembly
'TestLibrary' or one of its dependencies. The system cannot find the file specified.
For further information, use the Exception Details menu item.

اين خطا به اين معنا است كه پروژه جديد NUnit بايد دقيقا در همان پوشه خروجي پروژه، جايي كه فايل dll كتابخانه تست ما توليد شده است، ذخيره گردد. پس از افزودن اسمبلي، نماي برنامه NUnit بايد به شكل زير باشد:



همانطور كه ملاحظه مي‌كنيد، NUnit با استفاده از قابليت‌هاي reflection در دات نت، اسمبلي را بارگذاري مي‌كند و تمامي كلاس‌هايي كه داراي ويژگي TestFixture باشند در آن ليست خواهد شد.
اكنون بر روي دكمه run كليك كنيد تا اولين آزمايش ما انجام شود. (شكل زير)



رنگ سبز در اينجا به معناي با موفقيت انجام شدن آزمايش است.

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