Saya memiliki metode python 2.7 yang terkadang memanggil
sys.exit(1)
Apakah mungkin membuat pengujian unit yang memverifikasi baris kode ini dipanggil ketika kondisi yang tepat terpenuhi?
Saya memiliki metode python 2.7 yang terkadang memanggil
sys.exit(1)
Apakah mungkin membuat pengujian unit yang memverifikasi baris kode ini dipanggil ketika kondisi yang tepat terpenuhi?
Jawaban:
Iya. sys.exit
kenaikan gaji SystemExit
, sehingga Anda dapat memeriksanya dengan assertRaises
:
with self.assertRaises(SystemExit):
your_method()
Contoh dari SystemExit
memiliki atribut code
yang diatur ke status keluar yang diusulkan, dan manajer konteks yang dikembalikan oleh assertRaises
memiliki contoh pengecualian yang tertangkap exception
, jadi memeriksa status keluar itu mudah:
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception.code, 1)
Keluar dari Python. Ini diimplementasikan dengan menaikkan
SystemExit
eksepsi ... adalah mungkin untuk mencegat upaya keluar di tingkat luar.
sys.exit(1)
(bukan, katakanlah, sys.exit(0)
) Anda perlu menegaskan bahwa code
ini adalah 1. Saya kira Anda bisa melakukannya dengan assertRaisesRegexp(SystemExit, '1')
?
unittest
metode yang memungkinkan Anda melewatkan pengecualian dan predikat yang dapat dipanggil untuk dijalankan pada pengecualian atau argumennya, bukan hanya pola regex untuk dijalankan pada representasi string dari argumen pertama ... tapi saya rasa tidak. Apakah ada modul tes lain yang saya pikirkan?
self.assertRaisesRegex( SystemExit, '^2$', testMethod )
sedikit kode, cukup mudah dibaca.
self.assertRaisesRegexp
Berikut contoh kerja lengkapnya. Terlepas dari jawaban Pavel yang sangat baik, saya butuh waktu untuk memikirkannya, jadi saya memasukkannya di sini dengan harapan itu akan membantu.
import unittest
from glf.logtype.grinder.mapping_reader import MapReader
INCOMPLETE_MAPPING_FILE="test/data/incomplete.http.mapping"
class TestMapReader(unittest.TestCase):
def test_get_tx_names_incomplete_mapping_file(self):
map_reader = MapReader()
with self.assertRaises(SystemExit) as cm:
tx_names = map_reader.get_tx_names(INCOMPLETE_MAPPING_FILE)
self.assertEqual(cm.exception.code, 1)
Saya menemukan jawaban atas pertanyaan Anda dalam pencarian dokumentasi Pengujian Unit Python untuk "Pengujian untuk Pengecualian". Menggunakan contoh Anda, pengujian unit akan terlihat seperti berikut:
self.assertRaises(SystemExit, your_function, argument 1, argument 2)
Ingatlah untuk menyertakan semua argumen yang diperlukan untuk menguji fungsi Anda.
Sebagai catatan tambahan untuk jawaban luar biasa Pavel, Anda juga dapat memeriksa status tertentu jika disediakan dalam fungsi yang Anda uji. Misalnya jika your_method()
berisi berikut sys.exit("Error")
ini akan mungkin untuk menguji "Error" secara khusus:
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception, "Error")