فرض کنید شما در حال کار بر روی یک پروژه بزرگ هستید و باید در زمان مشخص آن را تحویل دهید. حال مدیرشرکت هر چند روز یک بار از شما میخواهد بخشی از پروژه که تکمیل شده را مشاهده کند!( البته فرض کنید:*) خوب حالا شما اگر کدهای خودتون رو تست نکنید ممکن هست وقتی که میخواید پروژه رو برای مدیر ران کنید یهو یه باگ خودش رو نشون بده! و این موقع است که مدیر برمیگرده و به شما زل میزنه! و شما هم به کدهاتون!
اما خوب چاره ی کار چیست؟
چاره ی کار استفاده از تست واحد هست!
تست واحد چیست؟؟؟
Unit Testing (تست واحد) امکان تست هر بخش از برنامه و کد را بصورت جداگانه فراهم میکنه.
فرض کنید شما یک بخش برای ایجاد پست، ویرایش و حذف آن دارید و هر کدام هم روت مخصوص به خود را دارند. در تست واحد شما برای هرکدام از این بخش ها توابع خاص می نویسید که برای نمونه یک مطلب در دیتابیس ذخیره و نتیجه اون رو با هم بررسی میکنید که آیا مقدار برگشی با مقداری که شما انتظار دارید برابر می باشد یا خیر، به همین صورت شما می توانید برای همه بخش های نرم افزار خود و توابعی که ایجاد کرده اید، تست واحد بنویسید و از صحت کارکرد آنها مطمئن شوید.
unit testing این امکان رو برای شما فراهم می کنه که شما در هنگام اجرای نهایی برنامه با خطاهای ناخواسته مواجه نشوید و به این صورت نرم افزار مورد اعتماد تری را ایجاد نمایید.
در فریم وورک ها و زبان های مختلف روش ها و بخش های مختلفی برای تست واحد پیش بینی شده است که در لاراول نیست این امکان به راحتی برای توسعه دهندگان فراهم شده است و شما می توانید به راحتی کدهای خودتون رو تست کنید.
در این مطلب قصد داریم با یک مدل در لاراول ایجاد و سپس تست واحد را برای این مدل اجرا کنیم.
پس اگر به تست واحد علاقه مند هستید تا انتهای مطلب همراه ما باشید:
برای شروع ابتدا لاراول را نصب، تنظیمات دیتابیس را در فایل .env انجام دهید
1- حال برای ایجاد مدل مورد نظر دستور زیر را در خط فرمان سیستم خود اجرا نمایید:
php artisan make:model Post -c -m -f
با اجرای دستور بالا مدل Post ایجاد و همراه آن کنترلر و فکتوری آن نیز ایجاد خواهد شد.
2- به فایل مایگریشن مربوط به مدل Post رفته و کدهای درون متد Up() را بصورت زیر تغییر دهید:
$table->increments('id');
$table->string('title');
$table->text('content');
$table->timestamps();
3- به فایل /database/factories/PostFactory.php رفته و آن را بصورت زیر تغییر دهید:
define(App\Post::class, function (Faker $faker) {
return [
'title' => $faker->sentence,
'content' => $faker->paragraph
];
});
4- مدل پست خود را بصورت زیر تغییردهید:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = [
'title',
'content'
];
}
5- حال برای انجام عملیات Crud در تست واحد، کنترلر مدل پست را بصورت زیر تغییر می دهیم:
به فایل /app/Http/Controllers/PostController.php رفته و آن را بصورت زیر تغییر دهید:
<?php
namespace App\Http\Controllers;
use App\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function index() {
return Post::all();
}
public function show(Post $post) {
return $post;
}
public function store(Request $request) {
$post = Post::
create($request->all());
return response()->json($post, 201);
}
public function update(Request $request, Post $post) {
$post->update($request->all());
return response()->json($post);
}
public function delete(Post $post) {
$post->delete();
return response()->json(null, 204);
}
}
در کنترلر بالا عملیات های select, store, update and delete انجام میشود.
متد Index : تمامی پست ها را برگشت خواهد داد
متد Show : یک پست خواص را نمایش خواهد داد.
متد Store : این متد کار ایجاد یک پست جدید را بر عهده دارد. کد برگشتی از این متد 201 می باشد که به معنی ایجاد یک ردیف جدید می باشد.
متد Update : با کد برگشتی 200، کار بروزرسانی را انجام خواهد داد
و متد Delete: عملیات حذف را انجام خواهد داد وچون محتوایی برای برگشت ندارد، کد برگشتی آن 204 می باشد.
6- حال باید روت های مربوطه را ایجاد نماییم، برای اینکار به فایل /routes/api.php رفته و کدهای زیر را در آن قرار دهید:
Route::group(['prefix' => 'posts'], function() {
Route::get('/', 'PostController@index')->name('posts');
Route::get('/{post}', 'PostController@show')->name('posts.show');
Route::post('/', 'PostController@store')->name('posts.store');
Route::put('/{post}', 'PostController@update')->name('posts.update');
Route::delete('/{post}', 'PostController@delete')->name('posts.delete');
});
دقت کنید که کد را در فایل مربوط به api قرار می دهیم، پس فراموش نکنید برای دسترسی به هرکدام از روت های بالا باید api را در ابتدای prefix آن صدا بزنید.
7- در این مرحله با اجرای دستور زیر migrate مربوط به مدل Post را ایجاد خواهیم کرد:
php artisan migrate
8 - فایل /tests/TestCase.php را باز و آن را بصورت زیر تغییر دهید:
<?php
namespace Tests;
use Faker\Factory;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
use CreatesApplication, DatabaseMigrations;
protected $faker;
public function setUp() {
parent::setUp();
$this->faker = Factory::create();
}
}
8- برای ایجاد یک unit فایل جدید دستور زیر را در خط فرمان سیستم خود اجرا نمایید:
php artisan make:test PostTest --unit
فایل ایجاد شده در آدرس /tests/Unit/PostTest.php را باز کنید و کدهای زیر را در آن قرار دهید:
<?php
namespace Tests\Unit;
use App\Post;
use Tests\TestCase;
class PostTest extends TestCase
{
public function test_can_create_post() {
$data = [
'title' => $this->faker->sentence,
'content' => $this->faker->paragraph,
];
$this->post(route('posts.store'), $data)
->assertStatus(201)
->assertJson($data);
}
public function test_can_update_post() {
$post = factory(Post::class)->create();
$data = [
'title' => $this->faker->sentence,
'content' => $this->faker->paragraph
];
$this->put(route('posts.update', $post->id), $data)
->assertStatus(200)
->assertJson($data);
}
public function test_can_show_post() {
$post = factory(Post::class)->create();
$this->get(route('posts.show', $post->id))
->assertStatus(200);
}
public function test_can_delete_post() {
$post = factory(Post::class)->create();
$this->delete(route('posts.delete', $post->id))
->assertStatus(204);
}
public function test_can_list_posts() {
$posts = factory(Post::class, 2)->create()->map(function ($post) {
return $post->only(['id', 'title', 'content']);
});
$this->get(route('posts'))
->assertStatus(200)
->assertJson($posts->toArray())
->assertJsonStructure([
'*' => [ 'id', 'title', 'content' ],
]);
}
}
توضیح کد بالا:
همانطور که می بینید هر تابع با کلمه test شروع می شود که این برای ساخت یک تابع تست لازم می باشد. یعنی توابعی که شما برای تست ایجاد می کنید حتما باید کلمه test را در ابتدای خود داشته باشند تا توسط تست واحد شناسایی شوند.
تابع assertStatus کار بررسی مقدار استاتوس کد برگشتی را انجام می دهد. برای نمونه اگر باید صفحه ای باید کد 201 را برگرداند تابع assertStatus() باید بصورت assertStatus(201) ایجاد شود.
تابع assertJson کار بررسی json برگشتی و مقداری که ما انتظار آن را از صفحه مورد نظر داریم را انجام می دهد.
البته توابع بسیاری برای کار با تست واحد وجود دارد که میتوانید با یک جستجوی ساده در گوگل آن ها را پیدا و در هنگام نیاز از این توابع استفاده نمایید.
در نهایت برای اجرای تست خود دستور زیر را در خط فرمان سیستم خود اجرا نمایید:
phpunit
یا
./vendor/bin/phpunit
که با پاسخی بصورت زیر باید روبرو شوید:
PHPUnit 7.3.0 by Sebastian Bergmann and contributors.
.. 2 / 2 (100%)
Time: 1.12 seconds, Memory: 12.00MB
OK (2 tests, 2 assertions)
این پاسخ به شما میگوید که تست های شما با موفقیت انجام شده است.
شما می توانید برای روت ها و مدل های خود، تست واحد را اجر و از صحت اجرای هر بخش اطمینان حاصل نمایید
درصورتی که سوالی یا پیشنهادی دارید از بخش نظرات برای ما ارسال نمایید
برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *
ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *
هنوز برای این مطلب نظری ارسال نشده است!