Jika saya menulis pengujian unit dalam python (menggunakan modul unittest), apakah mungkin untuk mengeluarkan data dari pengujian yang gagal, jadi saya dapat memeriksanya untuk membantu menyimpulkan apa yang menyebabkan kesalahan? Saya menyadari kemampuan untuk membuat pesan yang disesuaikan, yang dapat membawa beberapa informasi, tetapi terkadang Anda mungkin berurusan dengan data yang lebih kompleks, yang tidak dapat dengan mudah direpresentasikan sebagai string.
Misalnya, Anda memiliki kelas Foo, dan sedang menguji bilah metode, menggunakan data dari daftar yang disebut testdata:
class TestBar(unittest.TestCase):
def runTest(self):
for t1, t2 in testdata:
f = Foo(t1)
self.assertEqual(f.bar(t2), 2)
Jika tes gagal, saya mungkin ingin mengeluarkan t1, t2 dan / atau f, untuk melihat mengapa data khusus ini mengakibatkan kegagalan. Dengan output, yang saya maksud adalah variabel dapat diakses seperti variabel lainnya, setelah pengujian dijalankan.
sumber
msg
digunakan, ini akan menggantikan pesan kesalahan normal. Untukmsg
ditambahkan ke pesan kesalahan normal, Anda juga perlu menyetel TestCase.longMessage ke TrueTrue
.Kami menggunakan modul logging untuk ini.
Sebagai contoh:
Itu memungkinkan kita untuk mengaktifkan debugging untuk pengujian tertentu yang kita tahu gagal dan yang kita inginkan informasi debug tambahannya.
Metode pilihan saya, bagaimanapun, bukanlah menghabiskan banyak waktu untuk debugging, tetapi menghabiskannya menulis tes yang lebih terperinci untuk mengungkap masalah.
sumber
foo
? Fungsi terpisah? Fungsi metodeSomeTest
? Dalam kasus pertama, suatu fungsi dapat memiliki pencatatnya sendiri. Dalam kasus kedua, fungsi metode lain dapat memiliki pencatatnya sendiri. Apakah Anda mengetahui cara kerjalogging
paket? Banyak penebang adalah norma.Anda dapat menggunakan pernyataan cetak sederhana, atau cara penulisan lainnya untuk stdout. Anda juga dapat menjalankan debugger Python di mana saja dalam pengujian Anda.
Jika Anda menggunakan nose untuk menjalankan pengujian (yang saya rekomendasikan), ini akan mengumpulkan stdout untuk setiap pengujian dan hanya menampilkannya kepada Anda jika pengujian gagal, jadi Anda tidak harus hidup dengan output yang berantakan saat pengujian berhasil.
nose juga memiliki sakelar untuk secara otomatis menampilkan variabel yang disebutkan dalam asserts, atau untuk memanggil debugger pada pengujian yang gagal. Misalnya
-s
(--nocapture
) mencegah penangkapan stdout.sumber
print
dan dilog.debug()
samping satu sama lain, dan secara eksplisit mengaktifkanDEBUG
logging di root darisetUp()
metode ini, tetapi hanyaprint
output yang muncul.nosetests -s
menunjukkan isi stdout apakah ada kesalahan atau tidak - sesuatu yang menurut saya berguna.Menurut saya ini bukan yang Anda cari, tidak ada cara untuk menampilkan nilai variabel yang tidak gagal, tetapi ini dapat membantu Anda lebih dekat untuk mengeluarkan hasil seperti yang Anda inginkan.
Anda bisa menggunakan objek TestResult yang dikembalikan oleh TestRunner.run () untuk analisis dan pemrosesan hasil. Khususnya, TestResult.errors dan TestResult.failures
Tentang Objek TestResults:
http://docs.python.org/library/unittest.html#id3
Dan beberapa kode untuk mengarahkan Anda ke arah yang benar:
sumber
Opsi lain - mulai debugger di mana pengujian gagal.
Coba jalankan pengujian Anda dengan Testoob (ini akan menjalankan rangkaian unittest Anda tanpa perubahan), dan Anda dapat menggunakan sakelar baris perintah '--debug' untuk membuka debugger saat pengujian gagal.
Berikut sesi terminal di windows:
sumber
Metode yang saya gunakan sangat sederhana. Saya hanya mencatatnya sebagai peringatan agar benar-benar muncul.
sumber
Saya pikir saya mungkin terlalu memikirkan hal ini. Salah satu cara saya menemukan yang melakukan pekerjaan itu, cukup dengan memiliki variabel global, yang mengakumulasi data diagnostik.
Sesuatu seperti ini:
Terima kasih atas balasannya. Mereka telah memberi saya beberapa ide alternatif tentang cara merekam informasi dari pengujian unit dengan python.
sumber
Gunakan logging:
Pemakaian:
Jika Anda tidak mengatur
LOG_FILE
, logging harusstderr
.sumber
Anda dapat menggunakan
logging
modul untuk itu.Jadi dalam kode unit test, gunakan:
Secara default, peringatan dan error di-output ke
/dev/stderr
, jadi harus terlihat di konsol.Untuk menyesuaikan log (seperti pemformatan), coba contoh berikut:
sumber
Apa yang saya lakukan dalam kasus ini adalah memiliki
log.debug()
dengan beberapa pesan di aplikasi saya. Karena level logging default adalahWARNING
, pesan seperti itu tidak ditampilkan dalam eksekusi normal.Kemudian, di unittest saya mengubah level logging ke
DEBUG
, sehingga pesan seperti itu ditampilkan saat menjalankannya.Di unittests:
Lihat contoh lengkapnya:
Ini adalah
daikiri.py
kelas dasar yang mengimplementasikan Daikiri dengan nama dan harganya. Ada metodemake_discount()
yang mengembalikan harga daikiri tertentu setelah menerapkan diskon yang diberikan:Kemudian, saya membuat unittest
test_daikiri.py
yang memeriksa penggunaannya:Jadi ketika saya menjalankannya, saya mendapatkan
log.debug
pesan:sumber
inspect.trace akan membiarkan Anda mendapatkan variabel lokal setelah pengecualian diberikan. Anda kemudian dapat membungkus tes unit dengan dekorator seperti yang berikut untuk menyimpan variabel lokal tersebut untuk diperiksa selama pemeriksaan mayat.
Baris terakhir akan mencetak nilai yang dikembalikan di mana tes berhasil dan variabel lokal, dalam hal ini x, ketika gagal:
Har det gøy :-)
sumber
Bagaimana menangkap pengecualian yang dihasilkan dari kegagalan pernyataan? Di blok tangkapan Anda, Anda dapat mengeluarkan data sesuka Anda ke mana pun. Kemudian setelah selesai, Anda dapat membuang kembali pengecualian tersebut. Pelari tes mungkin tidak akan tahu bedanya.
Penafian: Saya belum mencoba ini dengan kerangka pengujian unit python tetapi dengan kerangka pengujian unit lainnya.
sumber
Mengakui bahwa saya belum mencobanya, fitur pencatatan uji coba terlihat cukup berguna ...
sumber
Memperluas jawaban @FC, ini bekerja dengan cukup baik untuk saya:
sumber