آموزش UnitTest

آموزش UnitTest

بسم الله الرحمن الرحیم

تست نرم افزار

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

UnitTest

مثالی را برای معرفی منطق تست کردن نرم افزار معرفی می کنیم.
میخواهیم یک برنامه بنویسیم که دو عدد را دریافت و با یکدیگر جمع کنند. این برنامه ما بسیار ساده است  و به صورت زیر نوشته می شود.

public void Sum()
{
  TextBoxResult.Text = int.Parse(TextBoxNum1.Text) + int.Parse(TextBoxNum2.Text);
}


در برنامه ما دو TextBox برای وارد کردن اعداد وجود دارد که دو عدد وارد شده با یکدیگر جمع می شوند و در TextBoxResult نمایش داده می شوند. این برنامه در صورتی که مقادیر صحیح وارد شوند به درستی کار خواهد کرد اما اگر کاربر به هر شکلی مقادیر غیر معتبر را وارد نماید چه اتفاقی می افتد؟

بسم الله الرحمن الرحیم

تست نرم افزار

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

UnitTest

مثالی را برای معرفی منطق تست کردن نرم افزار معرفی می کنیم.
میخواهیم یک برنامه بنویسیم که دو عدد را دریافت و با یکدیگر جمع کنند. این برنامه ما بسیار ساده است  و به صورت زیر نوشته می شود.

public void Sum()
{
  TextBoxResult.Text = int.Parse(TextBoxNum1.Text) + int.Parse(TextBoxNum2.Text);
}


در برنامه ما دو TextBox برای وارد کردن اعداد وجود دارد که دو عدد وارد شده با یکدیگر جمع می شوند و در TextBoxResult نمایش داده می شوند. این برنامه در صورتی که مقادیر صحیح وارد شوند به درستی کار خواهد کرد اما اگر کاربر به هر شکلی مقادیر غیر معتبر را وارد نماید چه اتفاقی می افتد؟


Exception

Exception و یا حالتهای خطایی که ممکن است در این برنامه اتفاق بیافتد چیست؟

  • مقادیر ورودی این تابع وارد نشوند
  • عدد وارد شده از نوع int نباشد
  • اعداد خیلی بزرگ باشند
  • در پایان عدد اشتباها Space ثبت شود
  • و....


طبیعتا برای این مثال ساده بررسی کردن تمامی حالتها کار مشکلی نیست اما وقتی با یک برنامه بزرگ روبرو هستیم، نوشتن و مدیریت این خطاها کار ساده ای نیست.
علاوه بر مشکل بودن مدیریت این خطاها ممکن است شما یک خطایی را بر طرف کنید و با این کار خطای دیگری را ایجاد کنید.
معمولا در شرکت های بزرگ برای حل مشکل تست برنامه به این صورت عمل می کنند که، یا قبل از نوشتن برنامه اصلی و یا بعد از آن، بر اساس اطلاع از نام توابع و پارامترها، کلاسی را بر اساس استاندارد و interface تعریف شده می نویسند. در کلاس نوشته شده مقادیری به تابعی که در آینده نوشته خواهد شد ارسال می شود و می بایست مقادیر مورد انتطار را بر گرداند، به هر یک از این مقدار دهی ها Test Case گفته می شود این روش حتی در زمان هایی که زبان های C , C++ برای نوشتن برنامه ها استفاده می شد وجود داشت و روش جدیدی نیست بلکه یک روش پایه است.

روش قبل از پیاده سازی توابع

روش بعد از پیاده سازی توابع

امروزه به جای فرایند های گذشته می توان با استفاده از ابزارهایی که IDE های مختلف مانند Visual Studio در اختیار ما قرار می دهند به سادگی برنامه خود را تست کنیم. مایکروسافت با ارائه پروژه Unit Test به شما این امکان را می دهد که منطق برنامه خود را تست کنید و کد خود را به ازای حالتهای مختلف بررسی کنید و در هر زمان که نیاز داشتید مجددا مقادیر تست را به برنامه بدهید تا اگر مشکلی ایجاد شده است آن را مشاهده کنید.


انواع تست نرم افزار

در حالت کلی شما می توانید نیاز دارید، نرم افزار خود را به دو صورت تست کنید:

تست منطق

1- تست کردن منطق برنامه با استفاده از ارسال مقادیر و بررسی خروجی ها، مثال: برای جمع شما دو عدد منفی را ارسال می کنید و انتظار دارید برنامه این دو عدد را با یکدیگر جمع و یک عدد منفی، که حاصل جمع دو عدد است، به شما بر گرداند. همچنین هنگامی که یک عدد منفی و یک عدد مثبت ارسال می کنید انتظار دارید یک عدد به شما برگرداند که حاصل تفریق دو عدد ارسالی است و علامت مثبت یا منفی عدد برگردانده شده بر مبنای عدد بزرگتر می باشد.

تست UI

خوشبختانه منطق برنامه ها معمولا به خوبی تست می شود، کمترین میزان مشکل را دارند، اما UI برنامه را چطور می توان تست کرد.

مثال: تصور کنید در صفحه ثبت نام کاربر عادی هستید می خواهید به صفحه قبل بر گردید، وقتی بر روی لینک ها کلیک می کنید به شما خطا می دهد! و یا در یک Grid مشخصات تمامی کاربران نمایش داده می شود انتظار دارید وقتی بر روی کامند حذف کلیک می کنید ابتدا یک Message نمایش داده شود و سپس در صورت تایید مجدد اطلاعات حذف شود، اما برنامه بدون نمایش Message اطلاعات را حذف می کند!

طبیعتا تست این موارد بسیار زمان برتر و سخت تر از تست منطق برنامه می باشد، همچنین در اکثر موارد میزان خطاهای احتمالی مربوط به این بخش بسیار بیشتر می باشد.

خوشبختانه نرم افزارها و Framework هایی در این زمینه وجود دارند که می توانند بسیار کمک کننده باشند و مشکل تست نرم افزار را در این بخش مرتفع کنند، این نرم افزار و Framework هارا با نام  Automated GUI Testing می شناسند.

انشالله هر یک از مباحث تست منطق و تست UI برنامه را به صورت مجزا بررسی خواهیم کرد، تا با روش های تست بیشتر آشنا شوید.

Test driven development

TDD یا Test driven development با تصاویر اول نمایش داده شده بسیار متفاوت است، زیرا شما در روش TDD برنامه خود را بر اساس حالت های مختلف تست می کنید و در صورتی که تست های شما Fail شود کد خود را Refactor (بازنویسی و اعمال تغییرات) می کنید و در صورتی که تست شما Pass شود به سراغ تست های بعدی می روید تا کد خود از هر منظری بررسی کنید.

NUnit

Visual Studio با استفاده از Testing framework ایی با نام NUnit می تواند به شما در این زمینه بسیار کمک کند. برای استفاده از این قابلیت شما می بایست NUnit Test Adapter را دانلود و نصب نمایید.
از منوی Tools گزینه Extension Managers را انتخاب کنید.

اموزش تست نرم افزار

اموزش تست نرم افزار


در پنجره باز شده از سمت چپ گزینه Online را انتخاب کنید. سپس می توانید از سمت راست بالا نام NUnit را جستجو کنید و یا به بدون استفاده از جستجو آن را پیدا کنید. پس از پیدا کردن NUnit بر روی گزینه Download کلیک کنید تا NUnit دانلود و نصب شود.

اموزش تست نرم افزار

اموزش unit testing


پس از پایان نصب برای تکمیل نیاز است Visual Studio خود را ببندید و مجددا باز کنید تا تغییرات اعمال شود. وقتی Visual Studio مجددا باز شد شما می توانید از NUnit استفاده کنید.

اموزش unit testing

برای اعمال تغییرات باید Visual Studio خود را ببندید و مجددا باز کنید.

آموزش unit testing

برای استفاده از این امکان مثالی را بررسی خواهیم کرد.
یک پروژه جدید از نوع Class Library را ایجاد می کنیم و نام پروژه را NUnitTests تست قرار می دهیم.

آموزش unit testing


از منوی Tools گزینه  NuGet Package Manager را انتخاب می کنیم و سپس زیر منو Mange NuGet Packages for Solution را انتخاب می کنیم.  در پنجره باز شده بر روی گزینه Online کلیک می کنیم و گزینه NUnit را انتخاب می کنیم، این بار به جای Download گزینه Install فعال است.

NUnit


پس از نصب NUnit چند خطی کد به برنامه خود اضافه می کنیم تا بتوانیم از این قابلیت استفاده کنیم.
همان مثال ابتدایی Sum خود را کمی تغییر می دهیم و به صورت زیر می نویسیم.

 public static int Sum(int number1, int number2)
{
   return number1 + number2;
}

حال یک کلاس جدید با نام NUnitTestClassSum به پروزه خود اضافه کنید:

سپس کدهای زیر را در آن قرار دهید

using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NUnitTests
{
    [TestFixture]
    class NUnitTestClassSum
    {
        [Test]
        public void TestSumTwoNumber()
        {
          /**Arrange*/
            int nuber1 = 0;
            int number2 = 20;
            int reuslt = 0;

            /**Act*/
            reuslt = ClassSum.Sum(nuber1, number2);

            /**Assert*/
            Assert.AreEqual(10, reuslt);
            Assert.IsTrue(true);
        }

        [Test]
        public void TestSumNullTwoNumber()
        {
            int result = ClassSum.Sum(10,-10 );
            Assert.AreEqual(0, result);
        }

        [Test]
        public void TestSumTwoBigNumber()
        {
            int result = ClassSum.Sum(46/655000, 55110);
            Assert.AreEqual(46 /655000 + 55110, result);
        }

    }
}

 [TestFixture]

برای معرفی یک کلاس تست به Visual Studio به کار می رود.

 [Test]

برای معرفی یک Method تست به Visual Studio به کار می رود.

در بخش تست ما باید با سه مفهوم زیر آشنا باشیم
•    Arrange
•    Act
•    Assert

Arrange

در واقعه مقداردهی اولیه و پیاده سازی های اولیه توابع و کلاس برای عملیات تست می باشد (مثلا مقدار دهی به یک تابع)

Act

اجرای متدها و توابع برای بررسی آنها می باشد ( مثلا فراخوانی تابع جمع)

Assert

بررسی یک تابع و یا متد برای تعیین صحت آن می باشد.
در هر تابع و یا متد شما انتظار دارید به ازای مقادیر خاص خروجی خاصی دریافت کنید از همین رو در NUint متدهایی برای بررسی حالتهای مختلف هر تابع وجود دارد.

مثال

/**Arrange*/
int nuber1 = 0;
int number2 = 20;
int reuslt = 0;

/**Act*/
reuslt = ClassSum.Sum(nuber1, number2);

/**Assert*/
Assert.AreEqual(20, reuslt);


توابع زیادی وجود دارند که میتوانید از آنها برای تست برنامه خود استفاده کنید ما از تابع AreEqual استفاده کرده ایم، پارامتر اول این تابع مقداری است که شما انتظار دارید دریافت کنید و پارامتر دوم خروجی تابع برنامه شما است.

کدهای بالا بسیار ساده هستند، ابتدا ما متغییرها و داده های مورد نیاز خود را آماده می کنیم و سپس آن را به متد اصلی انتقال داده و خروجی متد را با مقداری که انتظار آن را داریم بررسی می کنیم.

اجرای Unit Test

در Visual Studio خود Menu ایی با عنوان Test وجود دارد، از این منو گزینه Windows -> Test Explorer را انتخاب کنید.

آموزش unit test در asp net mvc

از پنجره باز شده گزینه Run All را اجرا کنید خواهید دید که برنامه شما با Test Case های مشخص شده بررسی می شود.

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

اگر Test های شما جواب مثبت ندهند، بدین معنا است که کد شما نیاز به تغییر دارد.


طبیعتا این یک مثال ساده بود و به خوبی نمی توانست قابلیت NUint را به شما نشان دهد، انشالله در آموزش های بعدی مفاهیم پیشرفته تر را بررسی خواهیم کرد.

علاوه بر Unit Test، مایکروسافت نیز Framework دیگری را برای تست برنامه ها در اختیار شما قرار می دهد. که این Framework را نیز به صورت سریع بررسی می کنیم. در بسیاری از پروژه ها، پروژه ای با عنوان تست به برنامه اضافه می کند در این مثال ما نیز کدهای تست خود را در پروژه ای جداگانه قرار می دهیم.

یک پروژه دیگر به برنامه خود اضافه می کنیم و کدهای زیر را به کلاس خود اضافه نمایید. این پروژه باید از نوع تست باشد به همین دلیل بر روی Solution خود راست کلیک کنید و سپس گزینه Add را انتخاب و در نهایت زیر منو باز شده گزینه New Project را انتخاب کنید.

در پنجره باز شده، از سمت چپ گزینه Test را انتخاب و از بخش اصلی پنجره گزینه Unit Test را انتخاب کنید.

آموزش UnitTest

حال نام پروژه را Unit Test Project قرار داده و سپس گزینه Ok را بزنید.

بر روی نام پروژه Unit Test Project کلیک راست کنید از گزینه Add زیر گزینه Unit Test را انتخاب کنید. این گزینه باعث می شود کلاسی برای نوشتن تست های برنامه شما ایجاد شود.

کد کلاس شما به صورت زیر خواهد بود:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject
{
    [TestClass]
    public class UnitTest
    {
        [TestMethod]
        public void TestMethod()
        {
        }
    }
}

حال می توانید در میان تابع TestMethod تست های مورد نظر خود را بنویسید و یا به ازای هر تست یک تابع مجزا ایجاد کنید:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            /**ABLY.ir*/
        }
        
        [TestMethod]
        public void TestSumTwoNumber()
        {


            /**Arrange*/
            int nuber1 = 0;
            int number2 = 20;
            int reuslt = 0;

            /**Act*/
            reuslt = NUnitTests.ClassSum.Sum(nuber1, number2);

            /**Assert*/
            Assert.AreEqual(10, reuslt);
            Assert.IsTrue(true);
        }

         [TestMethod]
        public void TestSumNullTwoNumber()
        {

            int result = NUnitTests.ClassSum.Sum(10, -10);
            Assert.AreEqual(0, result);

        }

         [TestMethod]
        public void TestSumTwoBigNumber()
        {

            int result = NUnitTests.ClassSum.Sum(46 / 655000, 55110);
            Assert.AreEqual(46 / 655000 + 55110, result);

        }
    }
}


حال می توانید مجددا کدهای خود را با این پروژه نیز تست کنید.

نظرات

  • Hannah Martinez
    آموزش php
    دو شنبه 11 دی 1278 - 0:00

    با سلام و درود

    ممنون خیلی توضیحات خوبی بود.
    واقعا در ایران به تست پرداخته نمی شورد.

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس