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.

Alex
sumber
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
Alex
sumber
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()
{
}
iamtankist
sumber
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 !!

Mahmoud Zalt
sumber
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
Farid Movsumov
sumber
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

Jignesh Joisar
sumber
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

Sektus
sumber
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);
 }
Connectify_user
sumber
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

Tony
sumber
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
Amit Kumar
sumber
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.

Schleis
sumber
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!

Channaveer Hakari
sumber
0

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

Filter di atas akan menjalankan testMethod sendirian.

Umair Anwar
sumber