Inilah Pengertian dari Unit Testing (Beserta dengan Contohnya)

Assalamu‘alaikum wr. wb.

Halo gais! Jika sebelumnya sudah membahas tentang Framework dalam Pemrograman, sekarang waktunya kita bahas mengenai Unit Testing.

Ilustrasi Unit Testing


Sumber Artikel Materi : Javatpoint.comBrightsec.com (Blog)Glints.comAccurate.id

Unit Testing melibatkan pengujian setiap unit atau komponen individu dari aplikasi perangkat lunak. Ini adalah tingkat pertama pengujian fungsional. Tujuan di balik pengujian unit adalah untuk memvalidasi komponen unit dengan kinerjanya.

Unit adalah bagian tunggal yang dapat diuji dari sistem perangkat lunak dan diuji selama fase pengembangan perangkat lunak aplikasi.

A. Pengertian Unit Testing

Unit Testing (Pengujian Unit) Tes unit adalah jenis tes perangkat lunak yang berfokus pada komponen produk perangkat lunak. Tujuannya adalah untuk memastikan bahwa setiap unit kode perangkat lunak berfungsi seperti yang diharapkan. Unit dapat berupa fungsi, metode, modul, objek, atau entitas lain dalam kode sumber aplikasi.

Tujuan Unit Testing adalah untuk menguji kebenaran kode yang diisolasi. Komponen unit adalah fungsi atau kode aplikasi individual. Pendekatan pengujian kotak putih digunakan untuk pengujian unit dan biasanya dilakukan oleh pengembang.

Unit Testing biasanya dibuat oleh pengembang selama fase Coding Proyek, dan ditulis sebagai kode yang ada di basis kode bersama dengan kode aplikasi yang sedang diuji. Ada banyak kerangka pengujian unit yang membantu pengembang mengelola dan menjalankan pengujian unit.

B. Cara Kerja Unit Testing

Unit Testing biasanya terdiri dari 3 (tiga) fase :

  • Perencanaan : Pengembang mempertimbangkan unit mana dalam kode yang perlu mereka uji, dan cara menjalankan semua fungsionalitas yang relevan dari setiap unit untuk mengujinya secara efektif.
  • Uji kasus dan skrip : Pengembang menulis kode pengujian unit dan menyiapkan skrip untuk mengeksekusi kode.
  • Pengujian dan hasil unit : Akhirnya, pengujian unit berjalan dan pengembang dapat mengidentifikasi kesalahan atau masalah dalam kode dan memperbaikinya.

Test-driven development (TDD) adalah pendekatan umum untuk pengujian unit. Itu mengharuskan pengembang untuk membuat unit test terlebih dahulu, sebelum kode aplikasi benar-benar ada. Secara alami, tes awal itu akan gagal. Kemudian pengembang menambahkan fungsionalitas yang relevan ke aplikasi hingga pengujian lulus. TDD biasanya menghasilkan basis kode yang konsisten dan berkualitas tinggi.

Unit Testing yang efektif biasanya :

  • Jalankan setiap test case dengan cara yang terisolasi, dengan “stub” atau “mocks” yang digunakan untuk mensimulasikan dependensi eksternal. Ini memastikan pengujian unit hanya mempertimbangkan fungsionalitas unit saat ini yang sedang diuji.
  • Tidak menguji setiap baris kode, berfokus pada fitur penting dari unit yang diuji. Secara umum, pengujian unit harus berfokus pada kode yang memengaruhi perilaku produk perangkat lunak secara keseluruhan.
  • Memverifikasi setiap Uji Kasus menggunakan kriteria yang ditentukan dalam kode, yang dikenal sebagai "pernyataan". Kerangka pengujian menggunakan ini untuk menjalankan pengujian dan melaporkan pengujian yang gagal.
  • Sering berjalan dan di awal siklus pengembangan.

Ketika proyek perangkat lunak telah diuji unit secara menyeluruh, pengembang tahu bahwa setiap unit individu efisien dan bebas kesalahan. Langkah selanjutnya adalah menjalankan tes integrasi yang mengevaluasi komponen program yang lebih besar dan bagaimana mereka berinteraksi.

C. Perbandingan Pengujian lainnya dengan Unit Testing


1. Unit Testing vs Integration Testing

Integration Testing melibatkan pengujian modul perangkat lunak dan interaksi di antara mereka. Ini menguji kelompok modul yang terintegrasi secara logis.

Tes Integrasi juga disebut pengujian utas, karena berfokus pada komunikasi antar komponen perangkat lunak. Pengujian integrasi penting karena sebagian besar proyek perangkat lunak terdiri dari beberapa modul independen yang terhubung.

Perbedaan utama antara pengujian unit dan pengujian integrasi adalah apa dan bagaimana pengujiannya:

  • Unit Testing menguji satu bagian kode, sementara Integration Testing menguji modul kode untuk memahami cara kerjanya secara individual dan berinteraksi satu sama lain.
  • Unit Testing cepat dan mudah dijalankan karena mereka "mengejek" dependensi eksternal. Integration Testing lebih kompleks dan membutuhkan lebih banyak sumber daya untuk dijalankan karena harus mempertimbangkan dependensi internal dan eksternal (dependensi "nyata").

2. Unit Testing vs Functional Testing

Pengujian Fungsional (Functional Testing) membandingkan kemampuan setiap perangkat lunak dengan spesifikasi asli atau persyaratan pengguna, untuk memastikan bahwa perangkat lunak tersebut memberikan keluaran yang diinginkan kepada pengguna akhir.

Software Developer menggunakan pengujian fungsional sebagai cara untuk melakukan Jaminan Kualitas (QA). Biasanya, jika suatu sistem lulus uji fungsional, dianggap siap untuk dirilis. Pengujian fungsional penting karena mencoba untuk mencerminkan pengalaman pengguna yang sebenarnya, sehingga memverifikasi bahwa aplikasi memenuhi persyaratan pelanggan.

Perbedaan antara Unit Testing dan Functional Testing dapat diringkas sebagai berikut :

  • Unit Testing dirancang untuk menguji satu unit kode secara terpisah. Mereka cepat dan mudah dibuat, serta membantu menemukan dan memperbaiki bug di awal siklus pengembangan. Mereka biasanya dijalankan bersama dengan setiap pembuatan perangkat lunak. Namun, mereka bukan pengganti pengujian fungsional karena mereka tidak menguji aplikasi secara end-to-end.
  • Functional Testing bertujuan untuk menguji fungsionalitas seluruh aplikasi. Pembuatannya memakan waktu lama dan membutuhkan sumber daya komputasi yang signifikan untuk dijalankan, tetapi sangat berguna untuk menguji seluruh aliran aplikasi. Pengujian fungsional adalah bagian penting dari rangkaian pengujian otomatis, tetapi biasanya digunakan nanti dalam siklus hidup pengembangan, dan lebih jarang dijalankan daripada pengujian unit.

3. Unit Testing vs Regression Testing

Pengujian Regresi (Regression Testing) adalah jenis pengujian perangkat lunak yang mengevaluasi apakah perubahan dalam aplikasi menyebabkan cacat. Ini digunakan untuk menentukan apakah perubahan kode dapat membahayakan atau mengganggu perilaku aplikasi atau menghabiskan sumber daya. Secara umum, pengujian unit adalah pengujian regresi, tetapi tidak semua Pengujian Regresi merupakan Pengujian Unit.

Unit Test digunakan oleh pengembang untuk memverifikasi fungsionalitas berbagai komponen dalam kode mereka. Ini memastikan bahwa semua variabel, fungsi, dan objek berfungsi seperti yang diharapkan.

Pengujian Regresi Tes regresi terutama digunakan setelah programmer menyelesaikan fitur tertentu. Pengujian regresi berfungsi sebagai pemeriksaan seluruh sistem untuk memastikan bahwa komponen yang tidak terpengaruh oleh perubahan terbaru terus berfungsi seperti yang diharapkan. Ini dapat mencakup beberapa jenis tes. Sebagai bagian dari rangkaian pengujian regresi, pengembang dapat menjalankan pengujian unit, untuk memverifikasi bahwa fitur dan variabel individual berperilaku seperti yang diharapkan bahkan setelah perubahan.

D. Teknik Unit Testing

Ada 3 Teknik untuk melakukan Unit Testing. Ketiga teknik Unit Testing tersebut adalah Black Box Testing, White Box Testing, dan Grey Box Testing.

1. Black Box Testing

Black box testing adalah pengujian yang dilakukan untuk memantau lebih dekat input dan output dari sistem perangkat lunak tanpa program internal.

Jadi, seperti saat Anda melihat ke dalam kotak hitam, Anda hanya melihat apa yang masuk dan keluar dari kotak. Tiga hal yang biasanya diuji dalam pengujian black box adalah UI, input dan output.

2. White Box Testing

White Box Testing sering disebut dengan Transparent Box Testing atau Glass Box Testing. Pengujian ini dilakukan untuk menguji struktur internal, desain, operasi, dan detail implementasi aplikasi.

Beberapa hal yang biasanya diuji dalam pengujian white box adalah keamanan, struktur atau jalur yang Rusak, Loop, dan Aliran Data (Data Flow).

3. Grey Box Testing

Grey Box Testing adalah kombinasi dari Black Box Testing dengan White Box Testing. Test yang satu ini biasanya digunakan untuk mengecek kesalahan kontekstual tertentu pada sistem website, seperti ditulis oleh GeeksforGeeks.

E. Jenis-jenis Tools Unit Testing

Seperti yang sudah dijelaskan sebelumnya, Unit Testing adalah suatu pengujian software yang dilakukan secara manual atau otomatis menggunakan alat atau tools khusus. Namun, sebagian besar developer saat ini lebih memilih metode otomatis. Berikut ini adalah beberapa tools yang dapat Anda pilih untuk melakukan Unit Testing.

1. JUnit

JUnit adalah Framework Unit Testing Java yang banyak digunakan untuk menguji aplikasi Java. Ini adalah kerangka kerja sumber terbuka yang menyediakan seperangkat anotasi dan assersi untuk menyederhanakan proses pengujian unit dalam Java.

2. NUnit

NUnit adalah Framework Unit Testing untuk aplikasi .NET yang ditulis dalam Bahasa C#. Ini adalah kerangka kerja sumber terbuka yang menyediakan seperangkat alat untuk menulis dan menjalankan pengujian unit.

3. PHPUnit

PHPUnit adalah Framework Unit Testing untuk aplikasi PHP. Ini adalah kerangka kerja sumber terbuka yang menyediakan seperangkat alat untuk menulis dan menjalankan pengujian unit.

4. Mocha

Mocha adalah Framework Unit Testing JavaScript yang berjalan pada Node.js dan di browser. Ini adalah kerangka kerja sumber terbuka yang menyediakan seperangkat alat untuk menguji kode asinkron dan mendukung beberapa perpustakaan assersi.

5. Jasmine

Jasmine adalah Framework Unit Testing JavaScript yang dirancang untuk mudah digunakan dan dipahami. Ini adalah kerangka kerja sumber terbuka yang menyediakan seperangkat alat untuk menguji kode asinkron dan mendukung beberapa perpustakaan assersi.

6. PyTest

PyTest adalah Framework Unit Testing Python yang menyediakan seperangkat alat untuk menguji aplikasi Python. Ini adalah kerangka kerja sumber terbuka yang mendukung pengujian dengan fixture, parameterisasi, dan mocking.

7. XCTest

XCTest adalah Framework Unit Testing untuk platform Apple, termasuk macOS, iOS, tvOS, dan watchOS. Ini adalah kerangka kerja sumber terbuka yang menyediakan seperangkat alat untuk menulis dan menjalankan pengujian unit.

Dan masih banyak lagi.

F. Kelebihan dan Kekurangan dari Tools Unit Testing

Pro dan kontra dari pengujian unit adalah sebagai berikut :

1. Kelebihan

  • Pengujian unit menggunakan pendekatan modul karena setiap bagian dapat diuji tanpa menunggu selesainya pengujian bagian lain.
  • Tim pengembang berfokus pada fungsionalitas unit yang disediakan dan bagaimana seharusnya fungsionalitas terlihat dalam setelan pengujian unit untuk memahami API unit.
  • Pengujian unit memungkinkan pengembang untuk memperbaiki kode setelah beberapa hari dan memastikan modul masih berfungsi tanpa cacat.

2. Kekurangan

  • Itu tidak dapat mengidentifikasi integrasi atau kesalahan tingkat luas saat bekerja pada unit kode.
  • Dalam pengujian unit, evaluasi semua jalur eksekusi tidak dimungkinkan, sehingga pengujian unit tidak dapat menangkap setiap kesalahan dalam suatu program.
  • Paling cocok untuk digabungkan dengan kegiatan pengujian lainnya.

G. Contoh Program Unit Testing Sederhana

Berikut, inilah beberapa Contoh Unit Testing dari beberapa Framework atau Bahasa Pemrograman yang saya ambil dari ChatGPT.

1. Java JUnit

import org.junit.Test;
import static org.junit.Assert.*;

public class MyTest {
    @Test
    public void testAdd() {
        MyClass obj = new MyClass();
        int result = obj.add(2, 3);
        assertEquals(5, result);
    }
}

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

2. Python Unittest

import unittest

class MyTest(unittest.TestCase):
    def test_add(self):
        obj = MyClass()
        result = obj.add(2, 3)
        self.assertEqual(result, 5)

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

3. JavaScript Mocha (NodeJS)

const assert = require('assert');
const MyClass = require('./myclass');

describe('MyClass', function() {
    describe('#add()', function() {
        it('should return 5 when adding 2 and 3', function() {
            const obj = new MyClass();
            const result = obj.add(2, 3);
            assert.strictEqual(result, 5);
        });
    });
});

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

4. Ruby RSpec

require 'myclass'

RSpec.describe MyClass do
  describe '#add' do
    it 'returns 5 when adding 2 and 3' do
      obj = MyClass.new
      result = obj.add(2, 3)
      expect(result).to eq(5)
    end
  end
end

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

5. PHP PHPUnit (Juga Laravel)

use PHPUnit\Framework\TestCase;

class MyClassTest extends TestCase
{
    public function testAdd()
    {
        $obj = new MyClass();
        $result = $obj->add(2, 3);
        $this->assertEquals(5, $result);
    }
}

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

6. C++ Google Test

#include <gtest/gtest.h>

TEST(MyClassTest, Add) {
    MyClass obj;
    int result = obj.add(2, 3);
    EXPECT_EQ(result, 5);
}

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

7. Swift XCTest

import XCTest
@testable import MyApp

class MyClassTests: XCTestCase {
    func testAdd() {
        let obj = MyClass()
        let result = obj.add(2, 3)
        XCTAssertEqual(result, 5)
    }
}

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

8. Rust Rusty

use rusty::MyClass;

#[test]
fn test_add() {
    let obj = MyClass::new();
    let result = obj.add(2, 3);
    assert_eq!(result, 5);
}

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

9. Golang Testing

func TestAdd(t *testing.T) {
    obj := MyClass{}
    result := obj.Add(2, 3)
    if result != 5 {
        t.Errorf("Expected 5, but got %d", result)
    }
}

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

10. Kotlin JUnit

import org.junit.Assert.assertEquals
import org.junit.Test

class MyClassTest {
    @Test
    fun testAdd() {
        val obj = MyClass()
        val result = obj.add(2, 3)
        assertEquals(5, result)
    }
}

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

11. Angular Jasmine

import { MyClass } from './myclass';

describe('MyClass', () => {
    it('should add 2 and 3 to equal 5', () => {
        const obj = new MyClass();
        const result = obj.add(2, 3);
        expect(result).toBe(5);
    });
});

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

12. Perl Test::Simple

use Test::Simple tests => 1;

my $obj = MyClass->new();
my $result = $obj->add(2, 3);
ok($result == 5);

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

13. CodeIgniter

class MyClassTest extends CIUnit_TestCase
{
    public function testAdd()
    {
        $this->load->library('myclass');
        $result = $this->myclass->add(2, 3);
        $this->assertEquals(5, $result);
    }
}

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

14. Flutter (Dart)

import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/my_class.dart';

void main() {
  test('adds 2 and 3 to make 5', () {
    final obj = MyClass();
    final result = obj.add(2, 3);
    expect(result, equals(5));
  });
}

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode add(). Pengujian memastikan bahwa pemanggilan add(2, 3) mengembalikan 5.

15. ASP.NET Core (C# XUnit)

using Xunit;
using MyNamespace;

public class MyClassTests
{
    [Fact]
    public void TestAdd()
    {
        var obj = new MyClass();
        var result = obj.Add(2, 3);
        Assert.Equal(5, result);
    }
}

Kode ini mendefinisikan pengujian unit untuk objek MyClass yang memiliki metode Add() dalam aplikasi ASP.NET Core. Pengujian ini menggunakan kerangka pengujian XUnit untuk memeriksa apakah pemanggilan Add(2, 3) menghasilkan 5.


Itulah Pengertian hingga Contoh dari Unit Testing dalam Pengembangan Perangkat Lunak (Software Development). 

Terima Kasih 😄😘👌👍 :)

Wassalammu‘alaikum wr. wb.

Post a Comment

Previous Post Next Post