Saya ingin menulis tes untuk memastikan bahwa Pengecualian tidak dimunculkan dalam keadaan tertentu.
Ini mudah untuk menguji apakah sebuah Exception adalah mengangkat ...
sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
... tapi bagaimana Anda bisa melakukan yang sebaliknya .
Sesuatu seperti ini saya apa yang saya cari ...
sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath)
python
unit-testing
glaucon
sumber
sumber
assertNotRaises
metode yang berbagi 90% dari kode / perilakunya denganassertRaises
sekitar ~ 30-ish baris kode. Lihat jawaban saya di bawah untuk detailnya.hypothesis
memastikan mereka menghasilkan output yang sama untuk semua jenis input, sementara mengabaikan kasus-kasus di mana yang asli menimbulkan pengecualian.assume(func(a))
tidak berfungsi karena output dapat berupa array dengan nilai kebenaran yang ambigu. Jadi saya hanya ingin memanggil fungsi dan dapatkanTrue
jika tidak gagal.assume(func(a) is not None)
karya saya kiraJawaban:
sumber
ValueError
, tetapiValueError
malah dinaikkan, tes Anda harus keluar dengan kondisi kegagalan, bukan kesalahan. Di sisi lain, jika dalam menjalankan kode yang sama Anda akan menaikkanKeyError
, itu akan menjadi kesalahan, bukan kegagalan. Dalam python - berbeda dari beberapa bahasa lain - Pengecualian secara rutin digunakan untuk aliran kontrol, inilah mengapa kami memilikiexcept <ExceptionName>
sintaks yang sesungguhnya. Untuk itu, solusi user9876 benar-benar salah.Itu asumsi default - pengecualian tidak dimunculkan.
Jika Anda tidak mengatakan apa-apa lagi, itu dianggap dalam setiap tes.
Anda tidak harus benar-benar menulis pernyataan apa pun untuk itu.
sumber
Panggil saja fungsinya. Jika memunculkan pengecualian, kerangka kerja unit test akan menandai ini sebagai kesalahan. Anda mungkin ingin menambahkan komentar, misalnya:
sumber
xfail
dekorator di pytest.Saya poster asli dan saya menerima jawaban di atas oleh DGH tanpa terlebih dahulu menggunakannya dalam kode.
Setelah saya menggunakan saya menyadari bahwa perlu sedikit penyesuaian untuk benar-benar melakukan apa yang saya butuhkan (untuk bersikap adil kepada DJBM, dia memang mengatakan "atau sesuatu yang serupa"!).
Saya pikir layak memposting tweak di sini untuk kepentingan orang lain:
Apa yang saya coba lakukan di sini adalah untuk memastikan bahwa jika upaya dilakukan untuk membuat instance objek Aplikasi dengan argumen spasi kedua, pySourceAidExceptions.PathIsNotAValidOne akan dimunculkan.
Saya percaya bahwa menggunakan kode di atas (sangat bergantung pada jawaban DJBM) akan melakukannya.
sumber
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
harus melakukan pekerjaan dalam kasus ini.Anda dapat mendefinisikan
assertNotRaises
dengan menggunakan kembali sekitar 90% dari implementasi asliassertRaises
dalamunittest
modul. Dengan pendekatan ini, Anda berakhir denganassertNotRaises
metode yang, selain dari kondisi kegagalannya yang terbalik, juga berperilaku identikassertRaises
.TLDR dan demo langsung
Ternyata sangat mudah untuk menambahkan
assertNotRaises
metodeunittest.TestCase
(butuh saya sekitar 4 kali lebih lama untuk menulis jawaban ini seperti halnya kode). Berikut ini demo langsung dariassertNotRaises
metode yang digunakan . Sama sepertiassertRaises
, Anda bisa menyampaikan callable dan args keassertNotRaises
, atau Anda dapat menggunakannya dalam sebuahwith
pernyataan. Demo langsung mencakup uji kasus yang menunjukkan bahwaassertNotRaises
berfungsi sebagaimana dimaksud.Detail
Implementasi
assertRaises
dalamunittest
cukup rumit, tetapi dengan sedikit subclass pintar Anda dapat menimpa dan membalikkan kondisi kegagalannya.assertRaises
adalah metode singkat yang pada dasarnya hanya membuat instance dariunittest.case._AssertRaisesContext
kelas dan mengembalikannya (lihat definisi dalamunittest.case
modul). Anda dapat mendefinisikan_AssertNotRaisesContext
kelas Anda sendiri dengan mensubclassing_AssertRaisesContext
dan menimpa__exit__
metodenya:Biasanya Anda mendefinisikan kelas kasus uji dengan meminta mereka mewarisi dari
TestCase
. Jika Anda sebaliknya mewarisi dari subkelasMyTestCase
:semua kasus uji Anda sekarang akan memiliki
assertNotRaises
metode yang tersedia untuk mereka.sumber
traceback
Andaelse
?import
. Sudah diperbaikidapat dimodifikasi jika Anda perlu menerima parameter.
panggilan seperti
sumber
Saya merasa bermanfaat untuk menambal monyet
unittest
sebagai berikut:Ini mengklarifikasi maksud saat menguji untuk tidak adanya pengecualian:
Ini juga menyederhanakan pengujian dalam satu lingkaran, yang sering saya lakukan:
sumber
assertMayRaise
untukunittest.TestSuite
Anda hanya bisa berpura-pura bagian itu dariunittest
perpustakaan.Jika Anda lulus kelas Pengecualian
assertRaises()
, manajer konteks disediakan. Ini dapat meningkatkan keterbacaan tes Anda:Ini memungkinkan Anda untuk menguji kasus kesalahan dalam kode Anda.
Dalam hal ini, Anda menguji
PathIsNotAValidOne
dinaikkan ketika Anda melewati parameter yang tidak valid ke konstruktor Aplikasi.sumber
Anda bisa coba seperti itu. coba: self.assertRaises (Tidak ada, fungsi, arg1, arg2) kecuali: lulus jika Anda tidak memasukkan kode di dalam blok coba itu akan melalui pengecualian 'AssertionError: Tidak ada yang mengangkat "dan test case akan gagal. Test case akan lulus. Test case akan lulus jika diletakkan di dalam blok coba yang merupakan perilaku yang diharapkan.
sumber
Salah satu cara lurus ke depan untuk memastikan objek diinisialisasi tanpa kesalahan adalah dengan menguji instance tipe objek.
Berikut ini sebuah contoh:
sumber