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.exitkenaikan gaji SystemExit, sehingga Anda dapat memeriksanya dengan assertRaises:
with self.assertRaises(SystemExit):
your_method()
Contoh dari SystemExitmemiliki atribut codeyang diatur ke status keluar yang diusulkan, dan manajer konteks yang dikembalikan oleh assertRaisesmemiliki 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
SystemExiteksepsi ... adalah mungkin untuk mencegat upaya keluar di tingkat luar.
sys.exit(1)(bukan, katakanlah, sys.exit(0)) Anda perlu menegaskan bahwa codeini adalah 1. Saya kira Anda bisa melakukannya dengan assertRaisesRegexp(SystemExit, '1')?
unittestmetode 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")