PHP TDD ve / veya BDD durumu nedir?

9 Cevap php

Nasıl yaygın, desteklenen, gelişmiş PHP dünyada test ediyor? Java ile eşit mi? Orada Ruby / Rails ile? Ben Googled ve test çerçeveler var olduğunu buldum ama onlar yaygın kullanılan konum merak ediyorum.

Büyük PHP IDE dahili var mı testi Eclipse'in Java araçları ne şekilde koşucular veya NetBeans aletleri Ruby / Rails do? Test Rails gibi PHP'nin MVC çerçeveler içine inşa edilmiştir?

Ben işe bir grup onlar için bir PHP uygulaması geliştirmek için birini kiralamak istiyor çünkü ben soruyorum. Ben kalite ve ben bu şeyi desteklemek için çağrıda olabilir gibi bakım konusunda endişeliyim.

9 Cevap

Sırasıyla PHPUnit ve SimpleTest adında JUnit tarzı testi suit mevcuttur olgun, en az iki, stand-alone, vardır.

Bildiğim kadarıyla MVC çerçeveler gitmek, Symfony lime, Kod Ateşleyici bir unit_test kütüphanesi vardır ve CakePHP Yukarıda belirtilen SimpleTest dayanır adında kendi test çerçevesi vardır.

Ben Zend Studio PHPUnit testler için destek inşa biliyorum, ve herhangi bir iş akışı entegrasyonu mümkün yani PHPUnit ve SimpleTest hem komut satırı rayları var.

Bir geliştirici bunlardan yararlanmak istiyor ve akıllı mağazalar bunlardan yararlanmak yoksa araçları PHP dünyada vardır.

Uyarılar ders PHP şikayetler için par vardır. İki PHP topluluklar vardır; Yazılım oluşturmak için bir platform olarak PHP, ve bir web sunucusu, web tarayıcısı ve web üzerinde uygulama gibi şeyler üretmek için veritabanı ile etkileşim için bir yol olarak PHP. Daha az bir siyah beyaz bir şey ve daha bir süreklilik var; Daha fazla yazılım geliştirici yan birim test ve TDD üzerinde olanlar arasında desteklenen ve başka herhangi bir platformda olduğu kadar kullanılır. Arasında "Anlıyorum ama yine sonuç insanları alamadım bir sürü şeyler cobble", duyulmamış bulunuyor.

Etrafında yararlı bir test koşum almak zordur etrafında non-framework/custom-framework eski bir PHP kodu bir sürü var. PHP çalıştırmak için bir tarayıcı çevrenin varlığına bağlıdır desen kendini kolayca katıyor. Benim kendi gözlemlerim dışında bu yedeklemek için herhangi bir kanıt yok, ama test umurumda PHP dükkanlar bir sürü test ilk, vb gerçek Birim Testi için bir yedek olarak (yani Selenyum) test kabulüne dayanarak sonunda . gelişme.

Özel durumda, sizin grup işe gidiyor geliştirici defol röportaj.

  1. Ne kullandıkları birim test çerçevesi isteyin

  2. , Genel anlamda, onlar yeni bir özellik ve destekleyici testler geliştirilen bir zaman gerçek bir dünya örneği açıklamak için isteyin

  3. Onların testlerle durumu çözmek için ne yaptığını başarısız olduğu ve genel anlamda, bir zaman gerçek bir dünya örneği açıklamak için isteyin

Sen onlar tanımlamak ve genel kod test kendi bilgi tartışırken nasıl rahat daha fazla ilgi için gidiyoruz belirli bir durumda daha az ilgileniyoruz.

Ben xunit tarzı araçları ile bir proje TDD zaman, ben zorluk doğru yerde kafamı alıyorum var. Ben bulmak Davranış Odaklı Kalkınma ya da için tasarlanmış araçları kullanarak "Specification by example" daha kolay do TDD right beni için yapar - yani tasarım odaklanarak, teşhir niyet ve describing behaviour in specific contexts . Not test.

O dedi, ben konuşma içine pecs tanıtmak istiyoruz. Proje sahasında benioku.

Pecs PHP 5.3, a la RSpec veya JSpec için küçük bir davranış odaklı kalkınma kütüphanedir.

Eğer daha iyisi JSpec veya kullanılmış ettiyseniz, Jasmine-BDD (JavaScript) davranışını açıklayan pecs tarzı gerçekten aşina olmalıdır. Ben bileşen seviyesi özellikleri için bu tarz büyük bulabilirsiniz. Eğer özellik düzeyi özelliklerinin (hikayeler ya da kullanıcı kabul testleri) düşünün için bir PHP araç arıyorsanız Behat.

Geri Pecs gitmek, burada pecs proje sitesinden derlediğimiz bir örnek:

describe("Bowling", function() {
  it("should score 0 for a gutter game", function() {
    $bowling = new Bowling();
    for ($i=0; $i < 20; $i++) {
      $bowling->hit(0);
    }
    expect($bowling->score)->to_equal(0);
  });
});

Evet bu bir PHP spec olduğunu. Yazar PHP 5.3 +, Lambdas ve kapanışları yeni hotness yararlanarak bu koparmak mümkün olduğu gibi pecs kaynağına bakarak, o görünüyor. Yani bu PHP

Ayrıca, Pecs PHPUnit veya SimpleTest kadar olgun değildir. Ancak, PHP toplumda BDD savunucuları mirası xunit test araçlarını kullanmak zorunda getirdiği karışıklık olmadan "örnek şartname" teşvik veya BDD Pecs gibi araçların gelişimini desteklemek gerektiğini düşünüyorum.

Bu gün ben PHP daha Python fazla çalışır. Ben yazılım için teknik özelliklere zanaat Pecs gibi olgun, toplum destekli aracı varsa Ancak, ben bir PHP proje almak dahaki sefere, ben son derece mutlu olacağım.

Alan zaten belirtildiği kütüphaneleri / çerçeveler ek olarak, Mod_perl'in Apache :: Testi faydalanmak, hangi ben ne bir koşum takımı olarak kullanabilirsiniz. Olabilir Bu beni çok sadece benim bırakma sürecine testleri entegre etmelerine olanak verir. Koşum kullanımları TAP çıkışı (Test şey Protocol) testleri geçmek olup olmadığını belirlemek için veya Test::Simple veya Test :: More (Perl gibi kütüphaneleri kullanılarak, başarısız ve PHP).

Out kutusunun Apache :: Test Perl ve PHP hem yazma testleri destekler. Benim kendi projelerinde, biraz aldı bit of trickery ve gerçekten bu çalışma için okuma bir sürü, ama bir uygulama Test::More in PHP yapılı-koşum. PHP ve Perl hem de yazılı tüm testleri çalıştıran tek bir komut ile yapılır ve yol boyunca herhangi bir arıza belirterek, Apache :: Test yakalanır olabildiğince iyi şekilde ne yanlış gitti.

Tüm bu konuda müthiş parçası hatta önceki iki test çerçeveler yanında phpunit, veya Basit-Testi kullanmak olabilir. Ilgili her kütüphanede testleri çalıştırarak, Testi PHP uygulanmasını :: (test stdout'ta tarafından, hatta Perl) Daha kullanabilir ve yorumlamak için koşum geri TAP tükürmek.

Apache::Test belgeleri ve mod_perl guide to running Apache::Test okumak emin olun. Ayrıca, ben makale here büyük bir yardım buldu.

Hızlı bir örnek olarak, (bağlantıları) sitenizdeki tüm sayfaları üzerinden çalışacak kod çok az hatlarında kurulum Perl bir test olabilir ve '200 OK' yanıtları ve don tüm sonucunu doğrulamak 't herhangi bir ayrıştırma hatası:

#!perl

use strict;
use warnings;

use Apache::Test qw(:withtestmore);
use Apache::TestRequest;
use Test::More;
use Test::WWW::Mechanize;
use WWW::CheckSite::Validator;
use WWW::CheckSite::Spider;

plan 'no_plan';

my $config = Apache::Test::config();
my $host = "http://". Apache::TestRequest::hostport($config) || '';

my $s = WWW::CheckSite::Spider->new(
    uri => $host,
    ua_class => 'Test::WWW::Mechanize',
);
my $m = $s->current_agent;

while (my $page = $s->get_page) {
    is($m->status(), "200", $m->uri() ." retrieved successfully.");
    $m->content_lacks("Parse Error", $m->uri() ." does not contain syntax errors.");
}

Ben Behat / Mink ile inanılmaz bir deneyim oldu http://behat.org

Diğerleri herhangi bir php framework kullanıyorsanız BDD gitmek için en iyi yoldur eğlenceli ya da deneyim değil bir birim test platformu olarak php ile katılıyorum

Bir repo aracı inşa büyük engel oldu ama biz inanılmaz bir tasarım ve regresyon test aracı olarak Mink Selenyum Webdriver başına sunucu kavanoza Behat kullanmak mümkün olduğu gibi besteci başımı sarma. Biz bir Jenkins sunucuda bizim CakePHP uygulaması karşı regresyon paketi çalıştırmak için kullanılır ama o kadar çok yeterli "hızlı başarısız" olduğunu kanıtladı

Now our workflow goes like this: Create story in gherkin refine story write feature and stub out any new step defs begin coding php solution to test Then at the end we have a working feature or bug fix with a bdd test covering it

Biz kurulum kurulum Behat bir çalışma ile bir Ubuntu VM ve her iş istasyonu için kopyaladı. Biz süreci içine pişmiş. Biz sadece aşağı çekme değişiklikler testleri sonra yeni şeyler kodlama başlamadan çalıştırın.

Biz otomatik olarak mysql dökümlerini çalıştırın ve üstlenmeden kod bir esinti yaptı her özelliğin önce bunları yüklemek için bir shell script yazdım.

The Mink WebAssert class gives you all the assertions you need to validate behavior The regular session / CommonContext classes are great for using css or xpath.

Java ile Capybara / WebDriver kullanılan ve daha önce projelerini Raylar ve kurulum havai / öğrenme eğrisi Behat göre çok yüksek olduğunu bulduk.

On a past project, I've used the PHPUnit, and it has left me wanting. PHPUnit + Command line running of the tests, made it so that too much time was spent coding the tests, wasn't fast enough, and really seemed to constrain the style of the code in a way that I didn't like (Objects were easier to test, so it seemed to kinda favor objects).

Selenyum konuştuğumuz ama oyuna almak için çevresinde var hiç bir çözüm oldu, ve ben gerçekten çıkış seviyesi test bu tür yararlanmıştır düşünüyorum.

Biz yazılım revize oldum gibi bu son proje üzerinde kurşun programcı daha fonksiyonel bir programlama yaklaşımı almıştır. Ben TDD yoluyla kodlamak istiyorum sözü, o bir günde özel bir çözüm çırpılmış ya da ben bana PHPUnit olarak kullanmak için de etkili olmuştur düşünün az. Buna ek olarak, o gerçekten Object Oriented vs Fonksiyonel Programlama soru hakkında gözlerimi açtı.

İlk proje, zemin katta içinde, sıfırdan başlamış, Object Oriented kodlama, büyük Birim Test Çerçevesi, yekpare oldu ve hızla batağa saplanmış. İkinci proje, 5 yıllık bir geçmişi ve eski kod ile de kurulan CMS yazılımı, henüz fonksiyonel programlama paradigması ve basit bir test çerçevesi (biz aslında sık sık php assert kullanımı yapılmış) yerine karmaşıklığı büyümeye basit yapılmış olsun.

İkinci proje de, Selenyum uygulama noktasına asla var (ve ben hala faydalı olacağını düşünüyorum), ama fonksiyonel programlama yaklaşımı daha kolay in-kod test ile başa çıkmak için yapılmış.

Her iki dilde BDD özelliklerini test Michael Booth'un karşılaştırması:

http://mechanicalrobotfish.com/posts/117-ruby-vs-php-bdd-beauty-contest-no-contest

PHP BDD araçları ve kültür bu noktada gelişmemiş olduğu sonucuna varmıştır.

Kesinlikle ya bilgisi açısından, bir Ruby programcı mevcut ne ile karşılaştırılabilir bir şey yok (kitaplar, videolar, makaleler, blog gönderileri) veya araçları (RSpec, olmalıydın, Factory Girl, Mocha, Salatalık).

Ben neler sergiyi "araştırma aşamasında" olduğum sürece, bu soruyu buldu ve. Ben sadece http://cukes.info/ "Hıyar" denilen Ruby on için bir şey keşfetti

Bu aslında en azından bildiğim kadarıyla benim seyahatlerinde gördüğümüz gibi Ruby 'hikaye odaklı kalkınma' ve büyük olasılıkla fonksiyonel test alanda bir altın standarttır. (Yanılıyorsam beni düzeltin uzmanlar, böylece ben, kamuya oraya bu kadar koymak)

Salatalık dilin bir örnek olarak, çok yakından SQL benzer bir şey var. BUT daha insan okunabilir gibi görünüyor. Cukes ön sayfasında dil bu gibi görünüyor:

 Scenario: Add two numbers
      Given I have entered 50 in the calculator
      And I have entered 70 in the calculator
      When I press add
      Then the result should be 120 on the screen

Yukarıda bir test olarak derlemek ve çalıştırmak olacaktır.

Şimdi PHP hakkında soruyu yanıtlarken noktasına tüm önsöz bulunuyor - BDD & TDD.

Yukarıdaki yorumlar yankılanan olarak, PHPUnit birim test sağlayacak ve bu blog yazısına göre: http://sebastian-bergmann.de/archives/738-Support-for-BDD-and-Stories-in-PHPUnit-3.3.html da "hikaye tarzı" BDD test destekler.

Ile ilgili yukarıdaki cevaba genişletmek için "SimpleTest" yukarıda belirtilen, ST sistemine sahip bir PHPUnit SELENIUM tarayıcı otomasyon http://seleniumhq.com (avantajı için bir uzantısı olurken, tarayıcı otomasyon için tarayıcı nesne sınıfının inşa SimpleTest vs Selenyum) SimpleTest olmaz ise Selinium herhangi bir on-sayfa javascript çalışacak olmasıdır.

Ben o aylarda, kişisel araştırma ve yukarıdaki teknolojileri ile deneme yanılma eller bir dizi sonuç olarak size bu bilgileri yararlı bulacağını umuyorum. Netleştirmek ve yukarıda benim anlayış geliştirmek orada uzmanlar varsa, ben görüşlerinizi bekliyoruz.

  • Alex.

BDD test için şimdi ben geliştiriyorum "Spectrum" çerçeve: https://github.com/mkharitonov/spectrum

Sen PHPStorm kontrol etmek isteyebilirsiniz. Ben IDE içinde phpunit kullanmak testi koşucular gibi.