unittest.TestCase için __init__


122

unittest.TestCaseSınıfın başlatıldıktan sonra yaptıklarına birkaç şey eklemek istiyorum ama bunu nasıl yapacağımı bulamıyorum.

Şu anda bunu yapıyorum:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

Tüm taslakların tüm bu testler için yalnızca bir kez oluşturulmasını istiyorum. Kullanamıyorum setUpClass()çünkü Python 2.4 üzerinde çalışıyorum (bunu python 2.7 üzerinde de çalıştıramadım).

Burada neyi yanlış yapıyorum?

Bu hatayı alıyorum:

 `TypeError: __init__() takes 1 argument (2 given)` 

... ve __init__komutla çalıştırdığımda tüm saplama kodunu taşıdığımda diğer hatalar python -m unittest -v test.


@Neeraj Sanırım sorum bundan önce mi geliyor?
2014

@Abhijeet Bu soru 2013'te soruldu, bağlantı kurduğunuz soru 2016'da soruldu ve daha az yanıt ve söylem içeriyor, belki de diğer soruyu kopya olarak işaretlemelisiniz? Buradaki cevap Python 3 ile ilgili ve bu soru Python 2'den bahsediyor.
ffledgling

bunun için üzgünüm benim hatam
Abhijeet

Yanıtlar:


166

Bunu dene:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

TestCase' Leri geçersiz kılıyorsunuz __init__, bu nedenle temel sınıfın sizin için bağımsız değişkenleri işlemesine izin vermek isteyebilirsiniz.


+1 Yine de herhangi bir nesne yöntemini çağırmadan önce temel sınıfı başlatırdım.
Joachim Isaksson

Bu benim için çalışmıyor. Gen_stub içindeki şeyler çalıştırılmıyor. Infact, gen_stub'ın hiç çağrılmadığı gibi görünüyor ... Var olması gereken self.tempdir'e sınıfın diğer yöntemleri tarafından erişilemediğini söyleyebilirim. Bir AttributeError alıyorum: 'TestingClass' nesnesinin 'tempdir' özniteliği yok
ffledgling

22
setUpgeçersiz kılmak yerine bunu aramamalı __init__mısın?
karthikr

2
@karthikr Her test için her seferinde yeniden oluşturmak yerine, tüm testler için koçanları bir kez oluşturmak istiyorum. Bazı stub'lar bazı testler tarafından kullanılmayacaktır bile. SetUpClass'ı kullanırdım, ancak python 2.4'ün bunu desteklediğini düşünmüyorum.
acemi

2
Bu durumda biraz daha açık unittest.TestCase.__init__(self,*args,**kwargs)super(TestingClass, self).__init__(*args, **kwargs)
sözlü olabilirsiniz

22

İnit işlevinin geçersiz kılınmasıyla ilgili bazı açıklamalar eklemek istedim.

unittest.TestCase

İşlev, test sınıfınızdaki her yöntemden önce çağrılacaktır. Eğer yapılmalıdır bazı pahalı hesaplamalar eklemek istiyorsanız unutmayınız notu bir kez tüm test yöntemleri çalıştırmadan önce kullanma lütfen SetUpClass classmethod

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

Bu işlev , sınıfın tüm test yöntemlerinden önce bir kez çağrılacaktır . setUpHer test yönteminden önce çağrılan bir yöntem için bakın .


4

Unittest2'yi kurun ve bu paketin unittestini kullanın.

import unittest2 

ve sonra özel başlatma mantığı için setupModule / tearDownModule veya setupClass / tearDown sınıfını kullanın

Daha fazla bilgi: http://www.voidspace.org.uk/python/articles/unittest2.shtml

Ayrıca büyük olasılıkla bir birim testinden daha çok bir entegrasyon testi oluşturuyorsunuz. Testleri ayırt etmek için iyi bir isim seçin veya farklı bir kapsayıcı modülüne koyun.


Dokümantasyon bağlantısı için teşekkürler.
Chris
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.