Kode:
# coding=utf-8
import pytest
def whatever():
return 9/0
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
pytest.fail(exc, pytrace=True)
Keluaran:
================================ test session starts =================================
platform linux2 -- Python 2.7.3 -- py-1.4.20 -- pytest-2.5.2
plugins: django, cov
collected 1 items
pytest_test.py F
====================================== FAILURES ======================================
___________________________________ test_whatever ____________________________________
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
> pytest.fail(exc, pytrace=True)
E Failed: integer division or modulo by zero
pytest_test.py:12: Failed
============================== 1 failed in 1.16 seconds ==============================
Bagaimana cara membuat traceback cetak pytest, jadi saya akan melihat di mana dalam whatever
fungsi pengecualian dimunculkan?
python
unit-testing
testing
pytest
Gill Bates
sumber
sumber
Jawaban:
pytest.raises(Exception)
adalah apa yang kamu butuhkan.Kode
Keluaran
Catatan yang
e_info
menyimpan objek pengecualian sehingga Anda dapat mengekstrak detail darinya. Misalnya, jika Anda ingin memeriksa tumpukan panggilan pengecualian atau pengecualian bersarang lainnya di dalam.sumber
e_info
. Untuk pengembang yang lebih terbiasa dengan bahasa lain tertentu, tidak jelas bahwa ruang lingkupe_info
meluas di luarwith
blok.Apakah maksud Anda seperti ini:
sumber
excinfo.value.message
tidak bekerja untuk saya, harus menggunakanstr(excinfo.value)
, menambahkan jawaban baruassert excinfo.value.args[0] == 'some info'
adalah cara langsung untuk mengakses pesanassert excinfo.match(r"^some info$")
berfungsi juga3.1
Anda dapat menggunakan argumen kata kuncimatch
untuk menyatakan bahwa pengecualian cocok dengan teks atau regex:with raises(ValueError, match='must be 0 or None'): raise ValueError("value must be 0 or None")
atauwith raises(ValueError, match=r'must be \d+$'): raise ValueError("value must be 42")
Ada dua cara untuk menangani kasus seperti ini di pytest:
Menggunakan
pytest.raises
fungsiMenggunakan
pytest.mark.xfail
dekoratorPenggunaan
pytest.raises
:Penggunaan
pytest.mark.xfail
:Output dari
pytest.raises
:Output dari
pytest.xfail
penanda:Seperti yang dikatakan dalam dokumentasi :
sumber
xfail
bukan solusi untuk masalah di sini, itu hanya memungkinkan tes gagal. Di sini kami ingin memeriksa apakah pengecualian tertentu dimunculkan.Anda dapat mencoba
sumber
str(excinfo.value)
diperlukan penggunaan. Ia juga bekerja di pytest 4.x. Di pytest 4.x,str(excinfo)
juga berfungsi, tetapi tidak berfungsi di pytest 5.0.0.pytest terus berkembang dan dengan salah satu perubahan yang bagus di masa lalu baru-baru ini sekarang mungkin untuk menguji secara bersamaan
Dua contoh dari dokumentasi:
Saya telah menggunakan pendekatan itu di sejumlah proyek dan sangat menyukainya.
sumber
Cara yang benar digunakan
pytest.raises
tetapi saya menemukan cara alternatif yang menarik dalam komentar di sini dan ingin menyimpannya untuk pembaca masa depan dari pertanyaan ini:sumber
Solusi ini yang kami gunakan:
Silakan merujuk ke pytest, https://docs.pytest.org/en/latest/reference.html#pytest-raises
sumber
Praktik yang lebih baik akan menggunakan kelas yang mewarisi unittest.TestCase dan menjalankan self.assertRaises.
Sebagai contoh:
Maka Anda akan menjalankannya dengan menjalankan:
sumber
pytest
lebih populer daripadanosex
, tetapi ini adalah bagaimana saya menggunakan pytest.Sudahkah Anda mencoba menghapus "pytrace = True"?
Sudahkah Anda mencoba menjalankan dengan '--fulltrace'?
sumber