Nasıl bir miras projesi bir test çerçeve uygularım

10 Cevap php

Yani, PHP ve JavaScript ile yazılmış bu büyük proje var. Sorun bu kod bazı küçük kısmını değiştirerek üzgün ve muhtemelen diğer bölümleri bir sürü kıracak kadar büyük ve unmaintainable hale gelmiş olmasıdır.

Ve ben (diğerleri her gün bu işaret, Nitekim olarak) kendi kodu test gerçekten kötüyüm bir gerçeği biliyorum. Hangisi daha zor projeyi sürdürmek için yapar.

Projenin kendisi o kadar karmaşık ya da karmaşık değildir. Daha o karmaşık yapar artık yerleşik yoludur. Biz test yaparken takip için herhangi bir önceden tanımlanmış kuralları veya listeleri yok. Ve bu genellikle böcek ve mutsuz müşterilerinin çok sonuçlanır.

Yani, biz ofiste bu tartışmaya başladı ve cehennem gibi geliştirmek ve belki de (hemen hemen her zaman her zaman düzeltme böcek olmak biter olan) daha sonra test etmek yerine, test odaklı geliştirme kullanmaya başlayan fikir geldi.

Bu arka plan sonra, ben yardıma ihtiyacım şeyler aşağıdaki gibidir

  1. How do you implement a test framework into a already existing project (that is 3 years in the making, and counting)?

  2. What kind of frameworks are there for testing? I figure I'll need one framework for the Javascript- and one for the PHP code.

  3. Whats the best approach to testing the gui?

Bazı notlar. Daha önce Unit Testing hiç kullanmadım, bu yüzden bu benim için gerçekten keşfedilmemiş bir bölge olduğunu.

Thanks in advance Patrik

10 Cevap

, G'day

Edit: Ben sadece olarak da kullanılabilir "The Art of Unit Testing" ilk bölümde aracılığıyla hızlı bir göz yaşadım a free PDF de book's website . Bu size bir birim test yapmak için çalışıyoruz ne iyi bir bakış atacağız.

Ben bir xUnit tipi çerçeve kullanmak için gidiyoruz varsayarak yaşıyorum. Bazı başlangıç ​​üst düzey düşünceler şunlardır:

  1. Edit: Herkes iyi bir birim testi oluşturur ne kadar anlaşması olduğunu emin olun. Ben iyi bir başlangıç ​​noktası olarak yukarıdaki bakış bölümünü kullanarak öneririm ve gerekirse oradan alır. Ne bir "iyi" birim test farklı bir anlayışa sahip iken insanlar ünite testleri birçok oluşturmak için heyecanla kaçıp düşünün. Bu korkunç olurdu Eğer ünite testleri% 25 vs, vs,, kullanışlı tekrarlanabilir, güvenilir olmadığı gelecekte ortaya için.
  2. Bir seferde küçük kod parçalarını kapsayacak şekilde test eklemek. Yani mevcut kod tabanı için test eklemek için bir tek, yekpare bir görev oluşturmak kalmamasıdır.
  3. yeni testler yazılı yeni kod eklenir emin olmak için herhangi bir mevcut süreçleri değiştirmek. Bu birim testleri için yeni işlevler sağlanmalıdır kod inceleme sürecinin bir parçası olun.
  4. yeni testler varlığını göstermek ve hata olmadığını kanıtlamak için oluşturulan emin olmak için mevcut herhangi bir hata düzeltme süreçleri uzatmak. N.B. Bu sorun düzeltildi ve bu faktörlerin bir kombinasyonu ile sabit varlık değildir sadece tek bir yama olduğunu doğrulamak için yine hata tanıtmak için aday düzeltme geri alma unutmayın.
  5. Eğer testlerin sayısını kurmak şey kontrol için gece regresyon testleri olarak yayınlanmaya başlaması için başlangıç ​​olarak Edit: yeni işlevler tarafından kırıldı.
  6. all mevcut testlerin ve aday düzeltmeye gözden geçirme süreci için giriş kriter başarılı bir çalışma yapmak.
  7. Edit: yeni testlerin oluşturulması kolaylaştırmak için test türleri bir katalog, yani testi kod parçalarını tutarak başlar. Simidini zaman yeniden icat sense. Yok Kod tabanının bir bölümünde bir dosyayı açarken test etmek için yazılmıştır birim test (ler) / kod tabanının farklı bir parçası farklı bir dosya açar test kodu yazılır birim test (ler) benzer olacak olan . Catalogue these to make them easy to find.
  8. Yalnızca varolan bir sınıf için birkaç yöntem değiştirerek nerede Edit:, sınıf için testler komple set tutmak için bir test paketi oluşturun. Sonra sadece bu test paketine değiştiriyorsunuz yöntemleri için ayrı testler ekleyin. Ben şimdi PHPUnit gibi bir xUnit çerçevesini kullanarak olacak varsayarak kulüpler olarak bu xUnit termonology kullanır.
  9. örneğin test suit ve testlerin adlandırma için standart bir kuralı kullanabilirsiniz hangi testSuite_classA sonra test__test_function gibi bireysel testleri içerecektir. Vb, örneğin, test_fopen_bad_name ve test_fopen_bad_perms, Bu kod tabanı etrafında hareket eden ve diğer insanların testleri bakarken gürültüyü en aza indirir. Ayrıca onlar testleri kendileri gibi daha ilginç şeyler üzerinde çalışmak için kendi zihin boşaltarak ilk etapta kendi testlerini isim gelip insanlara yardım daha sonra yararı vardır.
  10. Edit: i bu aşamada TDD kullanmak olmaz. Eğer üzerinde çalıştığınız sınıfları kapsayacak yeni testSuites eklemek gibi her yerde başarısız testler olacak şekilde değişiklikler yerdesiniz önce tanımı gereği, TDD mevcut tüm testleri gerekir. Eğer bir sürü gürültü testleri başarısız olduğu için test sonuçlarında meydana alamadım bu yüzden yerine yeni Testsuite eklemek ve gerektiği gibi bireysel testleri ekleyin. Yishai işaret gibi, zaman içinde bu noktada öğrenme TDD görevi ekleyerek gerçekten sizi yavaşlatacaktır. Biraz boş zamanınız olduğunda yapılması gereken bir görev olarak TDD öğrenme koydu. O kadar da zor değil.
  11. Bunun bir sonucu olarak Testsuite var ama testler henüz sınıfındaki diğer üye fonksiyonları kapsayacak şekilde yazılmış değil nerede bu mevcut sınıfların takip etmek için bir aracı gerekir. Eğer test kapsamı delikleri vardır nerede takip edebilirsiniz bu şekilde. Ben hiçbir test anda mevcut sınıfları ve belirli üye fonksiyonların bir listesini oluşturabilir burada yüksek düzeyde bahsediyorum. Testler ve testSuites için standart bir adlandırma kuralı büyük ölçüde burada size yardımcı olacaktır.

Ben onları düşünüyorum ben daha fazla puan ekleyeceğiz.

HTH

Kendinize bir kopyasını Working Effectively with Legacy Code almalısınız. Bu size test yazılı değil koduna testleri tanıtmak için ne kadar iyi rehberlik verecektir.

TDD harika, ancak değişiklik tanıtan sırasında yaptığınız değişiklikler, mevcut gerekli davranışı değiştirmek yok emin olmak için sadece test altında mevcut kod koyarak ile başlamak gerekiyor.

Ancak, şimdi TDD tanıtan geri dönmeden önce testleri güçlendirme çünkü, hatta yalnızca değişiyor alanda, bir sürü sizi yavaşlatacak basit alır önce karmaşık almak için gidiyor.

Sadece diğer mükemmel cevaplar eklemek için, ben tek seferde% 0 dan% 100 kapsama gidiyor gerçekçi olduğunu kabul ediyorum - ama size gereken kesinlikle add unit tests every time you fix a bug.

Böceklerle ve mutsuz müşterilere oldukça çok olduğunu söylüyorlar - Ben genel olarak bu uygulama çok daha kolay arıza giderme süreci içine sıkı TDD birleşmeyle ilgili çok olumlu olurdu. Gerçekten düzeltilmesi gereken orada bir hata varsa, tüm sonra, o zaman çeşitli amaçlara hizmet üreten bir test oluşturmak:

  • Bu gerçekten bir sorun olduğunu göstermek için bir minimum test durumda olması muhtemeldir bulunuyor
  • Lütfen değişiklikleri o sabit varsa (şu anda başarısız) testi raporlanan sorunu vurgular güvenle, emin bileceksiniz
  • Bu sonsuza gelecekte yinelenen bu aynı sorunu önleyecek bir regresyon testi olarak duracak.

Varolan bir projeye testleri Tanıtımı zor ve uzun bir süreç olması muhtemeldir, ama sabitleme böcek olarak aynı anda bunları yapıyor bunu yapmak için böyle ideal bir zamandır (yavaş yavaş bir "normal" bir anlamda testleri tanıtan paralel) o olur Bu şansı ve hata raporları limonata yapmak için değil bir utanç. :-)

Bir planlama açısından bakıldığında, ben üç temel seçenek olduğunu düşünüyorum:

  1. ünite testleri ile kod güçlendirme için bir döngü almak
  2. ünite testleri ile kod güçlendirme ekibin parçası tayin
  3. Eğer kod üzerinde çalışmak gibi kademeli birim testleri tanıtmak

İlk yaklaşım, iyi bir yeri uzun süre tahmin daha sürebilir, ve görünür verimlilik bir darbe vuracaktır. Eğer kullanıyorsanız, size lazım olacak buy-tüm paydaşların. Ancak, süreci kickstart için kullanabilirsiniz.

İkinci yaklaşım ile sorun kodlama ve test yazarlar arasında bir ayrım yaratmak olmasıdır. Kodlayıcılar Test bakım için herhangi bir mülkiyet hissetmezsiniz. Ben bu yaklaşım kaçınarak değer olduğunu düşünüyorum.

Üçüncü yaklaşım en organik olduğunu ve gidip gelen test odaklı geliştirme içine alır. Bu biriktirmek için birim testlerin yararlı bir vücut için biraz zaman alabilir. Size yazma testleri iyi almak için zaman verdiğini test birikiminin yavaşlığı aslında bir avantaj olabilir.

Her şeyi kabul, ben 3 yaklaşmak için bir taahhüt ardından yaklaşımın 1 ruhu mütevazı bir sürat, tercih düşünüyorum.

Birim test genel ilkeleri için ben Gerard Meszaros tarafından kitap xUnit Test Patterns: Refactoring Test Code öneririz.

Kullanmış olduğunuz PHPUnit iyi sonuçlar ile. PHPUnit, diğer JUnit kaynaklı projeler gibi, test edilecek kod sınıfları halinde organize gerektirir. Proje nesne yönelimli değilse, o zaman fonksiyonları içine olmayan usul kodu üstlenmeden başlamak gerekir, ve işlevleri sınıflara edeceğiz.

Ben görüntü bu çerçeveler de kodu (en azından) çağrılabilir fonksiyonları değilse tam şişmiş nesnelerin içine yapılandırılmış olmasını gerektirir ki ama ben şahsen, bir JavaScript çerçeve kullanılmaz ettik.

Iyi QA içgüdüleri ile bir programcı tarafından yazılmış bir kontrol listesi sadece iyi çalışır halde test GUI uygulamaları için, Selenium kullanarak yararlanabilir. Ben MediaWiki'yi veya favori Wiki motorunu kullanarak kontrol listeleri ve ilgili proje belgeleri saklamak için iyi bir yer olduğunu tespit ettik.

Eğer tür bazı yeni katı çerçeve parçaları ile eski kodu yeniden başlatmak için bir çerçeve uygulayan çoğu karmaşık bir görev olduğunu. O eski parçalar çerçeve ile iletişim kurmak için başlamalıdır. Eski parçalar, bazı geri aramalar ve returnstates almalıdır eski parçalar daha sonra bir şekilde kullanıcıya işaret olmalı ve aslında aniden test 2. sistemleri var.

Eğer size uygulama kendisi bu karmaşık olmadığını söylüyorlar ama eğer nedeniyle uygulamayı yeniden inşa etmek için daha iyi bir seçenek olabilir test eksikliği haline gelmiştir. Test için Zend gibi bazı ortak çerçeveler koyun, baştan başlamak için yararlı olmadığını test framework gereksinimleri için takım elbise ve karar olmadığını öğrenmek, ihtiyaçlarınızı toplamak.

Ben birim test çok emin değilim, ama NetBeans yerleşik bir birim test paketi vardır.

Kod gerçekten dağınık ise, herhangi bir birim test yapmak çok zor olacağını mümkündür. Sadece yeterince gevşek bağlı ve yeterince iyi tasarlanmış bileşenler ünitesi kolayca test edilebilir. Ancak, fonksiyonel test sizin durumunuzda uygulamak çok daha kolay olabilir. I Selenium bir göz alarak öneriyoruz. Bu çerçevede, aynı anda GUI ve arka uç test etmek mümkün olacak. Ancak, büyük olasılıkla, bu birim test ile de size olabildiğince böcek yakalamak yardımcı olmayacaktır.

Belki bu liste yeniden yapı her şey sizin ve arkadaşları yardımcı olacaktır:

  1. (http://en.wikipedia.org/wiki/Unified%5FModeling%5FLanguage) istisnaları tasarım ve işlemek için, UML kullanın
  2. Eğer mücadele etmeyecek şekilde iş akışı tasarımı, BPM kullanın (http://en.wikipedia.org/wiki/Business%5Fprocess%5Fmanagement)
  3. Ayrıca javascript backends destek php çerçeveler listesini alın (örn. Zend jQuery ile)
  4. Bu çerçeveler karşılaştırın ve proje desgin ve daha önce kullanılan kodlama yapısına en çok uyan birini almak
  5. Sen hata ayıklama ve test için ezComponents ve Dtrace gibi şeyler kullanmayı düşünmelisiniz edilebilir olmalıdır
  6. Değişikliklerden korkmayın ;)

STIQ: GUI testleri için, (Ignas R zaten işaret olarak) Selenium bakmak OR siz de bu araç bakmak isteyebilirsin isteyebilirsiniz.

İyi şanslar!

Kod tabanı kirli ve PHP Javascript ile davranış karışır özellikle Bazı durumlarda, otomatik test yapıyor, böyle iyi bir fikir olmayabilir.

Her doğumdan önce şeye (elle) yapılmalıdır testlerin (daha hızlı yapmak için bağlantılar ile) basit bir kontrol listesi ile başlamak daha iyi olabilir.

3 yaşında mayın tarlası kodlama yaparken, daha çok hata denetimi ile kendinizi korumak. Her durum için uygun hata mesajı yazarken harcanan 15 dakika kayıp olmayacaktır.

Köprüleme yöntemi kullanın: Bazı temiz sınıfları etrafında sarıcı fnew bir çağrı () ile çirkin uzun fonksiyonu kat (köprü), kat ve fnew hem çağrı ve sonucu karşılaştırmak, farklılıkları log, üretime kodu atmak ve balıklar için bekleyin . Bunu yaparken, her zaman sonucu (hatta sadece köprü, eski davranış hataları düzeltmek değil) değiştirmek için, üstlenmeden başka döngüsünü bir döngüsü kullanın.