Unit Pengujian API Anda Di Laravel - CRUDPRO

Unit Pengujian API Anda Di Laravel

Unit Pengujian API Anda Di Laravel

Jadi katakanlah Anda telah membuat API, tetapi ingin melangkah lebih jauh dengan mengujinya. Nah, Laravel membuatnya sangat mudah.

Pertama, mari siapkan lingkungan Laravel baru. Saya menggunakan versi 5.6 Laravel untuk artikel ini.

  • Instal Laravel (https://laravel.com/docs/5.6#installation)
  • Siapkan Laravel, buat database Anda dan buat agar dapat diakses dengan mengonfigurasi file .env di direktori root proyek Anda.

Setelah laravel diinstal, pastikan phpunit diinstal di mesin Anda. Anda dapat menginstalnya di sini: https://phpunit.de/getting-started/phpunit-7.html.

Setelah menginstal phpunit, masukkan perintah berikut di terminal Anda yang menunjuk ke direktori root proyek laravel Anda.

phpunit

Jika setiap diatur dengan benar, Anda harus mendapatkan sesuatu seperti:

PHPUnit 7.3.0 by Sebastian Bergmann and contributors.
..                                                                  2 
/ 2 (100%)
Time: 1.12 seconds, Memory: 12.00MB
OK (2 tests, 2 assertions)

Sekarang buka /.phpunit.xml dan ganti koneksi database dan nonaktifkan konfigurasi APP_DEBUG dari file .env. Jadi phpunit akan menggunakan sqlite. Tambahkan berikut ini di bagian <php> :

<env name="DB_CONNECTION" value="sqlite"/>
<env name="APP_DEBUG" value="false"/>

Jadi seharusnya terlihat seperti ini :

...
<php>
    <env name="APP_ENV" value="testing"/>
    <env name="BCRYPT_ROUNDS" value="4"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="QUEUE_DRIVER" value="sync"/>
    <env name="MAIL_DRIVER" value="array"/>
    <env name="DB_CONNECTION" value="sqlite"/>
    <env name="APP_DEBUG" value="false"/>
</php>
...

Mari buat Model baru bernama Posting dengan :

php artisan make:model Post -c -m -f

Menambahkan -c, -m, -f setelah nama model juga akan menghasilkan file pengontrol, migrasi, dan pabrik. Buka file migrasi dan tambahkan beberapa baris pada metode up() :

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->text('content');
        $table->timestamps();
    });
}

Kemudian di /database/factories/PostFactory.php tambahkan beberapa baris:

<?php
use Faker\Generator as Faker;
$factory->define(App\Post::class, function (Faker $faker) {
    return [
        'title' => $faker->sentence,
        'content' => $faker->paragraph
    ];
});

Saat pabrik Post diatur, buka model Post /app/Post.php dan tambahkan protected fillable untuk dapat menggunakan metode buat:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
    protected $fillable = [
        'title',
        'content'
    ];
}

Di /app/Http/Controllers/PostController.php dan tambahkan beberapa metode kasar dasar untuk tujuan pengujian :

<?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);
    }
}
  • Indeks (Mengembalikan semua posting)
  • Show (Mengembalikan satu posting berdasarkan id di parameter)
  • Store (Mengembalikan postingan yang dibuat dengan kode status 201, artinya: 'Konten dibuat')
  • Perbarui (Mengembalikan posting yang diperbarui dengan kode status 200 default)
  • Hapus (Mengembalikan nol dengan kode status 204, artinya: 'Tidak ada konten')

Baca lebih lanjut tentang kode status: https://httpsstatuses.com/

Di /routes/api.php tambahkan beberapa route untuk menggunakan controller kita :

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');
});
  • Ketahuilah bahwa saat ini tidak ada autentikasi pada salah satu rute.
  • Semua rute di /api.php akan diawali dengan /api
  • Di grup saya mengawali semua rute yang mendasari dengan /posts. Jadi misalnya untuk meminta rute pertama, Anda akan memanggil: /api/posts

Kemudian jalankan file migrasi menggunakan:

php artisan migrate

Laravel dikirimkan dengan dua kelas pengujian yang terletak di /tests/Feature dan /tests/Unit. Kita akan mulai dengan mengedit /tests/TestCase.php menjadi:

<?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();
    }
}

Gunakan perintah berikut untuk membuat file pengujian unit baru :

php artisan make:test PostTest --unit

Buka file yang dihasilkan /tests/Unit/PostTest.php dan tambahkan metode pengujian :

<?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' ],
            ]);
    }
}
  • Setiap pengujian memiliki metodenya sendiri yang diawali dengan pengujian, ini diperlukan agar phpunit dapat menemukan dan menggunakan metode pengujian.
  • Kami sedang memeriksa apakah kode status yang diharapkan dikembalikan dengan assertStatus
  • Dengan assertJson kami menguji apakah hasil JSON sesuai dengan harapan kami.
  • Di test_can_list_posts kami menghapus semua atribut dari setiap posting yang dibuat sehingga kami hanya memiliki 'id', 'title' dan 'content'. Dan kemudian kami memeriksa bahwa semua item dalam array JSON yang dikembalikan oleh API berisi 'id', 'title', 'content' dengan menggunakan assertJsonStructure.

Untuk menguji, mari jalankan phpunit di terminal :

phpunit

Terima Kasih Telah Membaca, Semoga Bermanfaat ^^