Test / QA süreciyle entegre Git dallanma stratejisi


131

Geliştirme ekibimiz GitFlow dallanma stratejisini kullanıyor ve bu harika oldu!

Yakın zamanda yazılım kalitemizi iyileştirmek için birkaç test görevlisi işe aldık. Buradaki fikir, her özelliğin bir test cihazı tarafından test edilmesi / KG'nin yapılması gerektiğidir.

Geçmişte geliştiriciler, ayrı özellik dallarındaki özellikler üzerinde çalışırlar ve tamamlandığında bunları tekrar dalda birleştirirler develop. Geliştirici, çalışmasını o featuredalda kendisi test edecektir . Şimdi testçilerle bu soruyu sormaya başladık

Test cihazı yeni özellikleri hangi dalda test etmelidir?

Açıkçası, iki seçenek var:

  • bireysel özellik dalında
  • üzerinde developşube

Geliştirme Dalında Test Etme

Başlangıçta, bunun kesin bir yol olduğuna inandık çünkü:

  • Özellik, developgeliştirme başladığından beri şubeye birleştirilen diğer tüm özelliklerle test edilir .
  • Herhangi bir çakışma daha sonra tespit edilebilir
  • Testçinin işini kolaylaştırır, developher zaman yalnızca bir şubeyle ( ) ilgilenir . Geliştiriciye hangi dalın hangi özellik için olduğunu sormasına gerek yoktur (özellik dalları, ilgili geliştiriciler tarafından özel olarak ve ücretsiz olarak yönetilen kişisel dallardır)

Bununla ilgili en büyük sorun şudur:

  • developŞube böcek kirlenmektedir.

    Test kullanıcısı hatalar veya çakışmalar bulduğunda, bunları geliştiriciye geri bildirir, bu sorunu geliştirme dalında düzeltir (özellik dalı birleştirildikten sonra terk edilmiştir) ve sonrasında daha fazla düzeltme gerekebilir. Birden çok alt dizinin tamamlanması veya birleştirilmesi (bir dal, develophataları düzeltmek için daldan yeniden oluşturulursa ), developmümkünse , özelliğin daldan geri alınmasını çok zor hale getirir . Şubeye developfarklı zamanlarda birleşen ve sabitlenen birden çok özellik vardır . Bu, developdaldaki özelliklerden yalnızca bazılarıyla bir sürüm oluşturmak istediğimizde büyük bir sorun yaratır.

Özellik Dalında Test Etme

Bu yüzden tekrar düşündük ve özellikleri özellik dallarında test etmemiz gerektiğine karar verdik. Test etmeden önce, developdaldan özellik dalına yapılan değişiklikleri birleştiriyoruz (dalı yakalayın develop). Bu iyi:

  • Hala özelliği diğer ana akım özelliklerle test ediyorsunuz
  • Daha fazla geliştirme (örneğin, hata düzeltme, anlaşmazlığı çözme) developşubeyi kirletmeyecektir ;
  • Tam olarak test edilip onaylanana kadar özelliği serbest bırakmamaya kolayca karar verebilirsiniz;

Ancak bazı dezavantajlar var

  • Test uzmanı, kodu birleştirmek zorundadır ve herhangi bir çakışma varsa (büyük olasılıkla), geliştiriciden yardım istemelidir. Test uzmanlarımız test konusunda uzmanlaşmıştır ve kodlama yeteneğine sahip değildir.
  • bir özellik, başka bir yeni özellik olmadan test edilebilir. Örneğin, Özellik A ve B aynı anda test altındadır, iki özellik birbirinden habersizdir çünkü ikisi de developdalda birleştirilmemiştir . Bu develop, her iki özellik yine de geliştirme şubesiyle birleştirildiğinde , şubeye karşı tekrar test etmeniz gerekeceği anlamına gelir . Ve bunu gelecekte test etmeyi unutmamalısın.
  • Özellik A ve B hem test edilmiş hem de onaylanmışsa, ancak birleştirildiğinde bir çakışma tespit edilirse, her iki özelliğin geliştiricisi de bunun kendi hatası / işi olmadığına inanır çünkü özellik dalı testi geçmiştir. İletişimde fazladan bir yük vardır ve bazen çatışmayı çözen kişi hüsrana uğrar.

Yukarıdaki hikayemiz. Sınırlı kaynakla, her şeyi her yerde test etmekten kaçınmak isterim. Bununla başa çıkmanın daha iyi bir yolunu hala arıyoruz. Diğer takımların bu tür durumlarla nasıl başa çıktığını duymak isterim.


5
Bu soru , bir programlama problemiyle değil, bir geliştirme süreciyle uğraştığı için Programcılar için daha uygun görünüyor . Birisi onu taşıyabilir mi?


2
Modelimiz tamamen aynı. QA ekibinizin, özellik dallarıyla ilgili sorunları, sahadaki sorunlardan veya UAT süreci sırasındaki sorunlardan (eğer varsa) farklı şekilde nasıl rapor ettiğini öğrenmekle ilgileniyorum. Atlassian JIRA kullanıyoruz ve ikisi için farklı bir iş akışımız var.
void.pointer

2
Şu anda aynı şeye karar vermek. Ayrıca, ortamımız bir java yay uygulaması olduğundan, test ortamının oluşturulması ve devreye alınması yaklaşık 20 dakika sürer. Mutlu biri benim sahip olduğum aynı şüpheleri sordu.
digao_mb

İlk dezavantaj, özellik dalları üzerinde test etme sürecine özgü değildir. Github Enterprise ve Bitbucket gibi araçlar, çekme talepleri için onay gerektirebilir ve QA'dan sorumlu kişi, geliştiriciye, geliştirme için birleştirme özgürlüğüne sahip oldukları sinyalini onaylayabilir.
Derek Greer

Yanıtlar:


102

Bunu yapma şeklimiz şudur:

En son geliştirme şube kodunu üzerlerinde birleştirdikten sonra özellik dallarını test ediyoruz. Bunun ana nedeni, bir özellik kabul edilmeden önce şube kodunu "kirletmek" istemememizdir. Bir özelliğin test edildikten sonra kabul edilmemesi durumunda, ancak cehennem olacak geliştirmede zaten birleştirilen diğer özellikleri yayınlamak istiyoruz. Geliştirme, bir sürümün yapıldığı bir daldır ve bu nedenle, yayınlanabilir bir durumda olması daha iyidir. Uzun versiyon, birçok aşamada test etmemizdir. Daha analitik olarak:

  1. Geliştirici, her yeni özellik için bir özellik dalı oluşturur.
  2. Özellik dalı, geliştiricinin test etmesi için her taahhütle TEST ortamımıza (otomatik olarak) dağıtılır.
  3. Geliştirici dağıtımla bittiğinde ve özellik test edilmeye hazır olduğunda, özellik dalındaki geliştirme dalını birleştirir ve TEST'deki en son geliştirme değişikliklerinin tümünü içeren özellik dalını dağıtır.
  4. Test cihazı TEST üzerinde test eder. İşi bittiğinde hikayeyi "kabul eder" ve geliştirmede uzun metraj dalını birleştirir. Geliştirici daha önce geliştirme dalını özellik üzerinde birleştirdiğinden, normalde çok fazla çakışma beklemiyoruz. Ancak, bu durumda geliştirici yardımcı olabilir. Bu zor bir adım, bence bundan kaçınmanın en iyi yolu, özellikleri olabildiğince küçük / belirli tutmaktır. Farklı özelliklerin er ya da geç, bir şekilde birleştirilmesi gerekir. Elbette bu adımın karmaşıklığında takımın büyüklüğü de rol oynuyor.
  5. Geliştirme dalı da (otomatik olarak) TEST üzerinde dağıtılır. Dalların oluşturduğu özellikler başarısız olsa bile geliştirme dalının asla başarısız olmaması gibi bir politikamız var.
  6. Bir özellik donmasına ulaştığımızda, geliştirmeden bir sürüm oluşturuyoruz. Bu, STAGING'de otomatik olarak dağıtılır. Üretim dağıtımından önce orada kapsamlı uçtan uca testler yapılır. (tamam belki biraz abartıyorum, çok kapsamlı değiller ama bence olmalılar). İdeal olarak beta test edenler / meslektaşlar, yani gerçek kullanıcılar orada test etmelidir.

Bu yaklaşım hakkında ne düşünüyorsunuz?


2
Bağımsız olarak test edilen özellik1 ve özellik2'nin birlikte kullanılmasının da iyi olduğundan nasıl emin olabiliriz (soruda belirtildiği gibi)?
Kumar Deepak

2
dolaylı olarak, birini ve sonra diğerini birleştirerek geliştiriyoruz. Yukarıdaki sürecin 4. adımıdır ve kronolojik sırayla yapılması gerekir. Dolayısıyla, özellik 2 birleştirilmeye hazırsa ancak özellik 1 zaten birleştirildiyse, özellik 2 geliştiricisi ve test edicisi, birleştirmelerinin çalışacağından emin olmalıdır.
Aspasia

1
Zaten bu git dallanma modeline göre iki özellik dalını birbiriyle birleştirmemeniz gerektiğini düşünüyorum .
Aspasia

1
6. adımda, özellikle geliştirilmek üzere taşınan birden çok özelliğin olduğu kriz zamanlarında, geliştirici özelliği olabildiğince geç özellik için birleştirilmesine rağmen, QA özellik dalında imzalandıktan sonra gerçekleşen önemsiz olmayan birleşmeler nedeniyle sorunlarla karşılaştık. Burada biraz daha ayrıntılı yorum yaptım: stackoverflow.com/a/25247382/411282
Joshua Goldberg

8
Her özellik dalı için eksiksiz bir TEST Ortamınız (DB, Sunucu, İstemci, vb.) Var mı? Veya Ortamı paylaşıyorlar ve sadece farklı adlara mı sahipler (ör. Uygulama-adı_ özelliği1- uygulama-adı_ özelliği2, vb.)
hinneLinks

41

Testten önce, geliştirme dalındaki değişiklikleri özellik dalına birleştiriyoruz

Hayır. Yapmayın, özellikle 'biz' QA testçisiyse. Birleştirme, potansiyel çatışmaları çözmeyi içerir; bu, en iyi şekilde geliştiriciler tarafından yapılır (kodlarını bilirler) ve (olabildiğince hızlı bir şekilde test etmeye devam etmesi gereken) QA testçisi tarafından değil.

Geliştiricinin , featureşubesinin üstünedevel bir yeniden ödeme yapmasını sağlayın ve bu featureşubeyi itin (bu, geliştirici tarafından en son develşube durumunun üzerinde derlendiği ve üzerinde çalıştığı onaylanmıştır ).
Bu şunlara izin verir:

Test uzmanı hatayı her algıladığında, bunu geliştiriciye bildirecek ve mevcut özellik dalını silecektir .
Geliştirici şunları yapabilir:

  • hatayı düzelt
  • Yakın zamanda getirilen bir geliştirme şubesinin üstüne yeniden ödeme (yine, kodunun diğer doğrulanmış özelliklerle entegre çalıştığından emin olmak için)
  • featuredalı itin .

Genel fikir: Birleştirme / entegrasyon bölümünün geliştirici tarafından yapıldığından ve testi KG'ye bıraktığından emin olun.


"Birleştirme kullanma, bunun yerine yeniden taban kullanma" mı diyorsun? Öyleyse, ikisi arasındaki farkla ilgili Git SSS göz önüne alındığında kafam karıştı: git.wiki.kernel.org/index.php/…
Vicki Laidler

1
@VickiLaidler evet, özellik dalı Kalite Güvencesi tarafından reddedilirse, geliştiricinin birleştirmesi değil yeniden temellendirmesi gerekir ( stackoverflow.com/a/804178/6309 )
VonC

1
@VonC Tamamen katılıyorum, ancak bazı sorunlar var: 1) Dalın silinmesi, Stash Çekme İstekleri gibi diğer araçları etkiler (dalın silinmesi PR'yi kapatır). Zorla itmeyi tercih edin. 2) Yaşamı boyunca iki kişinin birlikte çalıştığı büyük bir özellik şubesiyse, yeniden satış yerine birleşmeler tercih edilirdi. Sonunda yeniden başlatmak, birleştirme taahhütleri kaldırılacağı için çatışma kabusu yaratır ve kod bu birleştirme değişikliklerine
bağlıysa

1
Cevabıma geri dönüp baktığımda, daha temiz bir tarih için bir birleştirme değil, bir geri ödeme yapardım.
Aspasia

1
@Aspasia İyi puanlar. Daha fazla görünürlük için yanıta çekme istekleri ekledim.
VonC

12

En iyi yaklaşım sürekli entegrasyondur genel fikrin, özellik dallarını olabildiğince sık bir şekilde geliştirici dalında birleştirmek . Bu, birleştirme ağrılarının ek yükünü azaltır.

Mümkün olduğunca otomatik testlere güvenin ve derlemelerin Jenkins tarafından yapılan birim testleriyle otomatik olarak başlamasını sağlayın. Geliştiricilerin, değişikliklerini ana dalda birleştirerek tüm işi yapmalarını ve tüm kodları için birim testleri sağlamalarını sağlayın.

Test uzmanları / QA, kod incelemelerine katılabilir, birim testlerini kontrol edebilir ve özellikler tamamlandıkça regresyon paketine eklenecek otomatik entegrasyon testleri yazabilir.

Daha fazla bilgi için bu bağlantıya göz atın .


Git'te dallar + yeniden oluşturmayla yine de CI yapabilirsiniz.
void.pointer

9

"Altın", "gümüş" ve "bronz" dediğimiz şeyleri kullanıyoruz. Buna prod, evreleme ve qa denebilir.

Ben bunu eritme potası modeli olarak adlandırmaya geldim. Bizim için işe yarıyor çünkü işin iş tarafında kalite güvencesine büyük bir ihtiyacımız var, çünkü gereksinimler tekniklere karşı anlaşılması zor olabilir.

Bir hata veya özellik test edilmeye hazır olduğunda "bronz" durumuna geçer. Bu, kodu önceden oluşturulmuş bir ortama iten bir jenkins yapısını tetikler. Testçilerimiz (bu arada süper teknisyenler değil) sadece bir bağlantıya ulaştı ve kaynak kontrolü umurunda değil. Bu yapı aynı zamanda testleri de çalıştırır. Bu yapıda ileri geri gittik ve testler (birim, entegrasyon, selenyum) başarısız olursa kodu test \ qa ortamına gönderdik. Ayrı bir sistemde test ederseniz (biz buna lider diyoruz), değişikliklerin qa ortamınıza gönderilmesini önleyebilirsiniz.

İlk korku, bu özellikler arasında birçok çelişki yaşayacak olmamızdı. X özelliği, Y özelliği bozulmuş gibi görünmesini sağladığında gerçekleşiyor, ancak yeterince seyrek ve aslında yardımcı oluyor. Değişikliğin bağlamı gibi görünenin dışında geniş bir test alanı elde etmeye yardımcı olur. Çoğu zaman şans eseri, değişiminizin paralel gelişimi nasıl etkilediğini öğreneceksiniz.

Bir özellik QA'yı geçtikten sonra onu "gümüş" e veya aşamalandırmaya taşırız. Bir yapı çalıştırılır ve testler tekrar çalıştırılır. Haftalık olarak bu değişiklikleri "altın" veya ürün ağacımıza aktarıyoruz ve ardından üretim sistemimize yerleştiriyoruz.

Geliştiriciler, değişikliklerine altın ağaçtan başlar. Teknik olarak, yakında yukarı çıkacağı için sahneden başlayabilirsiniz.

Acil durum düzeltmeleri doğrudan altın ağacına yerleştirilir. Bir değişiklik basit ve QA için zorsa, doğrudan gümüşe gidebilir ve bu da test ağacına giden yolu bulacaktır.

Piyasaya sürüldükten sonra, sırf her şeyin senkronize olmasını sağlamak için altından (ürün) bronz (test) değişikliklerini yapıyoruz.

Hazırlama klasörünüze girmeden önce yeniden temel almak isteyebilirsiniz. Test ağacını zaman zaman temizlemenin onu temiz tuttuğunu gördük. Özellikle bir geliştirici ayrılırsa, test ağacında özelliklerin terk edildiği zamanlar vardır.

Büyük çoklu geliştirici özellikleri için ayrı bir paylaşılan depo oluşturuyoruz, ancak hazır olduğumuzda bunu aynı şekilde test ağacında birleştiriyoruz. İşler QA'dan geri dönme eğilimindedir, bu nedenle değişiklik kümelerinizi izole tutmak önemlidir, böylece evreleme ağacınızı ekleyebilir ve sonra birleştirebilir / sıkıştırabilirsiniz.

"Pişirme" de güzel bir yan etkidir. Bazı temel değişiklikleriniz varsa, bir süre oturmak istersiniz, bunun için güzel bir yer vardır.

Ayrıca, geçmiş sürümleri korumadığımızı da unutmayın. Geçerli sürüm her zaman tek sürümdür. Öyle olsa bile, testçilerinizin veya topluluğunuzun katkıda bulunan çeşitli şeylerin nasıl etkileşime girdiğini görebileceği bir usta pişirme ağacınız olabilir.


1

Tek başına manuel teste güvenmem. Her özellik dalının testini Jenkins ile otomatik hale getirirdim. Tüm tarayıcılar için Linux ve Windows üzerinde Jenkins testleri çalıştırmak için bir VMWare laboratuvarı kuruyorum. Gerçekten harika bir çapraz tarayıcı, çapraz platform test çözümü. Selenium Webdriver ile işlevselliği / entegrasyonu test ediyorum. Selenyum testlerim Rspec altında çalışıyor. Ve onları jRuby tarafından Windows'a yüklenmek üzere özel olarak yazdım. Jasmine altında Rspec ve Javascript testleri altında geleneksel birim testleri çalıştırıyorum. Phantom JS ile başsız testler kurdum.


1

Şirketimizde çevik geliştirmeyi kullanamıyoruz ve her iş değişikliği için onay gerekiyor, bu da birçok soruna neden oluyor.

GIT ile çalışma yaklaşımımız şudur;

Şirketimizde "Git Flow" u uyguladık. JIRA kullanıyoruz ve sadece onaylı JIRA Biletlerinin üretime geçmesi gerekiyor. Test onayı için ayrı bir Test Şubesi oluşturduk.

Bir JIRA Biletlerini işleme adımları şunlardır:

  1. Develop-Branch'tan yeni bir Şube oluştur
  2. Özellik Dalında Kod Değişikliklerini Yapın
  3. Test / QA Dalındaki Değişiklikleri Öne Çıkarın
  4. İşletme onayından sonra değişikliği özellik dalından geliştirmeye çekiyoruz
  5. Geliştirme, bir sürümde sık sık gider ve ardından nihayet ana daldır

Her talebi kendi özelliğine bölmek, yalnızca onaylanan değişikliklerin üretime geçmesini sağlar.

İşlemin tamamı şuna benzer: görüntü açıklamasını buraya girin

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.