Bagaimana seseorang menulis unittest yang gagal hanya jika suatu fungsi tidak membuang pengecualian yang diharapkan?
python
unit-testing
exception
exception-handling
Daryl Spitzer
sumber
sumber
myfunc
Anda harus menambahkannya sebagai argumen untuk panggilan assertRaises. Lihat jawaban Daryl Spitzer.self.assertRaises(TypeError, mymod.myfunc)
. Anda dapat menemukan daftar lengkap Pengecualian Bawaanself.assertRaises(SomeCoolException, Constructor, arg1)
Karena Python 2.7 Anda dapat menggunakan manajer konteks untuk mengetahui objek Exception yang sebenarnya dilemparkan:
http://docs.python.org/dev/library/unittest.html#unittest.TestCase.assertRaises
Dalam Python 3.5 , Anda harus membungkus
context.exception
distr
, jika tidak, anda akan mendapatkanTypeError
sumber
context.exception
tidak memberikan pesan; itu adalah tipe.import unittest2
, Anda perlu menggunakanstr()
, yaituself.assertTrue('This is broken' in str(context.exception))
.Kode dalam jawaban saya sebelumnya dapat disederhanakan menjadi:
Dan jika fungsi mengambil argumen, cukup berikan mereka ke assertRaises seperti ini:
sumber
2.7.15
. Jikaafunction
inself.assertRaises(ExpectedException, afunction, arg1, arg2)
adalah inisialisasi kelas, Anda harus memberikanself
argumen pertama misalnya,self.assertRaises(ExpectedException, Class, self, arg1, arg2)
Jawaban singkat:
Gunakan
self.assertRaises
metode ini sebagai manajer konteks:Demonstrasi
Pendekatan praktik terbaik cukup mudah untuk ditunjukkan dalam shell Python.
The
unittest
libraryDengan Python 2.7 atau 3:
Dalam Python 2.6, Anda dapat menginstal backport
unittest
perpustakaan 2,7 , disebut unittest2 , dan hanya itu sebagaiunittest
:Contoh tes
Sekarang, tempel ke dalam kulit Python Anda tes berikut tentang keamanan tipe Python:
Uji satu menggunakan
assertRaises
sebagai manajer konteks, yang memastikan bahwa kesalahan ditangkap dan dibersihkan dengan benar, saat direkam.Kita juga bisa menulisnya tanpa manajer konteks, lihat tes dua. Argumen pertama akan menjadi tipe kesalahan yang Anda harapkan untuk naik, argumen kedua, fungsi yang Anda uji, dan args yang tersisa serta args kata kunci akan diteruskan ke fungsi itu.
Saya pikir itu jauh lebih sederhana, mudah dibaca, dan dipelihara hanya dengan menggunakan manajer konteks.
Menjalankan tes
Untuk menjalankan tes:
Dalam Python 2.6, Anda mungkin perlu yang berikut :
Dan terminal Anda harus menampilkan yang berikut:
Dan kami melihat itu seperti yang kami harapkan, berusaha untuk menambahkan
1
dan'1'
menghasilkan dalamTypeError
.Untuk lebih banyak keluaran verbose, coba ini:
sumber
Kode Anda harus mengikuti pola ini (ini adalah tes gaya modul yang paling bebas):
Pada Python <2.7 konstruk ini berguna untuk memeriksa nilai-nilai spesifik dalam pengecualian yang diharapkan. Fungsi unittest
assertRaises
hanya memeriksa apakah pengecualian muncul.sumber
assertRaises
Anda akan mendapatkan KESALAHAN bukannya GAGAL.dari: http://www.lengrand.fr/2011/12/pythonunittest-assertraises-raises-error/
Pertama, berikut adalah fungsi yang sesuai (masih dum: p) dalam file dum_function.py:
Inilah tes yang harus dilakukan (hanya tes ini yang dimasukkan):
Kami sekarang siap untuk menguji fungsi kami! Inilah yang terjadi ketika mencoba menjalankan tes:
TypeError dinaikkan, dan menghasilkan kegagalan pengujian. Masalahnya adalah inilah perilaku yang kita inginkan: s.
Untuk menghindari kesalahan ini, cukup jalankan fungsi menggunakan lambda di panggilan tes:
Hasil akhir:
Sempurna!
... dan bagiku juga sempurna !!
Thansk banyak Pak Julien Lengrand-Lambert
Tes ini menegaskan sebenarnya mengembalikan false positive . Itu terjadi karena lambda di dalam 'assertRaises' adalah unit yang memunculkan kesalahan tipe dan bukan fungsi yang diuji.
sumber
self.assertRaises(TypeError, df.square_value(self.false_int))
memanggil metode dan mengembalikan hasilnya. Yang Anda inginkan adalah untuk lulus metode dan argumen apa pun dan biarkan yang paling tidak layak untuk menyebutnya:self.assertRaises(TypeError, df.square_value, self.false_int)
Anda dapat membuat sendiri
contextmanager
untuk memeriksa apakah pengecualian telah dinaikkan.Dan kemudian Anda dapat menggunakan
raises
seperti ini:Jika Anda menggunakan
pytest
, hal ini sudah diterapkan. Anda dapat melakukanpytest.raises(Exception)
:Contoh:
Dan hasilnya:
sumber
unittest
modul!Saya menggunakan doctest [1] hampir di mana-mana karena saya suka fakta bahwa saya mendokumentasikan dan menguji fungsi saya pada saat yang sama.
Lihatlah kode ini:
Jika Anda meletakkan contoh ini dalam modul dan menjalankannya dari baris perintah, kedua kasus uji dievaluasi dan diperiksa.
[1] Dokumentasi Python: 23.2 doctest - Uji contoh Python interaktif
sumber
Saya baru saja menemukan bahwa perpustakaan Mock menyediakan metode assertRaisesWithMessage () (dalam subclass unittest.TestCase), yang akan memeriksa tidak hanya bahwa pengecualian yang diharapkan dinaikkan, tetapi juga yang dimunculkan dengan pesan yang diharapkan:
sumber
Ada banyak jawaban di sini. Kode menunjukkan bagaimana kita dapat membuat Pengecualian, bagaimana kita dapat menggunakan pengecualian itu dalam metode kami, dan akhirnya, bagaimana Anda dapat memverifikasi dalam pengujian unit, pengecualian yang benar dimunculkan.
sumber
Anda dapat menggunakan assertRaises dari modul unittest
sumber
Sementara semua jawaban baik-baik saja, saya mencari cara untuk menguji apakah suatu fungsi menimbulkan pengecualian tanpa bergantung pada kerangka kerja unit testing dan harus menulis kelas tes.
Saya akhirnya menulis yang berikut ini:
Dan gagal di jalur yang benar:
sumber