unisbadri.com » Python Java Golang Typescript Kotlin Ruby Rust Dart PHP
Unit Test

Unit Test #

Unit Test di Golang #

Unit testing adalah praktik pengujian komponen atau unit terkecil dari aplikasi untuk memastikan bahwa mereka berfungsi seperti yang diharapkan. Golang memiliki dukungan bawaan untuk unit testing melalui paket testing.

Membuat Unit Test #

Berikut adalah langkah-langkah dasar untuk membuat unit test di Golang:

  1. Buat file test dengan nama berakhiran _test.go.
  2. Import paket testing.
  3. Buat fungsi test dengan nama yang diawali dengan Test dan menerima parameter *testing.T.

Contoh Sederhana #

Berikut adalah contoh sederhana dari fungsi yang akan diuji dan unit testnya.

Fungsi yang Akan Diuji #

package main

// Add adalah fungsi yang menjumlahkan dua bilangan
func Add(a, b int) int {
    return a + b
}

Unit Test untuk Fungsi Add #

package main

import "testing"

// TestAdd menguji fungsi Add
func TestAdd(t *testing.T) {
    result := Add(2, 3)
    expected := 5
    if result != expected {
        t.Errorf("Add(2, 3) = %d; want %d", result, expected)
    }
}

Menjalankan Unit Test #

Untuk menjalankan unit test, Anda bisa menggunakan perintah go test di dalam direktori yang berisi file test. Contoh:

go test

Contoh Unit Test yang Lebih Kompleks #

Berikut adalah contoh fungsi yang lebih kompleks beserta unit testnya.

Fungsi yang Akan Diuji #

package main

import "errors"

// Divide adalah fungsi yang membagi dua bilangan dan mengembalikan error jika pembagi adalah nol
func Divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

Unit Test untuk Fungsi Divide #

package main

import (
    "testing"
)

// TestDivide menguji fungsi Divide
func TestDivide(t *testing.T) {
    type test struct {
        a, b     float64
        expected float64
        err      error
    }

    tests := []test{
        {a: 6, b: 3, expected: 2, err: nil},
        {a: 6, b: 0, expected: 0, err: errors.New("division by zero")},
    }

    for _, tc := range tests {
        result, err := Divide(tc.a, tc.b)
        if result != tc.expected || (err != nil && err.Error() != tc.err.Error()) {
            t.Errorf("Divide(%f, %f) = %f, %v; want %f, %v", tc.a, tc.b, result, err, tc.expected, tc.err)
        }
    }
}

Menggunakan t.Run untuk Subtests #

Subtests memungkinkan Anda untuk menjalankan beberapa test case dalam satu fungsi test.

package main

import (
    "errors"
    "testing"
)

// TestDivideWithSubtests menguji fungsi Divide menggunakan subtests
func TestDivideWithSubtests(t *testing.T) {
    type test struct {
        name     string
        a, b     float64
        expected float64
        err      error
    }

    tests := []test{
        {name: "normal division", a: 6, b: 3, expected: 2, err: nil},
        {name: "division by zero", a: 6, b: 0, expected: 0, err: errors.New("division by zero")},
    }

    for _, tc := range tests {
        t.Run(tc.name, func(t *testing.T) {
            result, err := Divide(tc.a, tc.b)
            if result != tc.expected || (err != nil && err.Error() != tc.err.Error()) {
                t.Errorf("Divide(%f, %f) = %f, %v; want %f, %v", tc.a, tc.b, result, err, tc.expected, tc.err)
            }
        })
    }
}

Benchmark Testing #

Golang juga mendukung benchmark testing untuk mengukur kinerja fungsi. Fungsi benchmark diawali dengan Benchmark dan menerima parameter *testing.B.

Contoh Benchmark #

package main

import "testing"

// BenchmarkAdd mengukur kinerja fungsi Add
func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(2, 3)
    }
}

Untuk menjalankan benchmark, gunakan perintah go test -bench ..

Table-Driven Tests #

Table-driven tests adalah pola umum di Golang untuk menguji fungsi dengan berbagai test case yang ditentukan dalam tabel.

package main

import (
    "errors"
    "testing"
)

// TestDivideTableDriven menggunakan pendekatan table-driven
func TestDivideTableDriven(t *testing.T) {
    var tests = []struct {
        a, b     float64
        expected float64
        err      error
    }{
        {6, 3, 2, nil},
        {6, 0, 0, errors.New("division by zero")},
    }

    for _, tt := range tests {
        testname := fmt.Sprintf("%f,%f", tt.a, tt.b)
        t.Run(testname, func(t *testing.T) {
            result, err := Divide(tt.a, tt.b)
            if result != tt.expected || (err != nil && err.Error() != tt.err.Error()) {
                t.Errorf("Divide(%f, %f) = %f, %v; want %f, %v", tt.a, tt.b, result, err, tt.expected, tt.err)
            }
        })
    }
}

Kesimpulan #

Unit testing di Golang sangat kuat dan fleksibel. Dengan menggunakan paket testing, Anda dapat dengan mudah membuat dan menjalankan unit test. Praktik terbaik seperti menggunakan subtests, table-driven tests, dan benchmark testing dapat membantu Anda memastikan bahwa kode Anda berfungsi dengan benar dan efisien.

« Web Server
Mocking »