Testler uzun zaman aldığında bagaj nasıl sabit tutulur?


9

Üç set test takımımız var:

  • Çalıştırmak için sadece birkaç saat süren "küçük" bir süit
  • Birden fazla saat süren, genellikle her gece (gece) koşan "orta" bir süit
  • Çalıştırılması bir hafta + süren "büyük" bir süit

Bir sürü daha kısa test paketimiz var, ama burada onlara odaklanmıyorum.

Mevcut metodoloji, bagajı her taahhütten önce küçük süiti çalıştırmaktır. Daha sonra, orta süit her gece çalışır ve eğer sabah ortaya çıktıysa, dünün taahhütlerinin hangisinin suçlanacağını, testleri yapan geri alma ve yeniden denemeyi izole etmeye çalışıyoruz. Büyük süit için benzer bir işlem, sadece gece frekansı yerine sadece haftalık olarak yapılır.

Ne yazık ki, orta süit oldukça sık başarısız oluyor. Bu, bagajın genellikle kararsız olduğu anlamına gelir, bu da değişiklik yapmak ve bunları test etmek istediğinizde son derece sinir bozucudur. Bu sinir bozucu çünkü bagajdan kontrol ettiğimde, istikrarlı olduğundan emin değilim ve bir test başarısız olursa, benim hatam olup olmadığını kesin olarak bilemiyorum.

Benim sorum şu, bu tür durumları gövdeyi her zaman en iyi durumda bırakacak şekilde idare etmek için bilinen bir yöntem var mı? örneğin, "her gece geçtiğinde bagajı periyodik olarak güncelleyecek özel bir ön taahhüt şubesine giriş".

SVN gibi merkezi bir kaynak kontrol sistemi veya git gibi dağıtılmış bir sistem olması önemli midir?

Bu arada, sınırlı bir şeyleri değiştirme yeteneğine sahip bir genç geliştiriciyim, sadece yaşadığım bu acıyı halletmenin bir yolu olup olmadığını anlamaya çalışıyorum.


6
Hangi yazılım üzerinde çalıştığınız hakkında hiçbir fikrim yok, ancak çalıştırılması saatler süren küçük bir test paketi bazı WTF. Daha hızlı çalışırlarsa bu daha kolay olurdu, testlerinizi hızlandırmanın bir yolu yok mu?
Benjamin Bannier

2
bagajın dengesiz olmasıyla ilgili bu kadar "sinir bozucu" olan nedir? Biliyor musun bilmiyorum, ama en popüler dallanma stratejilerinden birine dengesiz gövde
gnat

1
Bir test paketini optimize etmenin birçok yolu vardır (diğer yazılımlar gibi). Sizin neden bu kadar uzun sürdüğüne dair hiçbir fikrim yok, ancak örneğin test ortamının bazılarını yeniden kullanabilir veya çalışırken daha iyi algoritmalar / veri yapıları kullanabilirsiniz (profil oluşturma yardımcı olur). Ayrıca, hiç kimsenin temsili örnekleri tanımlamak için zaman ayırmadığı ve olası her giriş / çıkışı bir referansa karşı test ettiğiniz olabilir. Yapı sisteminiz kod testi bağımlılıklarını kodlamanıza izin verir, böylece tam seti çalıştırmanız gerekmez. Ve bunun senin sorunuz olmadığını biliyorum, bu yüzden bir yorum yaptım, bir cevap değil.
Benjamin Bannier

1
... hmm, daha iyi seçeneğiniz, hata nedenini bulmanın daha kolay olması için testleri ve uygulama günlüğünü iyileştirme olasılığı yüksektir. Bu şekilde, kimin, ne zaman ve neden belirli kod satırını değiştirdiğini arayan "dedektif soruşturmaları" üzerindeki çabaları boşa harcamak yerine hatanın nedenini bulup düzeltmek gerekir ...
gnat

1
@honk Bazı testlerin yapılması çok uzun sürüyor. Veri toplama ekipmanı üreten bir şirkette çalışıyorum ve "kısmi" test çalışmamız yaklaşık bir saat sürüyor. Testlerin çeşitli ölçüm türleri yapması gerekir ve bu sadece zaman alır.
Velociraptors

Yanıtlar:


1

İstikrarsızlığın temel nedenini düzeltmenin tek yolu, kodu, diğer cevapların önerdiği gibi, değişikliklerin daha izole olması için ayırmaktır.

Bununla birlikte, bireysel bir geliştirici olarak, kişisel olarak çalışmanız için daha kararlı bir yapı istiyorsanız, bu çözülmesi nispeten kolaydır. Bahşişten çıkmak yerine, sadece gece boyunca test paketini geçen son yapıyı çalışma ağacınıza çekersiniz. Her değişiklik için özellik dalları oluşturabilirseniz, son kararlı yapıdan dallanır.

Evet, ağacınız birkaç gün geride kalacak, ancak çoğu zaman önemli değil. Kararlı yapıya karşı çalışmanızı yapın, böylece değişikliklerinizin herhangi bir testi kırmış olduğunu bilirsiniz, daha sonra check-in yapmadan önce en son sürüme güncelleyin ve normal entegrasyonunuzu yapın. Daha sonra check-in yaptıktan sonra tekrar son kararlı yapıya geri dönün.

Yine de dağınık entegrasyon çalışması yapmak zorundasınız, ancak bu yöntemle ilgili sevdiğim şey, entegrasyon çalışmasını benim için daha uygun bir zamana ayırması ve uygun olmadığında geliştirme için istikrarlı bir kod tabanı vermesidir. Yapımın başkasınınkine göre kırılmasına neden olan değişikliklerim olduğunda çok daha iyi bir fikrim var.


1
Dallardan -1 çalışma uygulanabilir bir seçenektir, ancak test önerisi olmadan önerilmesi, yarardan daha fazla zarar verebilir. Sadece testler, belirli bir proje için uygulanabilir olup olmadığını gösterebilir. Örneğin, yaklaşık 2 yıl önce yaptığım bir projede, böyle bir test dallardan çalışmanın dengesiz gövdeye kıyasla ~ 7 kat daha fazla çaba harcadığını gösterdi
gnat

Teşekkürler Karl! Öğrenmeyi umduğum şey bu olmasa da, eldeki sorunu çözmeme yardımcı olabilecek çok pratik bir yaklaşım. Ve bagajın birkaç gün arkasında çalışmanın nadiren entegrasyon sorunlarına neden olacağını kabul ediyorum.
Meşe

12

Bunu önlemek için çalışıyorum biliyorum, ama burada gerçek bir fikir kod temeli ile bir şey ciddi yanlış olduğunu fark etmektir: sadece kod istikrarlı olduğundan emin olmak için bir hafta sürer testleri tam bir paketi çalıştırmak gerekir!

Bu sorunu çözmenin en avantajlı yolu, kod tabanınızı ve testlerinizi (bağımsız) alt birimlere ayırmaya başlamaktır.
Bunun büyük avantajları var:

  • Bu birimlerin her biri için testler daha hızlı çalışacaktır (sadece daha azı vardır) ve bağımsız veya aşağı akış birimlerinden birinde bir şeyler ters giderse kırılmazlar.
  • Başarısız bir test, sorunun kaynağını bulmayı çok daha kolaylaştıracak belirli bir birime işaretlenecektir.
  • Farklı ünitelerin VCS konumlarını ayırabilirsiniz, böylece "kararlı" dalınız, her bir ünitenin başarıyla test edilmiş en son yapısının bir seçim karışımı olabilir, böylece bozuk bir ünite veya iki "kararlı" versiyonunuzu dengede tutmaz .

VCS yapınızın flipside yönetimi daha karmaşık hale gelecektir, ancak tam bir hafta boyunca tam testiniz için sanırım acı çekebilirsiniz!

Yine de bir şekilde "istikrarlı" ve "geliştirme" dalları stratejisini kullanmanızı öneriyorum, ancak bununla ilgili birçok yol var ve kuruluşunuz için en uygun olanı seçebilirsiniz (sabit revizyonlara sahip meta havuzlar her birim için ayrı depolar, kararlı bir dal ve bir dev dal, özellik dalları ....)


1
Büyük testin bir atom testi olduğunu söylemedim, bir test takımı . Tek bir geliştirici X elementinde bir değişiklik yaptığında, hangi test paketinden geldiklerine bakılmaksızın X ile ilgili testleri yürütür. Bu, bir yerdeki bir değişikliğin beklenmedik bir şekilde başka bir yeri etkilemediğinden emin olmak için yürütülen haftalık teste ek olarak yapılır. Ancak ilginç bir noktaya dikkat edin ki, en azından bir şekilde bu şekilde ayırmak, belirli modüllerin testlerini hızlandırmaya yardımcı olurken, riski kabaca aynı seviyede tutar.
Meşe

2
@oak - Peki, bir şekilde tüm paketi çalıştırırsanız kod IS IS aslında kodun kararlı olduğundan emin olmanın tek yolu, ama iyi bir noktaya değindin, bu yüzden cevabımı düzenledim.
Joris Timmermans

4
Derleyicilerimiz için, bazılarının çalıştırılması birkaç gün süren büyük testsuitlerimiz var ve bunun C ++ derleyicisi kadar karmaşık yazılımlar için nadir olduğunu düşünmüyorum. Bu paketin neyin "kararlı" olarak kabul edileceğini tanımlaması değil, aksine her gün bunları test etmenin imkansız olduğu milyonlarca farklı kod üretme köşesi vardır.
JesperE

1
@JesperE - büyük test paketi "kararlı" değil, devasa bir akıl sağlığı testi ise anlaşılabilir bir durumdur. Ben tam paketi (hatta orta paketi) çok sık başarısız beklemem.
Joris Timmermans

1

SVN için, "ön taahhüt" gibi bir şey bilmiyorum. Test başarısız olduğunda taahhütler ve geri dönüşler üretmenin muhtemel olduğunu düşünüyorum. Doc-brown'un dediği gibi, geçici bir dalda çalışmanın ve daha sonra gövdeyle birleştirmenin tek yolu.

Git veya mercurial gibi dağıtılmış bir tane kullanarak, bunun mümkün olacağını düşünüyorum. Bir "test" deposu ve "kararlı" bir depo kullanma. Test temsilcisini itiyorsunuz, her gece test ediyorsunuz ve her şey yolunda giderse, testten dengeye doğru itersiniz. Aksi takdirde, test temsilcisini geri alırsınız. Testten kararlı hale getirdiğinizde sürüm geçmişinin nasıl görüneceğinden biraz emin değilim, ancak bunu yaparken kırık geri dönen şeyleri hariç tutmak mümkün. Önce biraz deneme yapmak en güvenli olanıdır.

Bir alternatif, her bir kişinin yerel bagajını her gece test etmek olacaktır. Daha sonra, testi geçen kişilerin sabahları merkezi sunucuya itmelerine izin verilir.


1

IMHO'nun kullandığınız VCS ile bir ilgisi yok. Bir "test altında" dalı kullanmak, merkezi veya dağıtılmış VCS ile de gerçekleştirilebilen bir çözelti olabilir. Ama dürüst olmak gerekirse, durumunuzdaki en iyi şeyin orta test paketini (en önemli testleri içerdiği görülüyor) optimize etmeye çalıştığını düşünüyorum, böylece çok daha hızlı çalışır ve böylece ön-taahhüt için kullanabilirsiniz testler, tıpkı sizin "küçük süitiniz" ile şimdi yaptığınız gibi.


Çoğunlukla burada metodoloji soruyorum - yani böyle bir durumla başa çıkmanın ortak bir yolu var mı? En azından bu tartışma uğruna, testlerin zaten bulunduklarından daha iyi hale getirilemeyeceğini varsayalım.
Meşe

@Oak: Buradaki biri (siz?) Cevabımı oyladı - ama bazen duymak istemediğiniz şeyler yardımcı olacak tek şeydir. Sorunuzun altındaki tartışmada gördüğünüz gibi, diğerleri de aynı şeyi önerdi, bu yüzden önerim o kadar da kötü görünmüyor.
Doc Brown

+1, bu doğru cevap. OP'nin asıl sorusu "Yardım, boktan boğuluyorum, kendime yardım etmek için hangi metodolojiyi kullanabilirim?" ve cevap, gerçekten metodolojinin endişelenmeniz gereken şey olmadığıdır.
MrFox

1

Başarısız ortam testleri: Çoğu zaman aynı testlerin başarısız olduğu doğru mu?

Bir arıza varsa, her zaman başarısız olan ilgili testler var mı?

Doğruysa: Belki sıklıkla başarısız olan bazı orta düzey testleri seçebilir (her hata sınıfı için bir test) ve bunları küçük kümede gerçekleştirebilirsiniz.

Testlerin çoğu gerçek bir veritabanı kullanan entegrasyon testleri mi? Eğer öyleyse bunları sahte bir veritabanına sahip bir unittest ile değiştirmek mümkün mü?


1

Testlerinizin daha hızlı yapılmasını sağlamalısınız, bu çemberin karesini almanın başka bir yolu yoktur.

Sorunu düşünün: Kontrol ettiğinizde çalışma kodunuz olduğundan emin olmak istiyorsunuz. Elbette, taahhütleri geciktirebilir ve serbest bırakılmadan önce dallanma yapabilirsiniz, ancak bu yalnızca sorunun başlamasını entegrasyona kadar geciktirir. Olduğu gibi, her birleşmeden sonra bir hafta sürecek olan süiti çalıştırmanız gerekecek mi? Metodoloji çözüm değildir, çözüm tamamen tekniktir.

İşte önerim:

1) Testleri mümkün olduğunca atmomik hale getirin ve ortamın yeniden kullanımını en üst düzeye çıkarın.

2) Onları çalıştırmak için bir test-suite çiftlik alın. 8 büyük modül yerine 50 ile bitiriyorsanız, bir grup Amazon EC2 spot örneğini döndürebilir ve tüm paketi paralel olarak çalıştırabilirsiniz. Bunun biraz paraya mal olacağından eminim, ancak büyük miktarda geliştirici zamanından tasarruf edecek.


0

Sorunuzda aldığınız anahtar şey, tüm taahhütlerin testleri geçmesi gerektiğidir. Bu takip edilmesi hoş bir kural olsa da, bir anlam ifade ediyor gibi görünse de, bazen pratik değildir. Davanız bir örnektir (MadKeithV bir noktaya işaret etse de) ve VCS dalını tutmayı hayal edebiliyorum, böylece geliştiriciler arasında yeterli işbirliği yoksa bozulmamış zor olabilir.

Gerçekte istediğiniz, hangi taahhütlerin başarılı veya başarısız olduğunu bir şekilde bilmek. Önerdiğiniz gibi bir "taahhüt öncesi şube" işe yarayacaktır, ancak geliştiricilerin taahhütte bulunduklarında ekstra çaba göstermeleri gerekebilir; bu da satmak zor olabilir.

Daha kolay olabilen benzer bir yaklaşım, bagajı insanların istedikleri gibi kırılması için terk etmek ve kırık olmayan taahhütler için bir şubeye sahip olmaktır. Otomatik bir komut dosyası, gövdeye yapıldıklarında taahhütlerden geçebilir, testleri test edebilir ve geçtiklerinde şubeye ekleyebilir.

Ya da saçma bir şekilde basit olabilirsiniz ve bir metin dosyasındaki geçiş işlemlerini listeleyen bir komut dosyasına sahip olabilirsiniz (bu, sürüm kontrollü olabilir veya olmayabilir).

Ya da (ağacın herhangi bir yerinden) test etmek için dalların / revizyonların taleplerini kabul eden ve bunları test eden ve geçtiklerinde gövdeye (veya başka bir şubeye) teslim eden bir parti sistemine sahip olun.

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.