Apakah mungkin pengujian unit untuk menyatakan bahwa metode memanggil sys.exit ()

98

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?

Travis Bear
sumber
Kemungkinan duplikat dari Unittest: tegaskan kode SystemExit kanan
AGK

Jawaban:

155

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)

 

Dokumentasi sys.exit :

Keluar dari Python. Ini diimplementasikan dengan menaikkan SystemExiteksepsi ... adalah mungkin untuk mencegat upaya keluar di tingkat luar.

Pavel Anossov
sumber
3
+1, kecuali jika dia ingin memverifikasi bahwa panggilan itu sys.exit(1)(bukan, katakanlah, sys.exit(0)) Anda perlu menegaskan bahwa codeini adalah 1. Saya kira Anda bisa melakukannya dengan assertRaisesRegexp(SystemExit, '1')?
abarnert
Saya yakin ada 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?
abarnert
1
+1, untuk memeriksa kode kesalahan, jauh lebih mudah untuk melakukannya: Lebih self.assertRaisesRegex( SystemExit, '^2$', testMethod ) sedikit kode, cukup mudah dibaca.
Marek Lewandowski
1
@MarekLewandowski - salah ketik. Harusself.assertRaisesRegexp
Evgen
12

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)
Travis Bear
sumber
3

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.

tukang tidur
sumber
1

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")
biner substrat
sumber