TDD (Test-Driven Development) adalah sebuah metode pengembangan yang dikendalikan oleh pengujian atau test. Jadi kita perlu menulis kode untuk testing terlebih dahulu setelah itu baru kita menulis kode untuk aplikasi.
proses TDD ini dilakukan untuk memastikan aplikasi kita sudah berjalan sesuai dengan requirement dan mampu menangani berbagai kasus.
Persiapan Laravel Test
langkah awal silahkan kalian isi terlebuh dahulu nama database yang terdapat pada file .env kemudian silahkan kalian buka file phpunit.xml dan silahkan buka komen pada kode dibawah ini.
<env name="DB_CONNECTION" value="mysql"/> <env name="DB_DATABASE" value=":memory:"/>
sehingga keseluruhan kodenya seperti berikut
<?xml version="1.0" encoding="UTF-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" bootstrap="vendor/autoload.php" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false"> <testsuites> <testsuite name="Feature"> <directory suffix="Test.php">./tests/Feature</directory> </testsuite> <testsuite name="Unit"> <directory suffix="Test.php">./tests/Unit</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">./app</directory> </whitelist> </filter> <php> <env name="APP_ENV" value="testing"/> <env name="CACHE_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/> <env name="QUEUE_DRIVER" value="sync"/> <env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/> <env name="API_DEBUG" value="false"/> <env name="MAIL_DRIVER" value="log"/> <ini name="memory_limit" value="512M" /> </php> </phpunit>
kemudian silahkan kalian buka file TestCase yang berada di folder test. kemudian kalian update kode nya menjadi seperti berikut ini.
<?php namespace Tests; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; use Faker\Factory as Faker; use Illuminate\Support\Facades\Artisan; abstract class TestCase extends BaseTestCase { use CreatesApplication, RefreshDatabase; protected $faker; /** * Set up the test */ public function setUp(): void { parent::setUp(); $this->faker = Faker::create(); Artisan::call('migrate'); } /** * Reset the migrations */ public function tearDown(): void { Artisan::call('migrate:rollback'); parent::tearDown(); } }
pada fungsi setUp() dan tearDown() digunakan untuk menyelesaikan siklus aplikasi selema pengujian.
Membuat Test
supaya PHPUNIT dapat mengetahui pengujian kalian, silahkan kalian letakkan /** @test */ diawal. kemudian baru kalian buat fungsi untuk pengujian seperti berikut ini.
<?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; class ArticleTest extends TestCase { /** @test */ public function it_can_create_an_article() { $data = [ 'title' => $this->faker->sentence, 'content' => $this->faker->paragraph ]; $this->post(route('articles.store'), $data) ->dump() ->assertStatus(201) ->assertJson(compact('data')); } }
disini kita akan membuat pengujian mengenai pembuatan artikel. ketika pembuatan artikel berhasil maka akan memberikan status 201 dan akan merespon dangan data JSON.
karena laravel menggunakan pola ORM maka data sebaiknya disimpan di dalam database saat dibuat
Membuat Route
okee langkah selanjutnya kita akan membuat route, karena disini kita akan membuat API jadi silahkan kalian buka route/api kemudian tambahkan kode dibawah ini.
use App\Http\Controllers\Api\ArticlesApiController; Route::group(['prefix' => 'v1'], function () { Route::resource('articles', ArticlesApiController::class); });
setelah berhasil menambahkan route, sekarang kita akan membuat model,controller dan migration. silahkan kalian ketik perintah berikut ini.
php artisan make:Article -mcr
perintah diatas akan otomatis membuat 3 file yaitu model,controller dan migration.
Migration dan Model
silahkan buka file migration yang telah dibuat. disini kita akan membuat tabel articles dan kolom id,title,content. silahkan kalian edit file migration articles nya seperti berikut ini.
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('articles', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('content'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('articles'); } };
langkah selanjutnya silahkan kalian buka model Article yang terletak pada folder app/Models. kemudian silahkan update kodenya menjadi seperti berikut ini.
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Article extends Model { use HasFactory; protected $fillable = [ 'title', 'content' ]; }
Buat Artikel di Controller
kita akan membuat terlebih dahulu validasi untuk input data, silahkan kalian buat file request nya dengan perintah berikut.
php artisan make:test CreateArticleRequest
perintah diatas akan membuat file request dengan nama CreateArticleRequest. silahkan kalian buka file tersebut dan update kodenya menjadi seperti berikut ini.
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class CreateArticleRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'title' => ['required'], 'content' => ['required'] ]; } }
setelah selesai mebuat validasinya, sekarang silahkan kalian buka file ArticlesApiController yang terletak pada folder controller.
dibagian atas kalian tambahkan kode berikut ini.
use App\Models\Article; use App\Http\Requests\CreateArticleRequest;
kode diatas digunakan untuk memanggil model dan request
kemudian pada fungsi store kalian buat seperti berikut.
public function store(CreateArticleRequest $request) { return response()->json(['data' => Article::create($request->all())], 201); }
kode diatas untuk membuat artikel ketika artikel berhasil dibuat maka akan menampilkan status 201 dan data artikel.
Testing
sekarang silahkan kalian jalankan perintah berikut ini untuk melakukan testing.
php artisan test
atau untuk menjalankan testing pada Class tertentu kalian bisa gunakan perintah berikut ini.
php artisan test --filter ArticleTest
maka hasilnya seperti berikut ini.
Penutup
Sekian untuk tutorial cara membuat TDD di laravel. Jika ada kesulitan kalian bisa komentar dibawah ini.