در این پست از وبسایت پرووید در رابطه با انجام Unit Testing در سی شارپ و .Net Core با xUnit #2 صحبت خواهیم کرد. .NET Core نسل بعدی فریم ورک دات نت است که توسط مایکروسافت معرفی شده است.

ساخت اولین unit test

اگر با روش test-driven development آشنا هستید که آموزش‌های کاملی از آن نیز بر روی وبسایت پرووید قرار گرفته است می‌دانید که اولین قدم در test-driven development نوشتن یک test ی است که با fail می شود. و سپس پیاده‌ سازی کدی که باعث pass شدن آن test می ‌شود و پس از آن انجام ریفکتورینگ. در این آموزش ما فایل UnitTest1.cs را حذف کرده و یک فایل با نام PrimeService_IsPrimeShould.cs. اضافه می‌کنیم. کد زیر محتویات این فایل را نشان می‌دهد.

using Xunit;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    public class PrimeService_IsPrimeShould
    {
        private readonly PrimeService _primeService;

        public PrimeService_IsPrimeShould()
        {
            _primeService = new PrimeService();
        }

        [Fact]
        public void ReturnFalseGivenValueOf1()
        {
            var result = _primeService.IsPrime(1);

            Assert.False(result, "1 should not be prime");
        }
    }
}

همانطور که در کد بالا مشاهده می کنید یک attribute با نام [Fact] بر روی test method قرار گرفته که به test runner می گوید که این متد یک test method می ‌باشد. از طریق فولدر PrimeService.Tests دستور dotnet test را اجرا کرده تا test ها و class library ساخته شده build و سپس run شوند.

بسته ی آموزش ویدئویی ساخت برنامه های Cross-Platform با .NET Core

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی ساخت برنامه های Cross-Platform با .NET Core دیدن کنید.

در واقع test runner مربوط به xUnit حاوی entry point یا نقطه شروع مربوط به برنامه به منظور run کردن test ها می باشد و دستور dotnet test باعث می شود که test runner شروع شود و پروژه unit test ای که ایجاد کرده اید اجرا شود. بدون شک تست شما در این مرحله fail خواهد شد چرا که هیچ پیاده سازی برای متد Is Prime در کلاس PrimeService انجام نداده اید. لطفاً کدی که در قسمت زیر می‌بینید را به عنوان پیاده سازی این متد لحاظ کنید و سپس دستور dotnet test را از فولدر PrimeService.Tests اجرا کنید.

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Please create a test first");
}

دستور dotnet test باعث build شدن و run شدن پروژه PrimeService و سپس PrimeService.Tests می شود. خوشبختانه در این مرحله این تست pass خواهد شد.

افزودن قابلیت های بیشتر

حال که توانسته اید test اول را pass کنید زمان نوشتن test های بیشتر است. دقت کنید که برای اعداد اول یا همان prime number ها که برنامه به منظور در نظر گرفتن و ساختن آنها انجام شده است موارد دیگری نیز از قبیل صفر و منفی یک وجود دارند. می شود این موارد را هم نیز در قالب test method هایی که با عطر attribute ای با نام [Fact] مشخص می‌ شوند ایجاد کرد. اما این روش روش مناسبی نیست.

در xUnit ما می توانیم با استفاده از attribute های دیگری test های مشابه ایجاد کنیم. یکی از این attribute ها [Theory] و دیگری این [InlineData] می باشد. همین جا قصد داریم از شما دعوت کنیم که از بسته ویدئویی unit testing پیشرفته و test-driven development پیشرفته که هر دو از آموزش های وب سایت pluralsight می باشد و دوبله فارسی آنها بر روی وبسایت پرووید قرار گرفته اند استفاده کنید.

در این آموزش ها در رابطه با xUnit و ویژگی های مختلفی که ارائه می ‌کند صحبت کرده ایم. خب [Theory] به شما کمک می کند که مجموعه ای از test های مشابه که یک کد مشترک و یکسان را تست می‌کند اما پارامترهای ورودی مختلفی را دارند ایجاد کنید و [InlineData] برای مشخص کردن مقادیر این پارامترهای ورودی می باشد.

بسته ی آموزش ویدئویی .NET Core برای برنامه نویسان ویندوز

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی .NET Core برای برنامه نویسان ویندوز دیدن کنید.

بنابراین به منظور بررسی کردن موارد دیگر از اعداد اول از قبیل صفر و منفی یک به جای اینکه تست های جدید بنویسیم attribute های [Theory] و [InlineData] را استفاده می کنیم تا بتوانیم یک تست یکسان در فایل PrimeService_IsPrimeShould.cs. ایجاد کنیم.

[Theory]
[InlineData(-1)]
[InlineData(0)]
[InlineData(1)]
public void ReturnFalseGivenValuesLessThan2(int value)
{
    var result = _primeService.IsPrime(value);
    
    Assert.False(result, $"{value} should not be prime");
}

این theory یک متد است که مقادیر مختلفی را که کوچکتر از دو هستند را تست می‌کند. این موضوع در کد زیر نشان داده شده است.

با اجرا کردن این تستها که در واقع سه تست مختلف میباشند دو تا از آنها fail خواهند شد. به منظور pass شدن همه آنها دستور if ی که در قسمت ابتدایی متد IsPrime قرار گرفته است را به شکل (candidate < 2) تغییر دهید.

خب امیدواریم که این آموزش از وبسایت پرووید نیز مورد توجه شما قرار گرفته باشد. در این آموزش به صورت ابتدایی در رابطه با unit testing در .NET Core و سی شارپ صحبت کردیم. توصیه می‌کنیم حتماً از آموزش های وبسایت پرووید در رابطه با unit testing استفاده کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *