Unit Test #
Pengertian #
Unit testing adalah metode pengujian perangkat lunak di mana unit terkecil dari kode (biasanya fungsi atau metode) diuji secara individual. Python menyediakan modul unittest
yang memungkinkan Anda menulis dan menjalankan tes otomatis. Berikut adalah penjelasan mendetail tentang fitur-fitur unittest
di Python beserta contoh penggunaannya.
Fitur-fitur unittest
#
- Test Case: Unit terkecil dari pengujian yang memverifikasi satu bagian spesifik dari kode. Ini ditulis sebagai metode dalam kelas yang merupakan subkelas dari
unittest.TestCase
. - Test Suite: Kumpulan dari beberapa test case, test suite, atau keduanya.
- Test Runner: Komponen yang menjalankan test case atau test suite dan melaporkan hasilnya.
unittest
menyediakan runner bawaan, tetapi Anda bisa menggunakan runner pihak ketiga. - Assertions: Metode untuk memverifikasi hasil pengujian. Jika assert tidak terpenuhi, pengujian gagal.
- Fixtures: Setup dan teardown yang dijalankan sebelum dan sesudah setiap test case atau suite. Mereka digunakan untuk menyiapkan lingkungan yang konsisten untuk pengujian.
Struktur Dasar #
- Membuat Subkelas dari
unittest.TestCase
: Ini adalah cara standar untuk menulis test case. - Menambahkan Metode Tes: Metode ini harus dimulai dengan
test_
agar dapat dikenali oleh frameworkunittest
. - Menjalankan Tes: Tes dapat dijalankan menggunakan runner bawaan seperti
unittest.main()
.
Implementasi #
Unit Test #
import unittest
def add(a, b):
return a + b
class TestMathOperations(unittest.TestCase):
def test_add(self):
self.assertEqual(add(1, 2), 3)
self.assertEqual(add(-1, 1), 0)
self.assertEqual(add(-1, -1), -2)
if __name__ == '__main__':
unittest.main()
Penjelasan:
add(a, b)
: Fungsi sederhana yang akan diuji.TestMathOperations
: Kelas yang merupakan subkelasunittest.TestCase
.test_add
: Metode pengujian yang memeriksa berbagai kasus untuk fungsiadd
.unittest.main()
: Menjalankan semua metode yang dimulai dengantest_
.
Fixtures #
import unittest
class TestStringMethods(unittest.TestCase):
def setUp(self):
self.string = "hello world"
def tearDown(self):
del self.string
def test_upper(self):
self.assertEqual(self.string.upper(), "HELLO WORLD")
def test_isupper(self):
self.assertFalse(self.string.isupper())
self.assertTrue("HELLO".isupper())
if __name__ == '__main__':
unittest.main()
Penjelasan:
setUp
: Metode ini dipanggil sebelum setiap metode pengujian. Di sini, variabelself.string
diinisialisasi.tearDown
: Metode ini dipanggil setelah setiap metode pengujian. Di sini, variabelself.string
dihapus.test_upper
dantest_isupper
: Metode pengujian yang menggunakanself.string
.
Mocking #
Mocking adalah teknik untuk menggantikan bagian dari kode dengan objek tiruan untuk mengisolasi unit yang diuji. Python menyediakan modul unittest.mock
untuk keperluan ini.
import unittest
from unittest.mock import patch
def get_external_data():
import requests
response = requests.get('http://example.com/data')
return response.json()
class TestExternalData(unittest.TestCase):
@patch('requests.get')
def test_get_external_data(self, mock_get):
mock_get.return_value.json.return_value = {'key': 'value'}
result = get_external_data()
self.assertEqual(result, {'key': 'value'})
if __name__ == '__main__':
unittest.main()
Penjelasan:
patch('requests.get')
: Menggantikan fungsirequests.get
dengan mock.mock_get.return_value.json.return_value
: Menentukan nilai yang dikembalikan oleh metodejson()
dari respons tiruan.test_get_external_data
: Metode pengujian yang memverifikasi bahwa fungsiget_external_data
mengembalikan data yang diharapkan.
Kesimpulan #
Modul unittest
di Python menyediakan cara yang kuat dan fleksibel untuk menulis dan menjalankan unit test. Fitur-fitur seperti test case, test suite, test runner, assertions, dan fixtures membuatnya sangat cocok untuk pengujian otomatis. Dengan menggunakan unittest
, Anda dapat memastikan bahwa kode Anda berfungsi sebagaimana mestinya dan menangani berbagai kondisi dengan benar.
Menulis unit test juga membantu mendokumentasikan fungsionalitas kode Anda dan membuat refactoring menjadi lebih aman karena Anda dapat memastikan bahwa perubahan yang Anda buat tidak merusak fungsi yang sudah ada.