Bagaimana cara melewati tes di PHPunit?

89

Saya menggunakan phpunit sehubungan dengan jenkins, dan saya ingin melewati tes tertentu dengan mengatur konfigurasi di file XML phpunit.xml

Saya tahu bahwa saya dapat menggunakan di baris perintah:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

bagaimana cara menerjemahkannya ke file XML karena <filters>tag hanya untuk cakupan kode?

Saya ingin menjalankan semua tes selain testStuffThatAlwaysBreaks

Filype
sumber
1
KO: bagaimana memperbaiki tes? btw, hai dari welly ;-)
zerkms
Saya tidak menulis tes, itu adalah sesuatu yang tidak relevan, dan juga tidak ingin mengubah file inti
Filype
Anda pasti bisa melakukannya. Ini adalah persyaratan yang sangat aneh
zerkms
PS: Anda menyebutkan filter - tetapi itu tidak dapat membantu Anda, karena mengecualikan semua jalur. Jika tidak <exclude>- akan melakukan pekerjaan untuk Anda
zerkms
dapatkah Anda memposting file phpunit.xml.dist yang diusulkan?
Filype

Jawaban:

170

Cara tercepat dan termudah untuk melewati pengujian yang rusak atau Anda perlu melanjutkannya nanti adalah dengan menambahkan yang berikut ini ke bagian atas pengujian unit individual Anda:

$this->markTestSkipped('must be revisited.');
jsteinmann
sumber
Anda selalu dapat menambahkan direktori atau tes ke file konfigurasi xml, namun, jika ini adalah pengontrol atau serupa itu sebenarnya tidak terlalu praktis karena Anda mungkin memiliki lusinan tes lain dalam file itu. saya kira jika Anda tidak memiliki akses ke unit test, tidak yakin saya mengerti mengapa, maka Anda tidak punya pilihan lain selain mengecualikan.
jsteinmann
6
Karena merupakan metode statis (setidaknya di PHPUnit 3), dan beberapa kelas menggunakan akhir statis mengikat afaik, Anda harus menggunakan static::markTestSkipped('');bukan $this->. Ini akan menghasilkan peringatan dalam Versi PHP yang lebih baru. Tanda tangan: public static function markTestSkipped($message = '')
Daniel W.
Membutuhkan contoh yang lebih baik dari file pengujian unit lengkap. Bukan hanya cuplikan.
Ligemer
@Bayu_joo yang phpunit resmi pengguna memiliki contoh yang menunjukkan$this->markTestSkipped()
nulll
@nulll Anda dapat melihat di kode sumber 6,5 , markTestSkipped()masih merupakan metode statis.
Daniel W.
31

Jika Anda dapat menangani mengabaikan seluruh file maka

<?xml version="1.0" encoding="UTF-8"?>

<phpunit>

    <testsuites>
        <testsuite name="foo">
            <directory>./tests/</directory>
            <exclude>./tests/path/to/excluded/test.php</exclude>
                ^-------------
        </testsuite>
    </testsuites>

</phpunit>
zerkms
sumber
Inilah yang saya coba, masih dikatakan 893 tes tanpa <exclude>dan 893 tes dengan<exclude>
Filype
1
Tes membutuhkan waktu sekitar 20 menit untuk dijalankan, apakah ada cara mudah untuk melihat berapa banyak tes yang akan dijalankan? saat ini, saya harus menunggu sampai baris pertama selesai....... 63 / 893 ( 7%)
Filype
5
@Filype: Anda mungkin menentukan jalur yang salah. Ini bekerja dengan baik untuk saya. Tidak yakin apakah mungkin mendapatkan hitungan tes. PS: tes unit seharusnya tidak berjalan lama. Saya akan merekomendasikan penggunaan @groupanotasi dan tes terpisah menurut sifatnya
zerkms
21

Terkadang berguna untuk melewati semua tes dari file tertentu berdasarkan kondisi kustom yang didefinisikan sebagai kode php. Anda dapat dengan mudah melakukannya menggunakan fungsi setUp di mana makeTestSkipped berfungsi juga.

protected function setUp()
{
    if (your_custom_condition) {
        $this->markTestSkipped('all tests in this file are invactive for this server configuration!');
    }
}

your_custom_condition dapat dikirimkan melalui beberapa metode / properti kelas statis, konstanta yang ditentukan dalam file bootstrap phpunit atau bahkan variabel global.

Konrad Gałęzowski
sumber
Apakah Configkelas itu? Dimana saya menempatkannya?
kroni
@cronfy dapat berupa kelas yang dapat diakses cakupan global (pola desain Singleton / Register) atau bahkan variabel global yang ditetapkan dalam file bootstrap di phpunit. Pada dasarnya logikanya adalah: if ($ testsFromThisFileShouldBeSkipped) {$ this-> markTestSkipped (...); }
Konrad Gałęzowski
hapus persyaratan dan jawaban Anda akan langsung ... "markTestSkipped di dalam penyiapan untuk melewati seluruh file"
SparK
1
@SparK Saya mengerti maksud Anda tetapi saya menyediakan cara melewatkan bersyarat dari seluruh kelas tes. Saya telah mengubahnya sedikit, menghapus cara kustom saya dalam melakukannya demi aturan umum.
Konrad Gałęzowski