__init__ untuk unittest.TestCase

122

Saya ingin menambahkan beberapa hal ke apa yang unittest.TestCasekelas lakukan setelah diinisialisasi tetapi saya tidak tahu bagaimana melakukannya.

Sekarang saya melakukan ini:

#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

Saya ingin semua rintisan dibuat hanya sekali untuk seluruh rangkaian pengujian ini. Saya tidak dapat menggunakan setUpClass()karena saya sedang mengerjakan Python 2.4 (saya juga belum bisa membuatnya bekerja pada python 2.7).

Apa yang saya lakukan salah di sini?

Saya mendapatkan kesalahan ini:

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

... dan kesalahan lainnya saat saya memindahkan semua kode rintisan ke __init__saat saya menjalankannya dengan perintah python -m unittest -v test.

ffledgling
sumber
@Neeraj Saya pikir pertanyaan saya sebelum yang satu itu?
ffledgling
@Abhijeet Pertanyaan ini ditanyakan pada tahun 2013, pertanyaan yang Anda tautkan telah ditanyakan pada tahun 2016, dan memiliki lebih sedikit jawaban dan wacana, mungkin sebaiknya Anda menandai pertanyaan lain sebagai duplikat? Jawabannya ada terkait Python 3 dan pertanyaan ini berbicara tentang Python 2.
ffledgling
maaf tentang itu salahku.
Abhijeet

Jawaban:

166

Coba ini:

class TestingClass(unittest.TestCase):

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

Anda mengganti TestCase's __init__, jadi Anda mungkin ingin membiarkan kelas dasar menangani argumen untuk Anda.

karthikr
sumber
+1 Saya akan menginisialisasi kelas dasar sebelum memanggil metode objek apa pun.
Joachim Isaksson
Ini tidak berhasil untukku. Hal-hal di dalam gen_stub tidak sedang dieksekusi. Infact sepertinya gen_stub tidak dipanggil sama sekali ... Saya tahu karena self.tempdir yang seharusnya ada, tidak dapat diakses oleh metode lain di kelas. Saya mendapatkan AttributeError: objek 'TestingClass' tidak memiliki atribut 'tempdir'
ffledgling
22
haruskah Anda tidak memanggil ini setUpdaripada menimpa __init__?
karthikr
2
@karthikr Saya ingin membuat stub sekali untuk semua tes daripada membuatnya kembali untuk setiap tes setiap saat. Beberapa stub bahkan tidak akan digunakan oleh beberapa tes. Saya akan menggunakan setUpClass, tetapi menurut saya python 2.4 tidak mendukungnya.
ffledgling
2
Anda juga bisa sedikit lebih eksplisit dalam hal ini (yang menurut saya membantu keterbacaan) dan menggunakan: unittest.TestCase.__init__(self,*args,**kwargs)alih-alihsuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo
22

Hanya ingin menambahkan beberapa klarifikasi tentang menimpa fungsi init dari

unittest.TestCase

Fungsi tersebut akan dipanggil sebelum setiap metode di kelas pengujian Anda. Harap dicatat bahwa jika Anda ingin menambahkan beberapa perhitungan mahal yang harus dilakukan sekali sebelum menjalankan semua metode pengujian menyenangkan menggunakan SetUpClass classmethod

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

Fungsi ini akan dipanggil satu kali sebelum semua metode pengujian kelas. Lihat setUpmetode yang dipanggil sebelum setiap metode pengujian.

Thomas Vetterli
sumber
4

Instal unittest2 dan gunakan unittest paket itu.

import unittest2 

dan kemudian gunakan kelas setupModule / tearDownModule atau setupClass / tearDown untuk logika inisialisasi khusus

Info lebih lanjut: http://www.voidspace.org.uk/python/articles/unittest2.shtml

Juga kemungkinan besar Anda membuat tes integrasi lebih dari satu unittest. Pilih nama yang baik untuk Tes untuk membedakannya atau masukkan ke dalam modul penampung yang berbeda.

fabrizioM
sumber
Terima kasih untuk tautan dokumentasinya.
Chris