Berkenalan Dengan PHP Unit Test

 

Kali ini saya akan merangkum sebuah pembahasan penting mengenai PHP Unit Test

Sebelum membahas PHP Uni Test secara spesifik. Saya akan menjelaskan apa itu unit test secara general

Unit Test merupakan sebuah langkah dimana kita memastikan kode kode yang kita mampu meminimalisir error error yang akan terjadi

Sewaktu kita menulis kode sendiri tanpa menggunakan PHP Unit Test, kadang hal tersebut masih aman aman saja untuk pengembangan jangka pendek. Namun untuk jangka panjang kita membutuhkan unit test, karena ketika kode itu dimantain, kita tidak mau error itu langsung berefek pada aplikasi yang sedang dijalankan

Sekarang kita tahu betapa pentingnya PHP unit testing pada aplikasi kita. Selanjutnya kita akan mempelajari apa saja sih perintilan perintilan unit testing pada PHP ini

Langkah Langkah

Menginstall phpunit dari packagist. Kita bisa menginstalnya menggunakan composer

composer install phpunit

Lalu kita akan mengatur composer.json dengan menambahkan script di bawah

  "autoload-dev": {
    "psr-4": {
      "YasyaIndraTech\\Test\\": "tests"
    }
  }

Untuk menjalankan kode kita harus membuat dua buah directory. Pertama folder src dan kedua tests

folder /src berisi file file class atau aplikasi yang digunakan sedangkan test berisi file file berisi testing dari file file yang berada di folder src

Ada beberapa hal yang harus diketahui saat kita ingin membuat unit test

Assertion, Annotation, Data Provider

Assertion merupakan proses dimana kita menginginkan sebuah method dari aplikasi kita memiliki value/return seperti yang diharapakan

        $this->assertEquals(1, self::$counter->getCounter());

Annotation merupakan kode yang menjadi identitas dari function function yang kita tulis

    /**
     * @test
     */

Data Provider merupakan fitur dalam unit test supaya nilai yang diharapkan bisa ditest secara menyeluruh dan bersamaan

    /**
     * @testWith [[5,5], 10]
     *      [[2,2,9,10], 23]
     *      [[], 0]
     *      [[0.5,0.5], 1]
     */
    public function testWith(array $values, int $expected){
        $this->assertEquals($expected, Math::sum($values));
    }

Fixture, Sharing Fixture

Fixture merupakan kemampuan dalam unit test saat kita ingin menginisiasi sebuah nilai, variabel atau value lainnya sebelum method test dijalankan.

    public function setUp(): void {
        $this->repository = $this->createMock(ProductRepository::class);
        $this->service = new ProductService($this->repository);
    }

Sedangkan Sharing Fixture merupakan inisiasi variabel/value pada masing masing method testing tanpa harus mengulang inisiasinya. Sharing Fixture menggunakan static function untuk bisa menerapkan proses ini

    public static function setUpBeforeClass():void {
        self::$counter = new Counter();
    }

Incomplete Test, Skipped

Incomplete Test dalam unit test merupakan sebuah fitur dimana kita memberikan tanda pada method testing bahwa proses yang dimaksud belum selesai

    public function increment()
    {
        $this->assertEquals(1, $this->counter->getCounter());
        $this->markTestIncomplete("TODO do increment");
    }

Skipped, kita melewati method testing tersebut

    public function increment()
    {
        self::markTestSkipped();
        $this->assertEquals(1, $this->counter->getCounter());
    }

Stub, Mock

Stub merupakan fitur dimana kita ingin mengaitkan object class lainnya dalam proses unit testing kita

    protected function setUp(): void
    {
        $this->product = new Product();
        $this->repository = $this->createStub(ProductRepository::class);
        $this->service = new ProductService($this->repository);
    }

    public function testStub()
    {
        $this->product = new Product();
        $this->product->setId("1");

        $this->repository->method('findById')->willReturnMap($product);

        $result = $this->repository->findById("1");
        self::assertSame($this->product, $result);
    }

Mock sama seperti Stub, namun pada Mock kita bisa mengetahui berapa kali method dari Stub/Mock dijalankan

    protected function setUp(): void
    {
        $this->product = new Product();
        $this->repository = $this->createMock(ProductRepository::class);
        $this->service = new ProductService($this->repository);
    }

    public function testMock()
    {
        $this->product = new Product();
        $this->product->setId("1");
        $this->repository->expects($this->once())->method('findById')->willReturnMap($product);
        $result = $this->repository->findById("1");
        self::assertSame($this->product, $result);
    }

Comments

Popular posts from this blog

Cara Mengatasi Hang/Freeze Pada Laptop Asus TUF Gaming

Cara Menjalankan PHP 8 & Laravel 9 Pada Laragon

Tutorial NextJS 13 & Typescript: Membuat Navbar Dengan Shadcn/UI