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


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.


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)

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.


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")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.