۱۳۸۷/۱۰/۱۳

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


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

اگر قسمت سوم را دنبال كرده باشيد احتمالا از تعداد مراحلي كه بايد در خارج از IDE صورت گيرد گلايه خواهيد كرد (كامپايل كن، اجرا كن، اتچ كن، باز كن، ذخيره كن، اجرا كن و ...). خوشبختانه افزونه ReSharper اين مراحل را بسيار ساده و مجتمع كرده است.
اين افزونه به صورت خودكار متدهاي آزمايش واحد يك پروژه را تشخيص داده و آنها را با آيكون‌هايي ( Gutter icons ) متمايز مشخص مي‌سازد (شكل زير). پس از كليك بر روي آن‌ها ، امكان اجراي آزمايش يا حتي ديباگ كردن سطر به سطر يك متد آزمايش واحد درون IDE‌ ويژوال استوديو وجود خواهد داشت.



براي نمونه پس از اجراي آزمايش واحد قسمت قبل، نتيجه حاصل مانند شكل زير خواهد بود:



راه ديگر، استفاده از افزونه TestDriven.NET است كه نحوه استفاده از آن‌را اينجا مي‌توانيد ملاحظه نمائيد. به منوي جهنده كليك راست بر روي يك صفحه، گزينه run tests را اضافه مي‌كند و نتيجه حاصل را در پنجره output ويژوال استوديو نمايش مي‌دهد.

ساختار كلي يك كلاس آزمايش واحد مبتني بر NUnit framework :

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

namespace TestLibrary
{
[TestFixture]
public class Test2
{
[SetUp]
public void MyInit()
{
//كدي كه در اين قسمت قرار مي‌گيرد پيش از اجراي هر متد تستي اجرا خواهد شد
}

[TearDown]
public void MyClean()
{
//كدي كه در اين قسمت قرار مي‌گيرد پس از اجراي هر متد تستي اجرا خواهد شد
}

[TestFixtureSetUp]
public void MyTestFixtureSetUp()
{
// كدي كه در اينجا قرار مي‌گيرد در ابتداي بررسي آزمايش واحد و فقط يكبار اجرا مي‌شود
}

[TestFixtureTearDown]
public void MyTestFixtureTearDown()
{
// كدهاي اين قسمت در پايان كار يك كلاس آزمايش واحد اجرا خواهند شد
}

[Test]
public void Test1()
{
//بدنه آزمايش واحد در اينجا قرار مي‌گيرد
Assert.That(2, Is.EqualTo(2));
}
}
}

شبيه به روال‌هاي رخداد گردان load و close يك فرم، يك كلاس آزمايش واحد NUnit نيز داراي ويژگي‌هاي TestFixtureSetUp و TestFixtureTearDown است كه در ابتدا و انتهاي آزمايش واحد اجرا خواهند شد (براي درك بهتر موضوع و دنبال كردن نحوه‌ي اجراي اين روال‌ها، داخل اين توابع break point قرار دهيد و با استفاده از ReSharper ، آزمايش را در حالت ديباگ آغاز كنيد)، يا SetUp و TearDown كه در زمان آغاز و پايان بررسي هر متد آزمايش واحدي فراخواني مي‌شوند.
همانطور كه در قسمت قبل نيز ذكر شد، به امضاهاي متدها و كلاس فوق دقت نمائيد (عمومي ، void و بدون آرگومان ورودي).
بهتر است از ويژگي‌هاي SetUp و TearDown با دقت استفاده نمود. عموما هدف از اين روال‌ها ايجاد يك شيء و تخريب و پاك سازي آن است. حال اينكه اين روال‌ها قبل و پس از اجراي هر متد آزمايش واحدي فراخواني مي‌شوند. بنابراين به اين موضوع دقت داشته باشيد.
همچنين توصيه مي‌شود كه كلاس‌هاي آزمايش واحد را در اسمبلي ديگري مجزا از پروژه اصلي پياده سازي كنيد (براي مثال يك پروژه جديد از نوع class library)، زيرا اين موارد مرتبط با بررسي كيفيت كدهاي شما هستند كه موضوع جداگانه‌اي نسبت به پروژه اصلي محسوب مي‌گردد (نحوه پياده سازي آن‌‌را در قسمت قبل ملاحظه نموديد). همچنين در يك پروژه تيمي اين جدا سازي، مديريت آزمايشات را ساده‌تر مي‌سازد و بعلاوه سبب حجيم شدن بي‌مورد اسمبلي‌هاي اصلي محصول شما نيز نمي‌گردند.


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