Bagaimana menjalankan metode uji tunggal dengan phpunit?


335

Saya berjuang untuk menjalankan metode uji tunggal yang disebutkan testSaveAndDropdalam file escalation/EscalationGroupTest.phpdengan phpunit. Saya mencoba kombinasi berikut:

phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=escalation/EscalationGroupTest.php::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=EscalationGroupTest.php::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=EscalationGroupTest::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=testSaveAndDrop

Dalam setiap kasus, semua metode pengujian dalam file escalation/EscalationGroupTest.phpdijalankan. Bagaimana cara memilih SATU metode saja?

Nama kelasnya EscalationGroupTestdan versi phpunit3.2.8.


Apa nama kelas dari kelas tes Anda?
sectus

Jawaban:


459

Perintah berikut menjalankan tes pada satu metode:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

phpunit --filter methodName ClassName path/to/file.php

Untuk versi phpunit yang lebih baru, itu hanya:

phpunit --filter methodName path/to/file.php

1
Apakah menulis EscalationGroupTest diperlukan? Apa gunanya?
mujaffars

2
Oke, saya mengerti itu adalah nama kelasnya
mujaffars

15
Ini akan menjalankan metode pengujian dengan nama testSaveAndDrop * (contoh: testSaveAndDropSomething) juga. Untuk menjalankan dengan tepat testSaveAndDrop gunakan --filter '/ :: testSaveAndDrop $ /'
Farid Movsumov

1
@mujaffars Saya ragu, "Saya mengerti" bukan pengidentifikasi yang valid di php karena spasi.
Jon McClung

2
Ini tidak berfungsi sekarang. Hanya saja phpunit --filter methodName path/to/testing/file, tidak ClassName .
CJ Dennis

213

Saya lebih suka menandai tes dalam anotasi sebagai

/**
 * @group failing
 * Tests the api edit form
 */
public function testEditAction()

Kemudian jalankan dengan

phpunit --group failing

Tidak perlu menentukan path lengkap di baris perintah, tetapi Anda harus ingat menghapus ini sebelum komit, bukan untuk mengacaukan kode.

Anda juga dapat menentukan beberapa grup untuk satu tes

/**
  * @group failing
  * @group bug2204 
  */
public function testSomethingElse()
{
}

4
Saya suka metode ini, apakah mungkin untuk menetapkan beberapa grup melalui anotasi? @group failing, Integration
Dizzy Bryan High

4
Ya tentu saja. Tetapi tidak dipisahkan koma. Mengedit jawaban untuk menggambarkan hal ini.
iamtankist

Saya suka metode ini lebih baik ... untuk referensi elemen <groups> di phpunit.xml juga dapat digunakan untuk memfilter pengujian ... gunakan sesuatu seperti ini di bawah <phpunit>: <groups><sertakan> <group> gagal </ grup > </include> </groups>
Nicolas Galler

2
Tetapi pertanyaannya adalah - untuk menjalankan tes TUNGGAL. Juga - grup bernama gagal adalah yang terburuk yang dapat Anda gunakan. Karena setelah beberapa tes gagal, Anda dapat menjalankan phpunit --group gagal menjalankan tes gagal tanpa memberi mereka grup. Ini membingungkan.
Rafał Mnich

Jawaban terbaik! tidak ada tes TUNGGAL dalam kasus itu @dependsdari yang lain sehingga Anda harus menentukan semua tes yang saling berhubungan dan dengan demikian menggunakan @groupanotasi.
centurian

117

Inilah jawaban yang lebih umum:

Jika Anda yakin nama metode itu unik, Anda hanya bisa memfilter menurut nama metode (ini cocok untuk saya)

phpunit --filter {TestMethodName}

Namun lebih aman untuk menentukan path / referensi file juga

phpunit --filter {TestMethodName} {FilePath}

Contoh:

phpunit --filter testSaveAndDrop reference/to/escalation/EscalationGroupTest.php

Catatan cepat: Saya perhatikan bahwa jika saya memiliki fungsi bernama testSavedan fungsi lain yang dinamai testSaveAndDropperintah phpunit --filter testSavejuga akan berjalan testSaveAndDropdan fungsi lain yang dimulai dengan testSave*, itu aneh !!


4
Sama sekali tidak aneh, pada dasarnya ini adalah pertandingan substring. Jika Anda menginginkan perilaku itu, gunakan token string:/testSave$/
Christian

Bagaimana jika Anda hanya ingin menentukan jalur file sehingga semua tes dalam file tersebut dapat dijalankan?
still_dreaming_1

48

Perintah berikut akan menjalankan tes dengan tepat testSaveAndDrop .

phpunit --filter '/::testSaveAndDrop$/' escalation/EscalationGroupTest.php

4
Tidak bekerja untuk saya. Menggunakan \bbukannya $akhirnya melakukan trik: --filter '/::testSaveAndDrop\b/'.
Joe

1
Kedua nama metode berakhir '/::testSaveAndDrop\b/'dan '/::testSaveAndDrop$/'bekerja untuk saya seperti ini phpunit --filter ClassName::methodName$dan phpunit --filter ClassName::methodName\b(di Linux)
Valentine Shi

22

untuk menjalankan tes phpunit di laravel dengan banyak cara ..

vendor/bin/phpunit --filter methodName className pathTofile.php

vendor/bin/phpunit --filter 'namespace\\directoryName\\className::methodName'

untuk tes kelas tunggal:

vendor/bin/phpunit --filter  tests/Feature/UserTest.php
vendor/bin/phpunit --filter 'Tests\\Feature\\UserTest'
vendor/bin/phpunit --filter 'UserTest' 

untuk metode uji tunggal:

 vendor/bin/phpunit --filter testExample 
 vendor/bin/phpunit --filter 'Tests\\Feature\\UserTest::testExample'
 vendor/bin/phpunit --filter testExample UserTest tests/Feature/UserTest.php

untuk menjalankan tes dari semua kelas dalam namespace:

vendor/bin/phpunit --filter 'Tests\\Feature'

untuk uji coba cara lebih lanjut lihat lebih banyak


21

Jadi, sesuatu seperti ini

phpunit --filter 'EscalationGroupTest::testSaveAndDrop' EscalationGroupTest escalation/EscalationGroupTest.php 

Tanpa =dan dengan'

https://phpunit.de/manual/3.7/en/textui.html


Tidak, ini tidak berhasil. Semua tes di kelas EscalationGroupTestsedang diproses.
Alex

Masih semua 9 tes sedang dijalankan. phpunit versi 3.2.8
Alex

2
Pindahkan --filterke sebelum nama file dan segala sesuatunya berfungsi dengan benar.
Schleis

Bekerja untuk saya di PHPUnit 4.8.10
Asaf

Ini memberi saya No tests executed!pada PHPUnit 4.8.35 @ Schleis Bagaimana tepatnya Anda mengubah perintah?
Andru

14
  • Jalankan ini di dalam direktori root proyek saya yang saya gunakan di direktori root laravel.

vendor/bin/phpunit --filter 'Your method name'

Contoh dengan nama metode khusus.

 /** @test //Initilize this for custom method name, without test keyword
  *  
  * Test case For Dashboard When User Not logged In it will redirect To login page
  */
  public function only_logged_in_user_see_dashboard()
  {
    $response = $this->get('/dashboard')
                   ->assertRedirect('/login');
  }

Contoh dengan kata kunci uji

/**
* A basic test example.
*
* @return void
*/
 public function testBasicTest()
 {
  $this->assertTrue(true);
 }

1
Tentu saya seorang pemula sekarang akan mencoba kode yang lebih spesifik pada tanggapan yang akan datang
Connectify_user

7

Jika Anda menggunakan netbeans, Anda dapat mengklik kanan pada metode pengujian dan klik "Jalankan Metode Tes Berfokus".

Jalankan menu Metode Tes Terfokus


7

Anda dapat mencoba ini, saya dapat menjalankan satu Uji kasus

phpunit tests/{testfilename}

Misalnya:

phpunit tests/StackoverflowTest.php

Jika Anda ingin menjalankan satu test case di Laravel 5.5 Coba

vendor/bin/phpunit tests/Feature/{testfilename} 

vendor/bin/phpunit tests/Unit/{testfilename} 

Misalnya:

vendor/bin/phpunit tests/Feature/ContactpageTest.php 

vendor/bin/phpunit tests/Unit/ContactpageTest.php

Pertanyaannya adalah bagaimana menjalankan METODE uji tunggal (bukan kelas)
Aleksei Akireikin

4

Alasan semua tes Anda dijalankan adalah karena Anda memilikinya --filter tanda setelah nama file. PHPUnit tidak membaca opsi sama sekali dan menjalankan semua kasus uji.

Dari layar bantuan:

 Usage: phpunit [options] UnitTest [UnitTest.php]
        phpunit [options] <directory>

Jadi pindahkan --filterargumen sebelum file tes yang Anda inginkan seperti yang disebutkan dalam @Alex dan @Ferid Mövsümov menjawab. Dan Anda seharusnya hanya memiliki tes yang ingin Anda jalankan.


Saya tidak berpikir ini menjawab pertanyaan aslinya ... Saya memiliki masalah yang sama yaitu harus menjalankan hanya satu tes dalam file yang berisi banyak tes unit, dan dua jawaban lain menggunakan filter bekerja untuk saya
jfoo

@ jfoo Salah satu masalah dengan perintah OP adalah bahwa --filteropsinya adalah setelah nama file. Dua jawaban lainnya memiliki jawaban yang benar tetapi tidak menunjukkan mengapa filter diterapkan.
Schleis


1

Saya terlambat ke pesta. Tetapi sebagai pribadi saya benci untuk menulis seluruh baris.

Sebagai gantinya, saya menggunakan cara pintas berikut dalam file .bash_profile pastikan untuk sumber .bash_profile file setelah menambahkan alias baru kalau tidak itu tidak akan berfungsi.

alias pa="php artisan"
alias pu="vendor/bin/phpunit" 
alias puf="vendor/bin/phpunit --filter"

Pemakaian:

puf function_name

puf filename

Jika Anda menggunakan Visual Studio Code Anda dapat menggunakan paket berikut untuk membuat tes Anda mudah.

Package Name: Better PHPUnit
Link: https://marketplace.visualstudio.com/items?itemName=calebporzio.better-phpunit

Anda kemudian dapat mengatur ikatan tombol di pengaturan. Saya menggunakan Command + T binding di MAC saya.

Sekarang setelah Anda meletakkan kursor pada fungsi apa pun dan kemudian menggunakan kunci yang mengikat maka secara otomatis akan menjalankan tes tunggal.

Jika Anda perlu menjalankan seluruh kelas maka tempatkan kursor di atas kelas dan kemudian gunakan kunci yang mengikat.

Jika Anda memiliki hal-hal lain maka selalu berhubungan dengan Terminal

Selamat Coding!


0

Anda harus menggunakan --filter untuk menjalankan metode pengujian tunggal php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

Filter di atas akan menjalankan testMethod sendirian.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.