Saya mencoba menggunakan TDD (test-driven development) dengan pytest
.
pytest
tidak akan print
ke konsol saat saya gunakan print
.
Saya menggunakan pytest my_tests.py
untuk menjalankannya.
The documentation
tampaknya mengatakan bahwa itu harus bekerja secara default: http://pytest.org/latest/capture.html
Tapi:
import myapplication as tum
class TestBlogger:
@classmethod
def setup_class(self):
self.user = "alice"
self.b = tum.Blogger(self.user)
print "This should be printed, but it won't be!"
def test_inherit(self):
assert issubclass(tum.Blogger, tum.Site)
links = self.b.get_links(posts)
print len(links) # This won't print either.
Tidak ada yang dicetak ke konsol keluaran standar saya (hanya kemajuan normal dan berapa banyak tes yang lulus / gagal).
Dan skrip yang saya uji berisi cetak:
class Blogger(Site):
get_links(self, posts):
print len(posts) # It won't get printed in the test.
Dalam unittest
modul, semuanya akan dicetak secara default, yang persis saya butuhkan. Namun, saya ingin menggunakan pytest
untuk alasan lain.
Apakah ada yang tahu cara membuat laporan cetak ditampilkan?
python
unit-testing
python-2.7
pytest
BBedit
sumber
sumber
sys.stdout.write("Test")
? Bagaimana dengansys.__stdout__.write("Test")
? Yang terakhir harus selalu menulis ke stdout yang ditentukan sistem, yang seharusnya menjadi konsol. Jika kedua perintah melakukan hal yang berbeda, maka stdout sedang diubah; jika mereka melakukan hal yang sama, maka masalahnya adalah hal lain.Jawaban:
Secara default,
py.test
tangkap hasil dari out standar sehingga dapat mengontrol bagaimana mencetaknya. Jika tidak melakukan ini, itu akan memuntahkan banyak teks tanpa konteks tes apa yang dicetak teks itu.Namun, jika tes gagal, itu akan mencakup bagian dalam laporan yang dihasilkan yang menunjukkan apa yang dicetak dengan standar dalam tes tertentu.
Sebagai contoh,
Hasil dalam output berikut:
Perhatikan
Captured stdout
bagian ini.Jika Anda ingin melihat
print
pernyataan ketika dieksekusi, Anda dapat meneruskannya ke-s
benderapy.test
. Namun, perhatikan bahwa ini terkadang sulit untuk diurai.sumber
-s
Opsi menggunakan akan mencetak output dari semua fungsi, yang mungkin terlalu banyak.Jika Anda membutuhkan hasil tertentu, halaman dokumen yang Anda sebutkan menawarkan beberapa saran:
Masukkan
assert False, "dumb assert to make PyTest print my stuff"
di akhir fungsi Anda, dan Anda akan melihat output Anda karena gagal tes.Anda memiliki objek khusus yang dikirimkan kepada Anda oleh PyTest, dan Anda dapat menulis output ke file untuk memeriksanya nanti, seperti
Anda dapat membuka
out
danerr
file di tab terpisah dan membiarkan editor secara otomatis menyegarkan untuk Anda, atau melakukanpy.test; cat out.txt
perintah shell sederhana untuk menjalankan pengujian Anda.Itu cara yang agak lunak untuk melakukan hal-hal, tetapi mungkin itu adalah hal yang Anda butuhkan: lagipula, TDD berarti Anda mengacaukan barang-barang dan membiarkannya tetap bersih dan diam ketika sudah siap :-).
sumber
print()
fungsi, Anda harus meletakkan variabel atau pesan yang ingin Anda cetak setelah koma dalam pernyataan tegas. Misalnyaassert False, what_are_you
akan 'mencetak' nilaiwhat_are_you
dalam laporan pytest.Jawaban singkat
Gunakan
-s
opsi:Jawaban terinci
Dari dokumen :
pytest
memiliki opsi--capture=method
yangmethod
merupakan per-test metode menangkap, dan bisa menjadi salah satu dari berikut ini:fd
,sys
atauno
.pytest
juga memiliki opsi-s
yang merupakan jalan pintas--capture=no
, dan ini adalah opsi yang akan memungkinkan Anda untuk melihat laporan cetak Anda di konsol.Mengatur metode pengambilan atau menonaktifkan pengambilan
Ada dua cara untuk
pytest
melakukan penangkapan:pengambilan file deskriptor (FD) level capturing (default): Semua penulisan yang masuk ke file sistem operasi deskriptor 1 dan 2 akan ditangkap.
menangkap level sys : Hanya menulis ke file Python sys.stdout dan sys.stderr akan ditangkap. Pengambilan penulisan ke pengarsipan tidak dilakukan.
sumber
Saya perlu mencetak peringatan penting tentang tes yang dilewati tepat ketika
PyTest
secara harfiah mematikan semuanya .Saya tidak ingin gagal dalam tes untuk mengirim sinyal, jadi saya melakukan hack sebagai berikut:
The
atexit
modul memungkinkan saya untuk mencetak barang-barang setelahPyTest
merilis output stream. Outputnya terlihat sebagai berikut:Pesan dicetak bahkan ketika
PyTest
berada dalam mode diam, dan tidak dicetak jika Anda menjalankan sesuatu denganpy.test -s
, jadi semuanya sudah diuji dengan baik.sumber
Menurut dokumen pytest ,
pytest --capture=sys
harus bekerja. Jika Anda ingin menangkap standar di dalam tes, lihat perlengkapan capsys.sumber
Saya awalnya datang ke sini untuk menemukan cara membuat
PyTest
cetak di konsol VSCode saat menjalankan / men-debug unit test dari sana. Ini dapat dilakukan denganlaunch.json
konfigurasi berikut . Diberikan.venv
folder lingkungan virtual.sumber