Bir birim testinin bir yöntemin sys.exit () 'i çağırdığını iddia etmesi mümkün müdür?


Yanıtlar:


156

Evet. sys.exityükseltir SystemExit, böylece kontrol edebilirsiniz assertRaises:

with self.assertRaises(SystemExit):
    your_method()

Örnekleri , önerilen çıkış durumuna ayarlanmış SystemExitbir özniteliğe codesahiptir ve tarafından döndürülen bağlam yöneticisi assertRaises, yakalanan istisna örneğine sahiptir exception, bu nedenle çıkış durumunu kontrol etmek kolaydır:

with self.assertRaises(SystemExit) as cm:
    your_method()

self.assertEqual(cm.exception.code, 1)

 

sys.exit Belgeleri :

Python'dan çıkın. Bu, SystemExitistisnayı yükselterek uygulanır ... çıkış girişimini bir dış seviyede durdurmak mümkündür.


3
+1, ancak aradığını doğrulamak isterse sys.exit(1)(diyelim ki, bunun tersine sys.exit(0)) gerçekten onun code1 olduğunu iddia etmelisiniz. Sanırım bunu ile yapabilirsiniz assertRaisesRegexp(SystemExit, '1')?
abarnert

İlk argümanının dize gösterimi üzerinde çalıştırmak için bir normal ifade kalıbı yerine, istisna veya onun bağımsız değişkenleri üzerinde çalışmak için unittestbir istisna ve çağrılabilir bir yüklem iletmenize izin veren bir yöntem olduğundan emindim … ama sanırım öyle değil. Düşündüğüm başka bir test modülü var mı?
abarnert

1
+1, hata kodunu kontrol etmek çok daha basittir: self.assertRaisesRegex( SystemExit, '^2$', testMethod ) Daha az kod, yeterince okunabilir.
Marek Lewandowski

1
@MarekLewandowski - yazım hatası. Olmalıself.assertRaisesRegexp
Evgen

12

İşte eksiksiz bir çalışma örneği. Pavel'in mükemmel cevabına rağmen, bunu anlamam biraz zaman aldı, bu yüzden yardımcı olması umuduyla buraya dahil ediyorum.

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

Sorunuzun cevabını Python Birim Testi belgelerinde "İstisnaları Test Etme" aramasında buldum . Örneğinizi kullanırsanız, birim testi aşağıdaki gibi görünecektir:

self.assertRaises(SystemExit, your_function, argument 1, argument 2)

İşlevinizi test etmek için gereken tüm bağımsız değişkenleri eklemeyi unutmayın.


1

Pavel'in mükemmel cevabına ek bir not olarak, test ettiğiniz işlevde sağlanmışsa belirli durumları da kontrol edebilirsiniz. Örneğin your_method(), aşağıdakileri içeriyorsa, sys.exit("Error")özellikle "Hata" yı test etmek mümkün olacaktır:

with self.assertRaises(SystemExit) as cm:
    your_method()
    self.assertEqual(cm.exception, "Error")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.