مروری پایه بر آزمایش‌های واحد در برنامه‌نویسی

یک فن فراموش‌شده
هیچ برنامه‌نویسی نمی‌تواند مدعی باشد که قطعه کدی که نوشته است درست و بدون مشکل کار می‌کند، همیشه یک حالت هست که شما آن‌را در نظر نگرفته‌اید و همان باعث بروز خطا می‌شود. پس هیچ‌گاه نباید کامپایل درست کد را به ‌حساب درست بودن آن بگذارید.

‌ خب چاره چیست؟ آزمون‌‌های پیاپی توسط افراد متفاوت؟ این عمل در فاز اولیه توسعه هزینه‌بر است. بهتر است منتظر بمانید تا گروه آزمایش، درستی عملکرد کد شما را تایید کند. برای گرفتن این تاییدیه آزمایش‌های واحد (Unit Testing) به‌کمک شما خواهد آمد. آزمایش واحد بیشتر برای تعیین درستی کارکرد یک متد به‌کار می‌رود.

آیا هر متدی را می‌توان در آزمایش واحد گنجاند؟

بی‌شک نه! چراکه برای هر آزمایش‌ واحد، حد و مرزی وجود دارد و آزمایش باید در آن حد و مرز قرار بگیرد. مثلا متدی که برای وصل شدن به پایگاه داده است یا بارگذاری فایل از اینترنت یا خواندن فایل، جزو آزمایش‌های واحد محسوب نمی‌شود. برای مثال اگر یکی از متدهای شما بزرگترین عدد یک فهرست را از پایگاه داده دریافت می‌کند، در متدی که برای آزمایش واحد آن تهیه خواهید کرد نباید هیچ‌گونه کدی جهت برقراری ارتباط با دیتابیس نوشته شود.
این امر سبب سریع‌تر اجرا شدن آزمایش‌های واحد خواهد شد و در آینده شما را از انجام آن به ‌دلیل کند‌ بودن روند انجام آزمایش‌ها، منصرف نخواهد کرد. همچنین تغییرات انجام شده در لایه دسترسی به داده‌ها سبب غیرمعتبر شدن این نوع آزمایش‌ها نخواهد شد. به بیان دیگر وظیفه متد آزمایش واحد، اتصال به پایگاه داده یا شبکه یا خواندن اطلاعات از یک فایل نیست.

چرا برنامه‌نویس‌ها آزمایش‌های واحد را انجام نمی‌دهند؟

یکی از دلایل این است که این کار را امری پرهزینه و در مرحله توسعه برنامه بی‌فایده می‌پندارند، در صورتی که این تفکر اشتباه است. آزمایش واحد به برنامه‌نویس‌ها کمک می‌کند که از درستی کدهای نوشته شده در همان زمان آگاه شوند و به مرور زمان با حجم عظیمی از کدهای خراب روبه‌رو نشوند. اگر شما به‌عنوان برنامه‌نویس برای هر کدی که می‌نویسید همان لحظه یک آزمایش واحد هم بنویسید هیچ ضرر زمانی نکرده‌اید. درست است که آزمایش واحد امری زمان‌بر است ولی به‌مرور، این زمان کاهش پیدا می‌کند. حال بیایید با هم برای یک پروژه کوچک یک آزمایش واحد بنویسیم. فرض کنید شما کلاسی به‌صورت زیر نوشته‌اید:

class SampleForUnitTest {

public SampleForUnitTest() {

Students = new List«string»(); }

public List«string» Students {get; set;}

 

public List«string» GetNameWithBigLength

(int length) {

List«string» result = new List«string»();

foreach (var student in Students) {

if (student.Length »= length) {

result.Add(student); } }

return result; }

}

بسیار خب، ما می‌خواهیم آزمایش واحدی انجام دهیم که درستی عملکرد GetNameWithBigLength را نشان دهد، برای این‌ کار از NUnit استفاده می‌کنیم. NUnit چهارچوب کاری برای انجام آزمایش‌های واحد است که تبدیل شده JUnit (که برای جاوا هست) برای دات‌نت است. بعد از بارگــزاری NUnit یک پروژه جــدید از نوع
Class Library ایجاد کرده و فایل اسمبلی Nunit.Framework.dll را به پروژه خود ارجاع دهید، حال باید کلاسی تعریف کنیم که نشان‌دهنده آزمایش واحد است. در کلاس ما صفت TestFixture باید نشانه‌گذاری شود. در این کلاس باید متدهایی برای آزمایش تعریف کنیم. این متدها باید با صفت Test‌ و به‌صورت public‌ تعریف شده باشند که نه مقداری را برگردانند و نه مقداری را به عنوان ورودی دریافت کنند. بسیار خب، با توضیحات بالا کلاس آزمایش واحد ما به‌صورت زیر درخواهد آمد.

[TestFixture]

public class FisrtTest {

[Test]

public void TestGetHighLength()

{ ... }

}

در بدنه متد TestGetHighLength باید کدهای مربوط به آزمایش واحد متد GetNameWithBigLength نوشته شود. ابتدا یک شیء از کلاس SampleForUnitTest می‌سازیم. سپس مقدار ویژگی Students را مقداردهی می‌کنیم و مقدار برگشتی تابع GetNameWithBigLength را با مقداری که باید برگرداند مقایسه می‌کنیم، اگر مقدار برگشتی درست بود نتیجه می‌گیریم که متد ما کارش را به‌درستی انجام می‌دهد، که کد آن به‌صورت زیر خواهد بود:

var sample = new SampleForUnitTest();

sample.Students.AddRange(new string[]

{ «Click», «Jamejam», «Nunit» });

int result = sample.GetNameWithBigLength(5).Count;

Assert.IsTrue(result == 2);

نکته‌ای که در کد بالا وجود دارد متد Assert.IsTrue است که این متد یک شرط را چک می‌کند. اگر نتیجه حاصل از شرط درست بود مقدار true، و اگر غلط بود مقدار false را به NUnit‌ می‌دهد، مقدار بازگشتی از این متد نشان می‌دهد که متد شما درست است یا نه؟ ‌

حال برای آزمون، برنامهnunit IDE را که در پوشه نصب شده NUnit است، اجرا کرده و یک پروژه جدید بسازید. مسیر پروژه را در همان مسیر پیش‌فرض قبول کنید‌ و اگر مسیر دیگری را انتخاب می‌کنید توجه داشته باشید که فایل nunit.framework.dll در آن مسیر وجود داشته باشد. پس از ساختن پروژه از منوی Project گزینه Add Assembly را انتخاب کنید، سپس روی گزینه Run کلیک کنید. اگر آزمایش واحد شما درست بوده باشد این مورد به شما اطلاع داده خواهد شد و اگر اشتباه باشد برای هر متد اشتباه، عدد آنها را نیز به ‌همراه نام و خطی که اشتباه است به شما نشان می‌دهد. این یک مقدمه ساده در مورد آزمایش‌های واحد بود. اگر فرصتی بود در هفته‌های آتی دیگر ویژگی‌های آزمایش واحد را نیز بررسی خواهیم کرد.

امیربهاالدین سبط‌الشیخ

/ 0 نظر / 7 بازدید