Apa perbedaan antara setUp () dan setUpClass () dengan Python unittest?

101

Apa perbedaan antara setUp()dan setUpClass()dalam unittestkerangka Python ? Mengapa penyiapan ditangani dengan satu metode di atas metode lainnya?

Saya ingin memahami bagian penyetelan apa yang dilakukan dalam setUp()dan setUpClass()fungsi, serta dengan tearDown()dan tearDownClass().

etja
sumber

Jawaban:

149

Perbedaannya memanifestasikan dirinya ketika Anda memiliki lebih dari satu metode pengujian di kelas Anda. setUpClassdan tearDownClassdijalankan sekali untuk seluruh kelas; setUpdan tearDowndijalankan sebelum dan sesudah setiap metode pengujian.

Sebagai contoh:

class Example(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    def setUp(self):
        print("setUp")

    def test1(self):
        print("test1")

    def test2(self):
        print("test2")

    def tearDown(self):
        print("tearDown")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

Saat Anda menjalankan tes ini, ini mencetak:

setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass

(Titik ( .) adalah unittestkeluaran default ketika sebuah tes berhasil.) Amati setUpdan tearDownmuncul sebelum dan sesudah test1 dan test2 , sedangkan setUpClassdan tearDownClassmuncul hanya sekali, di awal dan akhir dari keseluruhan kasus tes.

Benjamin Hodgson
sumber
Bukankah urutannya seperti ini? : setUpClass setUp test1 tearDown .setUp test2 .tearDown tearDownClass
Jai Sharma
Perhatikan "." di depan tearDown dan tidak adanya "." di depan tearDownClass
Jai Sharma
Ah, maaf, tidak melihatnya. Tidak, unittestjangan anggap tes telah lulus hingga tearDownselesai tanpa insiden.
Benjamin Hodgson
Jadi masing-masing metode test1 dan test2 harus memiliki set up & tearDown sendiri, bukan? Dalam jawaban Anda, test1 tidak memiliki metode tearDown dan karena itu seharusnya mencetak keluaran default (dengan.). Koreksi saya jika saya salah.
Jai Sharma
1
Keluaran jawabannya benar. Saya menempelkannya langsung dari output unittest. setUpdan tearDownmasing-masing dijalankan sekali untuk setiap testmetode (jadi totalnya dua kali dalam contoh ini) tetapi setUpClassdan tearDownClassdijalankan hanya sekali.
Benjamin Hodgson
15

Apa perbedaan antara setUp()dan setUpClass()dengan Pythonunittest kerangka ?

Perbedaan utama (seperti dicatat dalam jawaban oleh Benjamin Hodgson) adalah bahwa setUpClassdipanggil hanya sekali dan itu sebelum semua tes, sementara setUpdipanggil tepat sebelum setiap tes. (NB: Hal yang sama berlaku untuk metode yang setara dalam framework pengujian xUnit lainnya, bukan hanya Pythonunittest .)

Dari unittest dokumentasi :

setUpClass()

Metode kelas yang dipanggil sebelum pengujian di kelas individu dijalankan. setUpClass dipanggil dengan kelas sebagai satu-satunya argumen dan harus didekorasi sebagai classmethod ():

@classmethod
def setUpClass(cls):
    ...

dan:

setUp()

Metode dipanggil untuk mempersiapkan perlengkapan tes. Ini dipanggil segera sebelum memanggil metode pengujian; selain AssertionError atau SkipTest, setiap pengecualian yang dimunculkan oleh metode ini akan dianggap sebagai kesalahan daripada kegagalan pengujian. Implementasi default tidak melakukan apa pun.

Mengapa penyiapan ditangani dengan satu metode di atas metode lainnya?

Bagian dari pertanyaan ini belum terjawab. Sesuai komentar saya dalam menanggapi jawaban Gearon, itusetUp metode ini dimaksudkan untuk elemen perlengkapan yang umum untuk semua tes (untuk menghindari duplikasi kode itu di setiap tes). Saya menemukan ini sering berguna karena menghapus duplikasi (biasanya) meningkatkan keterbacaan dan mengurangi beban pemeliharaan.

The setUpClassmetode adalah untuk elemen mahal yang Anda lebih suka hanya perlu melakukan sekali, seperti membuka koneksi database, membuka file sementara pada filesystem, memuat shared library untuk pengujian, dll Melakukan hal-hal seperti sebelum setiap tes akan memperlambat rangkaian pengujian terlalu banyak, jadi kami hanya melakukannya sekali sebelum semua pengujian. Ini adalah sedikit penurunan dalam independensi pengujian tetapi pengoptimalan yang diperlukan dalam beberapa situasi. Bisa dibilang, seseorang tidak boleh melakukan hal-hal seperti itu dalam pengujian unit karena biasanya mungkin untuk memalsukan database / filesystem / library / apapun tanpa menggunakan yang asli. Karena itu, saya merasa itu setUpClassjarang dibutuhkan. Namun, ini berguna saat menguji contoh di atas (atau serupa) menjadi perlu.

Biggsy
sumber