Phpunit ile tek test yöntemi nasıl çalıştırılır?


335

Ben adında tek bir test yöntemini çalıştırmak için mücadele ediyorum testSaveAndDropdosyada escalation/EscalationGroupTest.phpile phpunit. Aşağıdaki kombinasyonları denedim:

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

Her durumda , dosyadaki tüm test escalation/EscalationGroupTest.phpyöntemleri yürütülür. Bunun yerine sadece bir yöntem nasıl seçilir?

Sınıfın adı EscalationGroupTestve sürümü phpunit3.2.8'dir.


Test sınıfınızın sınıf adı nedir?
sectus

Yanıtlar:


459

Aşağıdaki komut testi tek bir yöntemde çalıştırır:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

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

Phpunit'in daha yeni sürümleri için sadece:

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

1
EscalationGroupTest yazmak gerekli miydi? Bunun faydası nedir?
mujaffars

2
Tamam anladım sınıf adı
mujaffars

15
Test yöntemini testSaveAndDrop * adıyla da çalıştıracaktır (örnek: testSaveAndDropSomething). Tam olarak testSaveAndDrop'u çalıştırmak için --filter '/ :: testSaveAndDrop $ /' kullanın
Farid Movsumov

1
@mujaffars Şüphe duyuyorum, "Anladım" boşluk nedeniyle php geçerli bir tanımlayıcı değil.
Jon McClung

2
Bu şimdi çalışmıyor. Sadece phpunit --filter methodName path/to/testing/file, hayır ClassName .
CJ Dennis

213

Testi ek açıklama olarak işaretlemeyi tercih ederim

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

Sonra ile çalıştırın

phpunit --group failing

Komut satırında tam yolu belirtmenize gerek yoktur, ancak kodu dağıtmak için değil, taahhüt etmeden önce bunu kaldırmayı hatırlamanız gerekir.

Tek bir test için birkaç grup da belirtebilirsiniz

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

4
Bu yöntemi seviyorum, ek açıklama ile birden fazla grup atamak mümkün mü? @group failing, Integration
Baş döndürücü Bryan Yüksek

4
Evet tabi ki. Ancak virgülle ayrılmış değil. Bunu göstermek için cevabı düzenledi.
iamtankist

Ben daha iyi bu yöntemi seviyorum ... referans için phpunit.xml <groups> elemanı da testleri filtrelemek için kullanılabilir ... altında aşağıdaki gibi bir şey kullanın <phpunit>: <groups><include> <group> başarısız </ grup > </include> </groups>
Nicolas Galler

2
Ama soru şuydu - TEK testi yapmak. Ayrıca - başarısız adlı grup kullanabileceğiniz en kötüsüdür. Çünkü bazı testler başarısız olduktan sonra phpunit --group başarısız gruplara grup vermeden çalıştırılamıyor çalıştırabilirsiniz. Kafa karıştırıcı.
Rafał Mnich

En iyi cevap! bir @dependsdiğeri olması durumunda TEK testi yoktur, bu nedenle birbirine bağlı tüm testleri kesin olarak belirlemeniz ve böylece @groupek açıklamayı kullanmanız gerekir .
centurian

117

İşte daha genel bir cevap:

Yöntem adının benzersiz olduğundan eminseniz, yalnızca yöntem adına göre filtreleyebilirsiniz (bu benim için çalışır)

phpunit --filter {TestMethodName}

Ancak dosya yolunu / referansını da belirtmek daha güvenlidir

phpunit --filter {TestMethodName} {FilePath}

Misal:

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

Hızlı not: Eğer adlandırılmış bir fonksiyonum varsa testSaveve testSaveAndDropcommand kullanarak adlandırılmış başka bir fonksiyonun phpunit --filter testSaveda çalışacağını testSaveAndDropve başlayan başka bir fonksiyonun testSave*garip olduğunu fark ettim !


4
Hiç garip değil, temelde bir alt dize eşleşmesi. Bu davranışı istiyorsanız, dize belirtecinin sonunu kullanın:/testSave$/
Christian

Yalnızca dosya yolunu belirtmek isterseniz, bu dosyadaki tüm sınamaların çalışması gerekir?
still_dreaming_1

48

Aşağıdaki komut tam olarak testSaveAndDrop testi yürütecektir .

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

4
Benim için çalışmadı. Kullanma \byerine $nihayet hile yaptı: --filter '/::testSaveAndDrop\b/'.
Joe

1
Her iki yöntem adı da sona erdi '/::testSaveAndDrop\b/'ve '/::testSaveAndDrop$/'benim için böyle çalıştı phpunit --filter ClassName::methodName$ve phpunit --filter ClassName::methodName\b(Linux'ta)
Valentine Shi

22

laravel'de birçok yoldan phpunit testi yapmak için ..

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

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

tek sınıf testi için:

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

tek test yöntemi için:

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

ad alanındaki tüm sınıflardan çalıştırma testleri için:

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

Daha fazla yol için çalışma testi bakın daha


21

Yani, böyle bir şey

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

Olmadan =ve ile'

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


Hayır, bu işe yaramıyor. Sınıftaki tüm testler EscalationGroupTestişleniyor.
Alex

Halen 9 testin tamamı yürütülüyor. phpunit sürüm 3.2.8
Alex

2
Taşı --filterdosya önce ve doğru şeyler çalışmalıdır.
Schleis

PHPUnit 4.8.10
Asaph için

Bu bana No tests executed!PHPUnit 4.8.35 @Schleis veriyor Komutu tam olarak nasıl değiştirdin?
Andru

14
  • Bunu laravel kök dizininde kullandığım proje kök dizininizde çalıştırın.

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

Özel yöntem adıyla örnek.

 /** @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');
  }

Test anahtar kelimesi ile örnek

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

1
Tabii ben şimdi bir acemi gelecekteki yanıtlar üzerinde daha spesifik bir kod çalışacağız
Connectify_user

7

Netbeans'deyseniz test yöntemini sağ tıklayıp "Odaklanmış Test Yöntemini Çalıştır" ı tıklayabilirsiniz.

Odaklanmış Test Yöntemi menüsünü çalıştır


7

Bunu deneyebilirim, tek Test senaryoları çalıştırabiliyorum

phpunit tests/{testfilename}

Örneğin:

phpunit tests/StackoverflowTest.php

Laravel 5.5'te tek Test senaryoları çalıştırmak istiyorsanız

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

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

Örneğin:

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

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

Soru, tek test yöntemi (sınıf değil) nasıl yürütüleceğiydi
Aleksei Akireikin

4

Testlerinizin tümünün çalıştırılmasının nedeni --filter, dosya adından sonra bayrağa sahip olmanızdır . PHPUnit seçenekleri hiç okumuyor ve tüm test senaryolarını çalıştırıyor.

Yardım ekranından:

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

Bu nedenle --filterargümanı @Alex ve @Ferid Mövsümov cevaplarında belirtildiği gibi istediğiniz test dosyasından önce taşıyın . Ve sadece çalıştırmak istediğiniz testi yaptırmalısınız.


Bunun asıl soruya hitap ettiğini düşünmüyorum ... Birçok birim testi içeren bir dosyadaki testlerden sadece birini çalıştırmam gerekiyordu ve filtreleri kullanan diğer iki cevap benim için çalıştı
jfoo

@jfoo OP komutlarıyla ilgili sorunlardan biri, --filterseçeneğin dosya adından sonra olmasıydı. Diğer iki cevap doğru cevaba sahipti, ancak filtrenin neden uygulandığını göstermedi.
Schleis


1

Yine de partiye geç kaldım. Ama kişisel olarak tüm satırı yazmaktan nefret ediyorum.

Bunun yerine, .bash_profile dosyasında aşağıdaki kısayolları kullanarak yeni bir takma ad ekledikten sonra .bash_profile dosyasını kaynakladığınızdan emin olun, aksi takdirde çalışmaz.

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

Kullanımı:

puf function_name

puf filename

Eğer kullanırsanız Visual Studio Kodu Eğer testler esinti yapmak için aşağıdaki paketi kullanabilirsiniz.

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

Daha sonra tuş takımını ayarlarda ayarlayabilirsiniz. MAC'imde Command + T bağlama kullanıyorum .

Şimdi imlecinizi herhangi bir fonksiyonun üzerine getirdikten sonra anahtar bağlamayı kullandıktan sonra otomatik olarak bu tek testi çalıştıracaktır.

Tüm sınıfı çalıştırmanız gerekiyorsa , imleci sınıfın üzerine getirin ve ardından anahtar ciltlemeyi kullanın.

Başka şeyleriniz varsa Terminal'e her zaman tweek yapın

Mutlu Kodlama!


0

Tek bir test yöntemi çalıştırmak için --filter kullanmalısınız php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

Yukarıdaki filtre yalnızca testMethod'u çalıştırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.