Kadang-kadang saya ingin memasukkan beberapa pernyataan cetak ke dalam kode saya, dan melihat apa yang tercetak ketika saya menjalankannya. Cara biasa saya untuk "berolahraga" adalah dengan tes pytest yang ada. Tetapi ketika saya menjalankan ini, saya sepertinya tidak dapat melihat output standar (setidaknya dari dalam PyCharm, IDE saya).
Apakah ada cara sederhana untuk melihat output standar selama menjalankan pytest?
Jawaban:
The
-s
beralih menonaktifkan menangkap per-test.sumber
-s
=--capture=no
Dalam komentar terangkat ke jawaban yang diterima , Joe bertanya:
Dalam UNIX, ini biasa disebut dengan teeing . Idealnya, teeing daripada menangkap akan menjadi standar py.test. Non-idealnya, baik py.test maupun plugin pihak ketiga yang ada py.test (... yang saya tahu, toh ) mendukung teeing - meskipun Python sepele mendukung teeing out-of-the-box .
Py-patching py.test untuk melakukan sesuatu yang tidak didukung tidak mudah. Mengapa? Karena:
_pytest
paket pribadi yang tidak dimaksudkan untuk diimpor secara eksternal. Mencoba melakukannya tanpa mengetahui apa yang Anda lakukan biasanya menghasilkanpytest
paket publik yang meningkatkan pengecualian yang tidak jelas saat runtime. Terima kasih banyak, py.test. Anda benar-benar memiliki arsitektur yang kuat._pytest
API dengan cara yang aman, Anda harus melakukannya sebelum menjalankan publikpytest
paket dijalankan oleh eksternalpy.test
perintah. Anda tidak dapat melakukan ini dalam plugin (mis.,conftest
Modul tingkat atas di suite pengujian Anda). Pada saat py.test malas untuk secara dinamis mengimpor plugin Anda, setiap kelas py.test yang ingin Anda tempelkan kera sudah sejak lama dipakai - dan Anda tidak memiliki akses ke instance itu. Ini menyiratkan bahwa, jika Anda ingin patch monyet Anda diterapkan secara bermakna, Anda tidak dapat lagi menjalankanpy.test
perintah eksternal dengan aman . Sebagai gantinya, Anda harus membungkus menjalankan perintah itu dengan alat setup kustomtest
perintah itu (dalam urutan):_pytest
.pytest.main()
fungsi publik untuk menjalankanpy.test
perintah.Ini menjawab monyet-patch py.test
-s
dan--capture=no
opsi untuk menangkap stderr tetapi tidak stdout. Secara default, opsi ini tidak menangkap stderr atau stdout. Ini tidak cukup teeing, tentu saja. Tetapi setiap perjalanan besar dimulai dengan prekuel yang membosankan yang dilupakan semua orang dalam lima tahun.Kenapa melakukan ini? Sekarang saya akan memberi tahu Anda. Rangkaian uji yang digerakkan oleh py.test saya berisi tes fungsional lambat. Menampilkan tes ini sangat membantu dan meyakinkan, mencegah leycec dari mencapai
killall -9 py.test
ketika tes fungsional lama lainnya gagal melakukan apa pun selama berminggu-minggu. Namun, dengan menampilkan stderr dari tes-tes ini, mencegah py.test melaporkan traceback pengecualian pada kegagalan tes. Yang benar-benar tidak membantu. Karenanya, kami memaksa py.test untuk menangkap stderr tetapi tidak stdout.Sebelum kita
test
membahasnya , jawaban ini mengasumsikan Anda sudah memiliki perintah custom setuptools yang memanggil py.test. Jika tidak, lihat subbagian Integrasi Manual dari halaman Good Practices yang ditulis py.test .Jangan tidak menginstal pytest-pelari , seorang setuptools pihak ketiga plugin yang menyediakan setuptools kustom
test
perintah juga memohon py.test. Jika pytest-runner sudah diinstal, Anda mungkin perlu menghapus instalasi paket pip3 itu dan kemudian mengadopsi pendekatan manual yang terhubung ke atas.Dengan asumsi Anda mengikuti petunjuk dalam Integrasi Manual yang disorot di atas, basis kode Anda sekarang harus berisi
PyTest.run_tests()
metode. Ubah metode ini menyerupai:Untuk mengaktifkan monkey-patch ini, jalankan py.test sebagai berikut:
Stderr tetapi tidak stdout sekarang akan ditangkap. Bagus!
Memperluas patch monyet di atas ke tee stdout dan stderr dibiarkan sebagai latihan untuk pembaca dengan barel penuh waktu luang.
sumber
Saat menjalankan tes gunakan
-s
opsi. Semua pernyataan cetak dalamexampletest.py
akan dicetak pada konsol saat tes dijalankan.sumber
Menurut dokumentasi pytest , versi 3 dari pytest dapat menonaktifkan penangkapan sementara dalam tes:
sumber
pytest menangkap stdout dari masing-masing tes dan menampilkannya hanya pada kondisi tertentu, bersama dengan ringkasan tes yang dicetak secara default.
Info ringkasan tambahan dapat ditampilkan menggunakan opsi '-r':
menunjukkan hasil yang ditangkap dari tes yang lulus.
menunjukkan hasil pengujian gagal yang ditangkap (perilaku default).
Format output lebih cantik dengan -r daripada dengan -s.
sumber
Coba
pytest -s -v test_login.py
untuk info lebih lanjut di konsol.-v
ini singkat--verbose
-s
berarti 'nonaktifkan semua pengambilan'sumber
Jika Anda menggunakan PyCharm IDE, maka Anda dapat menjalankan tes individual atau semua tes menggunakan Run toolbar. Jendela Jalankan alat menampilkan keluaran yang dihasilkan oleh aplikasi Anda dan Anda dapat melihat semua pernyataan cetak di sana sebagai bagian dari hasil pengujian.
sumber
pytest --capture=tee-sys
baru-baru ini ditambahkan. Anda dapat menangkap serta melihat output pada stdout / err.sumber
Jawaban lain tidak berhasil. Satu- satunya cara untuk melihat output yang ditangkap menggunakan bendera berikut:
sumber
--show-capture=all
adalah nilai default. Menambahkannya tidak mempengaruhi apa pun.