Python mock return value meningkatkan pengecualian

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

Membagikan

Python mock return value meningkatkan pengecualian

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

Python mock return value meningkatkan pengecualian

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

import unittestclass MyTestCase(unittest.TestCase):    def test_greet_raises(self):
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

import pytestdef test_greet():
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

Bagaimana Anda memunculkan pengecualian dari tiruan dengan Python?

Tetapkan saja pengecualian untuk side_effect sebagai gantinya. mockedObj. raiseError. side_effect = Pengecualian("Tes") .

Bagaimana Anda meningkatkan pengecualian dalam pengujian unit Python?

menggunakan argumen kata kunci. Lewati saja pengecualian, fungsi yang dapat dipanggil dan parameter dari fungsi yang dapat dipanggil sebagai argumen kata kunci yang akan menimbulkan pengecualian. Lakukan pemanggilan fungsi yang akan memunculkan pengecualian dengan konteks .

Apa yang dilakukan @patch dengan Python?

patch() sebagai Dekorator . Fungsi-fungsi ini sekarang ada di file mereka sendiri, terpisah dari pengujiannya. Selanjutnya, Anda akan membuat ulang tes Anda dalam file bernama tes. py. mock an object for the duration of your entire test function, you can use patch() as a function decorator. These functions are now in their own file, separate from their tests. Next, you'll re-create your tests in a file called tests.py .

Apa perbedaan antara side_effect dan Return_value?

side_effect vs return_value . With side_effect you define a function/class (or iterator or exception), which should be called instead of the original function/class. Dengan return_value Anda menentukan hasilnya, fungsi/kelas apa yang seharusnya dikembalikan sehingga kita tidak perlu memanggilnya.