Lebih sering daripada tidak, perangkat lunak yang kami tulis berinteraksi langsung dengan apa yang kami beri label sebagai layanan "kotor". Dalam istilah awam. layanan yang sangat penting untuk aplikasi Python kita, tetapi interaksinya memiliki efek samping yang diinginkan tetapi tidak diinginkan—yaitu, tidak diinginkan dalam konteks uji coba mandiri
Membagikan
MembagikanLebih sering daripada tidak, perangkat lunak yang kami tulis berinteraksi langsung dengan apa yang kami beri label sebagai layanan "kotor". Dalam istilah awam. layanan yang sangat penting untuk aplikasi Python kita, tetapi interaksinya memiliki efek samping yang diinginkan tetapi tidak diinginkan—yaitu, tidak diinginkan dalam konteks uji coba mandiri
Oleh Naftuli Kay
Pakar Terverifikasi di bidang Teknik
Dari membangun server TCP khusus hingga aplikasi keuangan berskala besar, pengalaman Naftuli yang luas membuatnya menjadi dev dan sysadmin kelas atas
Salah satu aspek paling mendasar dalam rekayasa perangkat lunak adalah penanganan kesalahan. Aplikasi perangkat lunak dapat rusak karena berbagai alasan dan oleh karena itu sangat penting untuk dapat menulis kode sedemikian rupa sehingga dapat menangani dan melaporkan pengecualian secara efektif
Menangani pengecualian dalam kode sumber saja tidak cukup. Menguji bahwa kode Anda menangani dan melaporkan pengecualian seperti yang diharapkan bahkan lebih penting. Pengujian memastikan bahwa pengecualian dimunculkan pada saat yang tepat dan dengan pesan yang benar
Pada artikel hari ini kami akan mendemonstrasikan cara menulis kasus uji yang menguji apakah suatu fungsi memunculkan Pengecualian yang diharapkan saat peristiwa tertentu terjadi. Lebih khusus lagi, kami akan menunjukkan cara melakukannya menggunakan dua paket pengujian paling populer di Python, yaitu unittest dan pytest
Pertama, mari buat satu contoh fungsi yang memunculkan Pengecualian saat peristiwa tertentu terjadi. Kami kemudian akan melalui panduan langkah demi langkah yang pada akhirnya akan membantu Anda menguji penanganan pengecualian
def greet(greeting):if greeting not in ('hello', 'hi'):
raise ValueError(f'{greeting} is not allowed')
print(greeting + ' world!')
Fungsi greet_ kita akan memunculkan ValueError jika argumen input import unittestclass MyTestCase(unittest.TestCase): def test_greet_raises(self):
self.assertRaises(ValueError, greet, 'bye')if __name__ == '__main__':
unittest.main()0 tidak sama dengan import unittestclass MyTestCase(unittest.TestCase): def test_greet_raises(self):
self.assertRaises(ValueError, greet, 'bye')if __name__ == '__main__':
unittest.main()1 atau import unittestclass MyTestCase(unittest.TestCase): def test_greet_raises(self):
self.assertRaises(ValueError, greet, 'bye')if __name__ == '__main__':
unittest.main()2. Sekarang mari kita lihat dalam praktiknya bagaimana kita dapat menguji dengan benar bahwa fungsi memunculkan pengecualian seperti yang diharapkan dengan unittest dan pytest
Menguji penanganan pengecualian dengan unittest
Untuk membuat kasus uji untuk menguji apakah ValueError dimunculkan oleh import unittestclass MyTestCase(unittest.TestCase): def test_greet_raises(self):
self.assertRaises(ValueError, greet, 'bye')if __name__ == '__main__':
unittest.main()6 ketika argumen input tidak memiliki nilai yang diharapkan, kita dapat memanfaatkan metode import unittestclass MyTestCase(unittest.TestCase): def test_greet_raises(self):
self.assertRaises(ValueError, greet, 'bye')if __name__ == '__main__':
unittest.main()7 seperti yang diuraikan di bawah ini
self.assertRaises(ValueError, greet, 'bye')if __name__ == '__main__':
unittest.main()_
Alternatifnya, Anda bahkan dapat menggunakan Pengelola Konteks seperti yang ditunjukkan pada contoh di bawah ini
import unittestclass MyTestCase(unittest.TestCase):def test_greet_raises(self):with self.assertRaises(ValueError) as context:
greet('bye')if __name__ == '__main__':
unittest.main()
Kami bahkan dapat menguji pesan aktual yang dilaporkan oleh Pengecualian yang dimunculkan menggunakan pendekatan berikut
import unittestclass MyTestCase(unittest.TestCase):def test_greet_raises(self):with self.assertRaises(ValueError) as context :
greet('bye')
self.assertEqual('bye is not allowed', str(context.exception))if __name__ == '__main__':
unittest.main()_
Menguji penanganan pengecualian dengan pytest
Dengan cara yang sama kita dapat menggunakan pytest untuk menegaskan bahwa suatu fungsi memunculkan pengecualian
import pytestdef test_greet():with pytest.raises(ValueError):
greet('bye')_
Demikian pula, kami juga dapat menguji pesan kesalahan yang dilaporkan oleh Pengecualian yang kami harapkan akan dimunculkan
with pytest.raises(ValueError, match='bye is not allowed'):
greet('bye')
Pikiran Akhir
Cakupan pengujian adalah salah satu metrik terpenting yang dapat Anda gunakan untuk mengetahui seberapa baik kode sumber Anda diuji. Terlepas dari desain yang bagus dan kode yang efisien, sangat penting untuk memastikan bahwa setiap aspek kode Anda berfungsi seperti yang diharapkan sehingga Anda dapat meminimalkan bug. Dan ini hanya dapat dicapai melalui pengujian menyeluruh
Dalam tutorial singkat hari ini, kami mendemonstrasikan cara menguji fungsi yang memunculkan Pengecualian. Selain menguji “jalur yang baik” dari alur, penting juga untuk memastikan bahwa kesalahan ditangani dengan benar dalam kode sumber Anda
Jadilah anggota dan baca setiap cerita di Medium. Biaya keanggotaan Anda secara langsung mendukung saya dan penulis lain yang Anda baca. Anda juga akan mendapatkan akses penuh ke setiap cerita di Medium