Saat menjalankan tes PHPUnit, saya ingin dapat membuang output sehingga saya dapat men-debug satu atau dua hal.
Saya telah mencoba yang berikut (mirip dengan contoh Manual PHPUnit );
class theTest extends PHPUnit_Framework_TestCase
{
/**
* @outputBuffering disabled
*/
public function testOutput() {
print_r("Hello World");
print "Ping";
echo "Pong";
$out = "Foo";
var_dump($out);
}
}
Dengan hasil sebagai berikut:
PHPUnit @package_version@ by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.00Mb
OK (1 test, 0 assertions)
Perhatikan tidak ada output yang diharapkan.
Saya menggunakan versi HEAD dari git repos pada 19 September 2011.
Output dari php -version
:
$ php -version
PHP 5.2.9 (cli) (built: Dec 8 2010 11:36:37)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
Apakah ada yang saya lakukan salah, atau ini berpotensi bug PHPUnit?
php
unit-testing
phpunit
Jess Telford
sumber
sumber
testOutput()
metode?phpunit /path/to/tests/theTest.php
(jika kelas di atas ada dalam filetheTest.php
).ob_get_level()
kembali1
. Namun, ini bertentangan dengan kode berikut:while (ob_get_level() > 0) { ob_end_flush(); }
yang salah denganob_end_clean(): failed to delete buffer. No buffer to delete.
. Ingin tahu dan ingin tahu.Jawaban:
MEMPERBARUI
Baru menyadari cara lain untuk melakukan ini yang bekerja lebih baik daripada
--verbose
opsi baris perintah:Ini memungkinkan Anda membuang apa pun ke konsol Anda kapan saja tanpa semua hasil yang tidak diinginkan yang menyertai
--verbose
opsi CLI.Seperti yang dicatat oleh jawaban lain, yang terbaik adalah menguji keluaran menggunakan metode bawaan seperti:
Namun, kadang-kadang membantu untuk menjadi nakal dan melihat hasil debugging satu kali / sementara dari dalam kasus pengujian Anda.
var_dump
Meskipun demikian, tidak perlu melakukan hack / solusi. Ini dapat dengan mudah dicapai dengan mengatur--verbose
opsi baris perintah saat menjalankan suite pengujian Anda. Sebagai contoh:Ini akan menampilkan output dari dalam metode pengujian Anda saat berjalan di lingkungan CLI.
Lihat: Menulis Tes untuk PHPUnit - Menguji Output .
sumber
file_put_contents('php://stderr', $myDebugVar, FILE_APPEND);
, karena saya punya pesanUse of undefined constant STDERR - assumed 'STDERR'
dengan fwrite .STDOUT
bukannyaSTERR
STDERR
. Saya menggunakanPHPUnit 4.5.0
baris windows cmd. sebuahecho
pernyataan tidak memberikan hasil yang sama.echo
tidak menghasilkan tetapi hanya setelah hasil tes ditampilkan.fwrite(STDERR, 'string')
ataufwrite(STDOUT,'string')
menghasilkan hasil yang sama: Output sebelum hasil tes ditampilkan.Pembaruan: Lihat pembaruan rdlowrey di bawah mengenai penggunaan
fwrite(STDERR, print_r($myDebugVar, TRUE));
sebagai cara yang lebih sederhanaPerilaku ini disengaja (seperti jasonbar telah menunjukkan ). Status manual yang saling bertentangan telah dilaporkan ke PHPUnit.
Sebuah solusi adalah meminta PHPUnit menyatakan bahwa output yang diharapkan kosong (ketika ada output) yang akan memicu output yang tidak diharapkan untuk ditampilkan.
memberi:
Pastikan untuk menonaktifkan pernyataan lain yang Anda miliki untuk pengujian karena mungkin gagal sebelum pernyataan keluaran diuji (dan karenanya Anda tidak akan melihat output).
sumber
Coba gunakan
--debug
Berguna jika Anda mencoba untuk mendapatkan jalur yang benar ke file data include atau source.
sumber
Ini bukan bug, tapi sangat disengaja. Taruhan terbaik Anda adalah menulis ke file log dari beberapa jenis dan ekor log untuk melihat hasilnya.
Jika Anda mencoba untuk TEST output, periksa ini .
Juga:
sumber
Saya beruntung dengan VisualPHPUnit , dan itu membantu menampilkan output, antara lain.
sumber
Anda harus benar-benar memikirkan niat Anda: Jika Anda memerlukan informasi sekarang saat debugging untuk memperbaiki tes, Anda akan memerlukannya lagi minggu depan ketika tes pecah.
Ini berarti bahwa Anda akan selalu membutuhkan informasi ketika tes gagal - dan menambahkan a
var_dump
untuk menemukan penyebabnya terlalu banyak bekerja. Alih-alih memasukkan data ke dalam pernyataan Anda.Jika kode Anda terlalu rumit untuk itu, pisahkan sampai Anda mencapai tingkat di mana satu pernyataan (dengan pesan khusus) memberi tahu Anda cukup untuk mengetahui di mana itu rusak, mengapa dan bagaimana cara memperbaiki kode.
sumber
Di laravel 5 Anda dapat menggunakan dump (), Dump konten dari respons terakhir.
memberi
sumber
Cukup gunakan flag --verbose saat menjalankan phpunit .
Keuntungan dari metode ini adalah bahwa Anda tidak perlu mengubah kode tes, Anda dapat mencetak string, var_dump adalah apa pun yang Anda inginkan selalu dan itu akan ditampilkan di konsol hanya ketika verbose mode diatur.
Saya harap ini membantu.
sumber
Untuk beberapa kasus, seseorang dapat menggunakan sesuatu seperti itu untuk mengeluarkan sesuatu ke konsol
sumber
Meretas, tetapi berfungsi: Lempar pengecualian dengan hasil debug sebagai pesannya.
Hasil:
sumber
Ini diambil dari PHPUnit Documents tentang Jadwal .
Ini akan memungkinkan Anda untuk membuang informasi kapan saja selama siklus hidup pengujian phpunit.
Cukup ganti
__METHOD__
dalam kode di bawah ini dengan apa pun yang Anda ingin hasilkanContoh 4.2: Contoh menunjukkan semua metode templat yang tersedia
sumber
Saya mengeluarkan Testresult saya berbasis HTML, dalam hal ini sangat membantu untuk menyiram konten:
Ada Metode PHP kedua
yang belum saya coba.
sumber
PHPUnit menyembunyikan output dengan
ob_start()
. Kami dapat menonaktifkannya sementara.sumber
Saya harus mengubah kode sumber agar kode ini berfungsi sehingga Anda perlu menambahkan URL untuk repo bercabang ini ke komposer karena ini akan berfungsi
sumber
Berikut adalah beberapa metode yang berguna untuk mencetak pesan debug di PHPUnit 4.x:
syslog(LOG_DEBUG, "Debug: Message 1!");
Contoh yang lebih praktis:
Memanggil
syslog()
akan menghasilkan pesan log sistem (lihatman syslog.conf
:).Catatan: tingkat Kemungkinan:
LOG_DEBUG
,LOG_INFO
,LOG_NOTICE
,LOG_WARNING
,LOG_ERR
, dllDi macOS, untuk melakukan streaming pesan syslog secara realtime, jalankan:
fwrite(STDERR, "LOG: Message 2!\n");
Catatan:
STDERR
Konstanta tidak tersedia jika membaca skrip PHP dari stdin . Ini solusinya .Catatan: Alih-alih
STDERR
, Anda juga dapat menentukan nama file.file_put_contents('php://stderr', "LOG: Message 3!\n", FILE_APPEND);
Catatan: Gunakan metode ini, jika Anda tidak memiliki definisi
STDERR
konstan .register_shutdown_function('file_put_contents', 'php://stderr', "LOG: Message 4!\n", FILE_APPEND);
Catatan: Gunakan metode ini, jika Anda ingin mencetak sesuatu di bagian paling akhir tanpa mempengaruhi tes.
Untuk membuang variabel, gunakan
var_export()
, misalnya"Value: " . var_export($some_var, TRUE) . "\n"
.Untuk mencetak pesan di atas hanya selama mode verbose atau debug, lihat: Apakah ada cara untuk mengetahui apakah --debug atau --verbose diteruskan ke PHPUnit dalam pengujian?
Meskipun jika menguji output adalah bagian dari pengujian itu sendiri, periksa: halaman Testing Output docs.
sumber
Jika Anda menggunakan Laravel, maka Anda dapat menggunakan fungsi logging seperti info () untuk masuk ke file log Laravel di bawah penyimpanan / log. Jadi itu tidak akan muncul di terminal Anda tetapi di file log.
sumber