0% menganggap dokumen ini bermanfaat (0 suara)
21 tayangan14 halaman

Modul Unittest Python

Unittest adalah modul Python yang digunakan untuk menulis dan menjalankan tes otomatis pada kode Python. Dokumen ini menjelaskan bagaimana mendefinisikan subclass TestCase dan menjalankan tes kasus, serta menulis tes untuk fungsi dan pengecualian. [/ringkasan]

Diunggah oleh

akmalmhank21
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
21 tayangan14 halaman

Modul Unittest Python

Unittest adalah modul Python yang digunakan untuk menulis dan menjalankan tes otomatis pada kode Python. Dokumen ini menjelaskan bagaimana mendefinisikan subclass TestCase dan menjalankan tes kasus, serta menulis tes untuk fungsi dan pengecualian. [/ringkasan]

Diunggah oleh

akmalmhank21
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 14

Testing Aplikasi pada Bahasa Pemrograman

Python menggunakan Unittest

Written with by Muhammad Aris Septanugroho


Introduction
Library standard Python memiliki module yang bernama unittest yang bisa membantu
kita menulis dan melakukan test pada Codingan Python yang kita buat.
Test dilakukan dan ditulis menggunakan module unittest bisa membantu kita
menemukan bugs pada program dan mencegah terjadinya regresi (Satu bagian kode
program mempengaruhi kode yang lain karena keterkaitan dan ketergantungan /
dependencies) ketika kita melakukan perubahan pada codingan kita dari waktu ke
waktu. Serta memastikan bahwa produk aplikasi kita sudah melalui fase pengujian
sehingga program menjadi lebih tahan banting dan reliable (dapat diandalkan).
Di tutorial module ini kamu akan menggunakan Python Unittest Module untuk
melakukan testing pada Function & Class di Python.

Prerequisites
Untuk dapat memahami keseluruhan dari Tutorial di Modul ini, kamu membutuhkan :
• Memahami Function di Python
• Basic Pemrograman Python
Automated Testing vs Manual Testing
Kabar baiknya adalah, kamu mungkin sudah pernah melakukan testing pada
codingan mu tanpa kamu menyadarinya. Ingat ketika kita mengeksekusi kode kita dan
mengujinya untuk pertama kali? Apakah kamu mengecek fitur-fitur nya dan
bereksperimen menggunakan kode program mu? Itu lah yang dinamakan Exploratory
Testing atau bisa juga disebut Manual Testing.
Exploratory testing adalah sebuah bentuk pengetesan yang dikerjakan tanpa
adanya rencana terstruktur. Di Exploratory Test kamu hanya mengeksplor
aplikasi/program yang sudah kamu buat.
Untuk melakukan testing secara komplit dengan metode ini (Manual Testing),
kamu harus mencatat seluruh fitur yang dimiliki oleh aplikasi mu, tipe input yang
berbeda-beda yang bisa diterima (contoh: int, string, float, dsb), dan hasil yang
diharapkan dari program yang kamu buat. Sekarang, setiap kamu membuat perubahan
pada codingan mu, kamu harus melakukan semua test tersebut. Pada setiap item yang
ada pada list dan menceklis nya satu per satu.

Terlihat sangat ribet bukan? Dan time consuming :>

Di sinilah Automated Testing berperan. Test ini adalah Pengeksekusian dari Test yang
sudah kamu rencanakan tadi (Bagian-bagian dari aplikasimu yang ingin kamu test,
Urutannya, dan output yang diharapkan) oleh sebuah Script, bukan manusia. Python
sudah menyediakan tools dan libraries yang membantu kita melakukan Automated
Testing pada aplikasi mu.
Unit Tests vs. Integration Tests

Dunia Pengetesan tidak hanya Manual dan Automated testing saja, sekarang
setelah kamu mengetahui perbedaan antara Automated testing dan Manual Testing,
inilah saatnya untuk melangkah lebih dalam.
Pikirkan bagaimana kamu dapat menguji lampu pada mobil. Kamu akan
menyalakan lampu (dikenal sebagai Test step) dan pergi ke luar mobil atau meminta
teman untuk memeriksa apakah lampu menyala (dikenal sebagai Test Assertion).
Testing beberapa komponen dikenal sebagai Integration Testing.
Pikirkan semua hal yang perlu bekerja dengan benar agar tugas sederhana
memberikan hasil yang benar. Komponen-komponen ini seperti bagian dari aplikasi,
semua Class, Function, dan Module yang telah dibuat.

Tantangan utama dengan Integration Testing adalah ketika Integration Testing


tidak memberikan hasil yang tepat. Sangat sulit untuk mendiagnosis masalah tanpa
dapat mengisolasi bagian mana dari sistem yang gagal. Jika lampu tidak menyala, maka
mungkin bohlamnya rusak. Apakah baterainya mati? Bagaimana dengan alternator?
Apakah komputer mobil rusak?
Contohnya adalah mobil modern, ia akan memberi tahu kapan bola lampu nya
mati. Ini dilakukan dengan menggunakan bentuk Unit Testing.
Unit Testing adalah tes yang lebih kecil, yang memeriksa bahwa satu komponen
beroperasi dengan cara yang benar. Tes unit membantu kita mengisolasi apa yang rusak
dalam aplikasi dan memperbaikinya lebih cepat.

Kita baru saja melihat dua jenis tes:


• Integration Testing memeriksa bahwa komponen dalam aplikasi beroperasi satu
sama lain.
• Unit Testing memeriksa komponen kecil di aplikasi.
Definisikan sebuah Subclass TestCase
Salah satu class yang terpenting yang disediakan oleh modul unittest adalah TestCase.
Class ini menyediakan struktur umum untuk menguji Function kita.

1. Pertama-tama kita buat file test_add_fish_to_aquarium.py lalu ketikkan kode di


dalam nya.
2. Import modul unittest
3. Lalu kita definisikan sebuah Function yang ingin kita test, yaitu
add_fish_to_aquarium
4. Pada kasus ini, function add_fish_to_aquarium menerima argumen sebuah list
nama-nama ikan fish_list dan akan memunculkan error jika fish_list memiliki
elemen lebih dari 10. Funtion tersebut akan me-return sebuah dictionary dengan
key “tank_a” dan value nya sebuah list fish_list
5. Sebuah class TestAddFishToAquarium didefinisikan sebagai sebuah subclass
dari unittest.TestCase
6. Lalu sebuah method test_add_fish_to_aquarium_success dalam class
TestAddFishToAquarium. Dan method ini akan memanggil add_fish_to_aquarium
dengan input tertentu dan di cek bahwa hasil asli yang dikembalikan sesuai
dengan hasil yang di harapkan.
7. Sekarang mari definisikan sebuah subclass TestCase dengan sebuah pengetesan.
Mari kita review bagaimana caranya mengeksekusi sebuah pengetesan.
Executing a TestCase
Di bagian sebelumnya kita telah membuat sebuah sublass TestCase bernama
TestAddFishToAquarium. Pada direktori yang sama dengan file
test_add_fish_to_aquarium.py, dan running pengetesan dengan command berikut.
$ python -m unittest test_add_fish_to_aquarium.py
Kita memanggil library python unittest dengan python -m unittest. Lalu, kita tulis
path yang menuju ke file Python dimana TestAddFishToAquarium TestCase dipasang
sebagai argumen. Setelah kita mengeksekusi command tersebut, kita akan
mendapatkan output seperti di bawah ini :

Unittest modul merunning pengetesan kita dan memberi tahu bahwa pengetesan
kita telah berjalan OK. Satu titik ( . ) pada baris pertama output merepresentasikan
pengetesan kita telah lulus.

Catatan: TestCase akan mengenali method-method test yang diawali dengan test.
Contohnya
def test_add_fish_to_aquarium_success(self):
akan dianggap sebagai sebuah pengetesan dan akan dieksekusi.
Sedangkan, def example_test(self), sebaliknya. Tidak akan dikenali sebagai sebuah
pengetesan karena nama method tersebut tidak diawali “test”. Hanya method yang
diawali dengan “test” yang akan di run dan dilaporkan ketika kamu menjalankan
perintah python -m unittest …
Selanjutnya, mari kita bereksperimen supaya test kita failed atau gagal.
Ubah pada baris kode pendeklarasian variable expected.
Tulis pada file test_add_fish_to_aquarium.py

Codingan di atas akan menghasilkan failed, karena add_fish_to_aquarium


seharusnya tidak akan mengembalikan nilai “rabbit” sebagai value dari key “tank_a”,
tetapi seharusnya shark dan tuna.
Lalu kita eksekusi command pengetesan lagi :
$ python -m unittest test_add_fish_to_aquarium.py
Maka kita akan mendapatkan output :
FAIL Output mengindikasikan bahwa pengetesan kita telah gagal. Output
sebenarnya dari {'tank_a': ['shark', 'tuna']} tidak cocok dengan ekspektasi (salah) yang
kita tulis pada test_add_fish_to_aquarium.py : {'tank_a': ['rabbit']}. Perhatikan pula
bahwa sebuah titik ( . ) pada baris pertama output sekarang berubah menjadi F. Jikalau
titik ( . ) menandakan bahwa pengetesan kita telah berhasil, sedangkan F menandakan
bahwa Eksekusi unittest kita berjalan gagal.
Sekarang kita sudah menulis dan menjalankan pengetesan, mari kita coba
menulis pengetesan lain untuk perilaku yang berbeda pada function
add_fish_to_aquarium function.

Testing a Function that Raises an Exception


Unittest juga bisa membantu kita memverifikasi bahwa add_fish_to_aquarium
akan menerbitkan sebuah Exception ValueError jika input ikan diberikan terlalu banyak
(lebih dari 10). Mari kita perluas contoh kita sebelumnya, dan menambahkan sebuah
pengetesan baru bernama test_add_fish_to_aquarium_exception:
Tulis pada file test_add_fish_to_aquarium.py
Metode pengetesan yang baru (test_add_fish_to_aquarium_exception) juga akan
memanggil function add_fish_to_aquarium, namun di sini akan terdapat 25 elemen list
pada argumen fish_list yang dideklarasikan pada variable too_many_fish. Yang
mengandung string “shark” diulangi sebanyak 25 kali.
Method test_add_fish_to_aquarium_exception menggunakan manajer konteks
self.assertRaises(…) yang sudah disediakan oleh TestCase untuk mengecek bahwa
add_fish_to_aquarium akan me-reject input list yang terlalu panjang. Argumen pertama
pada self.assertRaises adalah Class Exception yang kita ekspektasikan untuk muncul.
Pada kasus ini, ValueError. Manajer Konteks self.assertRaises dialiaskan menjadi sebuah
variable yang bernama exception_context. Attribut pada exception_context berisi
ValueError default yang dimunculkan oleh add_fish_to_aquarium. Ketika kita
memanggil str() pada ValueError untuk mendapatkan pesannya, akan dikembalikan
Exception message yang benar kita ekspektasikan.
Pada direktori yang sama dengan file test_add_fish_to_aquarium.py, dan running
pengetesan dengan command berikut.
$ python -m unittest test_add_fish_to_aquarium.py
Maka kita akan mendapatkan output :

Terutama, pengetesan kita akan gagal jika add_fish_to_aquarium tidak


memunculkan sebuah Exception (Error), atau memunculkan Exception lain yang
berbeda (contohnya TypeError, karena yang benar pada kasus ini adalah menggunakan
ValueError).
Catatan: unittest.TestCase mengekspos sejumlah method lain selain assertEqual
dan assertRaises yang bisa kita gunakan. Daftar lengkapnya dapat ditemukan pada
dokumentasi berikut. Dan beberapa pilihan disertakan pada tabel di bawah ini:

Method Assertion

assertEqual(a, b) a == b

assertNotEqual(a, b) a != b

assertTrue(a) bool(a) is True

assertFalse(a) bool(a) is False

assertIsNone(a) a is None

assertIsNotNone(a) a is not None

assertIn(a, b) a in b

assertNotIn(a, b) a not in b

Sekarang kita telah menulis beberapa basic dari pengetesan, mari kita lihat
bagaimana kita bisa menggunakan tools lain juga yang disediakan oleh TestCase untuk
memanfaatkan kode apapun yang kita test.
Using the setUp Method to Create Resources
TestCase juga mendukung sebuah method yang bernama setUp yang bisa
membantu membuat resources berdasarkan pengetesan. Method setUp bisa sangat
membantu ketika kamu mempunyai sekumpulan kode yang ingin dieksekusi sebelum
setiap bagian dari pengetesan. setUp memudahkanmu menempatkan kumpulan kode
tadi di satu tempat, dibandingkan harus mengulang setiap individual test.
Mari kita lihat pada contoh berikut:
Tulis pada file test_fish_tank.py

test_fish_tank.py mendifinisikan sebuah Class yang bernama FishTank.


FishTank.has_water diinisialisasikan False pada method __init__, yang berarti nilai awal
nya pasti False. Kita bisa mengubah nilainya menjadi True dengan memanggil
FishTank.fill_with_water(). Lalu, Subclass TestFishTank mendifinisikan sebuah method
yang bernama setUp yang menginstansiasi sebuah instance FishTank yang baru dan
dimasukkan ke dalam properti self.fish_tank.
Ketika setUp dieksekusi sebelum setiap method pengetesan, sebuah instance
FishTank akan diinstantiasi untuk test_fish_tank_empty_by_default and
test_fish_tank_can_be_filled. test_fish_tank_empty_by_default memverifikasi bahwa
has_water bernilai False pada awalnya. Sedangkan, test_fish_tank_can_be_filled
memverifikasi bahwa has_water telah diubah nilainya menjadi True setelah
pemanggilan method fill_with_water().
Pada direktori yang sama dengan file test_fish_tank.py, dan running pengetesan
dengan command berikut.
$ python -m unittest test_fish_tank.py
Maka kita akan mendapatkan output :

Output final tersebut menunjukkan bahwa 2 test kita telah lolos.


setUp memungkinkan kita untuk menulis seperangkat kode persiapan yang akan
dijalankn untuk keseluruhan dari pengetesan kita yang ada di dalam subclass TestCase.

Catatan : Jika kita memiliki file test lebih dari satu dengan subclass TestCase yang ingin
kita jalankan, pertimbangkan untuk menggunakan command python -m unittest
discover untuk menjalankan lebih dari satu file pengetesan. Jalankan perintah python -
m unittest discover --help untuk melihat detail penggunaannya.
Using the tearDown Method to Clean Up Resources
TestCase mendukung pasangan dari method setUp yang bernama tearDown. tearDown
berguna jika, misalnya kita perlu membersihkan koneksi yang terhubung dengan
sebuah database, atau modifikasi yang dibuat ke Filesystem setelah setiap pengetesan
selesai. Kita akan mengulas kembali sebuah contoh yang digunakan tearDown dengan
Filesystem:
Tulis pada file test_advanced_fish_tank.py

test_advanced_fish_tank.py mendifinisikan sebuah Class yang bernama


AdvancedFishTank. Class ini membuat sebuah file fish_tank.txt dan berisi string “shark,
tuna”. AdvancedFishTank juga mempunyai method empty_tank yang berfungsi
menghapus file fish_tank.txt. Subclass dari AdvancedFishTank mendifinisikan method
setUp dan method tearDown di dalamnya.
Method setUp akan membuat sebuah instance AdvancedFishTank dan memasukkan
nilai nya ke properti self.fish_tank. Method tearDown akan memanggil method
empty_tank pada self.fish_tank: ini memastikan bahwa file fish_tank.txt dihapus setelah
setiap method pengetesan dieksekusi. Dengan cara ini setiap test dimulai dengan state
yang clean. Dan method test_fish_tank_writes_file memverifikasi bahwa default content
“shark, tuna” ditulis ke file fish_tank.txt.
Pada direktori yang sama dengan file test_advanced_fish_tank.py, dan running
pengetesan dengan command berikut.
$ python -m unittest test_advanced_fish_tank.py
Maka kita akan mendapatkan output :

Method tearDown memungkinkan kita untuk menulis cleanup code yang dijalankan
untuk semua pengetesan yang ada di dalam subclass TestCase.

Conclusion
Di tutorial ini kita telah menulis Class TestCase dengan assertion yang berbeda-beda,
menggunakan method setUp dan tearDown, dan menjalankan pengetesan dari
command line.
Module unittest juga memiliki Class dan Fitur lain yang tidak dibahas di modul ini.
Tetapi sejauh ini kamu telah mendapatkan penggunaan dasar dari unittest. Untuk lebih
lengkapnya kamu bisa membaca dokumentasi unittest module untuk mengulik lebih
dalam tentang Class dan Fitur yang tersedia di sana.

Anda mungkin juga menyukai