Bir CI sunucusunda ünite testlerinin amacı nedir?


98

Bir CI sunucusunda neden birim testleri yaptınız?

Elbette, bir şeyin ustalaşması söz konusu olduğunda, bir geliştirici daha önce tüm ünite testlerini yapmış ve yeni kodlarında oluşabilecek hataları düzeltmiştir. Ünite test noktası bu değil mi? Aksi halde, sadece bozuk kod işlediler.


51
Geliştiricilerimizin ustalık yapmasına izin verilmez. Bir özellik dalına itiyorlar, CI sunucusu daha sonra master ile birleşiyor ve testler yapıyor. Eğer başarırlarsa, o zaman değişiklikler usta birleştirilir. Öyleyse, testlerin bozulmadığı kod usta olamaz ...
Örümcek Boris,

2
@BoristheSpider - gerçekten çok iyi bir iş akışı. masterher zaman aklı başında olmalı ve tercihen dahili KG ve test için her bir birime otomatik olarak bir hazırlık ortamına yerleştirilmelidir.
Per Lundberg,

130
“Elbette, bir şey ustalaşmaya karar verdiğinde, bir geliştirici daha önce tüm ünite testlerini yaptı ve yeni kodlarında oluşabilecek hataları düzeltti.” Hangi fantezi dünyasında yaşıyorsun?
jpmc26

5
Bazı endüstrilerde, önemli kısım yalnızca kod üzerindeki testleri çalıştırmak değil, ikili dosyalar üzerindeki testleri çalıştırmaktır . Testlerin CI çıkışında yapılması, teslim edilen ürünün çalıştığını garanti edebileceğiniz anlamına gelir; Önemsiz geliyor, ama bazen bunun bir etkisi olabilir (gördüğüm bir şaşırtmaca; karmaşık projelerde ya da garip bir şekilde kurulduğunda, şaşkın bir yapıda, temiz sürümde olmayan sorunlara neden olabilir).
anaximander,

5
“Elbette, bir şey ustalaşmaya başladığında, bir geliştirici daha önce tüm ünite testlerini yaptı ve yeni kodlarında oluşabilecek herhangi bir hatayı düzeltti.” ... ciddi olup olmadığından emin değil
chucksmash

Yanıtlar:


223

Elbette, bir şeyin ustalaşması söz konusu olduğunda, bir geliştirici daha önce tüm ünite testlerini yapmış ve yeni kodlarında oluşabilecek hataları düzeltmiştir.

Ya da değil. Bunun olmasının birçok nedeni olabilir:

  • Geliştiricinin bunu yapacak disiplini yok
  • Unuttular
  • Her şeyi yapmadılar ve tamamlanmamış bir taahhüt belirlediler (teşekkürler Matthieu M.).
  • Sadece bazı testler yaptılar, ama tüm süitleri değil (teşekkürler nhgrif )
  • Birleşmeden önce dallarında test yaptılar (teşekkürler nhgrif * 2)

Ancak asıl amaç testleri geliştirici makine olmayan bir makinede yapmak. Farklı şekilde yapılandırılmış olan.

Bu, testlerin ve / veya kodun bir geliştirici kutusuna özgü bir şeye (yapılandırma, veri, saat dilimi, yerel ayar, herhangi bir şekilde) bağlı olduğu sorunların tespit edilmesine yardımcı olur.

CI'ın testleri yürütmesi için diğer iyi nedenler:

  • Bir geliştiricinin yapması zor olabilecek ana geliştirme platformları dışındaki farklı platformlarda test yapmak. (teşekkürler TZHX )
  • Kabul / Entegrasyon / Uçtan Uca / Gerçekten uzun süren testler, genellikle bir geliştirici kutusunda çalıştırılmayacak olan CI sunucusunda çalıştırılabilir. (teşekkürler Ixrec )
  • Bir geliştirici, ittirmeden / taahhüt etmeden önce küçük bir değişiklik yapabilir (bunun güvenli bir değişiklik olduğunu ve bu nedenle testleri yapmadığını düşünerek). (teşekkürler Ixrec * 2)
  • CI sunucusu yapılandırması genellikle tüm geliştirici araçlarını ve yapılandırmasını içermez ve bu nedenle üretim sistemine daha yakındır.
  • CI sistemleri projeyi her seferinde sıfırdan inşa eder, bu da inşaların tekrarlanabilir olduğu anlamına gelir
  • Bir kütüphane değişikliği aşağı akıştaki sorunlara neden olabilir - bir CI sunucusu yalnızca kütüphane değil tüm bağımlı kod tabanlarını oluşturmak üzere yapılandırılabilir

36
Diğer genel nedenler: 1) CI sunucusu, geliştiricilerin her zaman çalışması için çok uzun süren üst düzey entegrasyon / kabul testlerini çalıştırabilir. 2) Geliştirici onları çalıştırdı ve daha sonra hiçbir şeyi kırmayacaklarından emin olduklarını zorlamadan önce ufak bir değişiklik yaptı, ama emin olmak istiyoruz.
Ixrec

11
Bir bağımlılığa yapılan değişiklik de çoğu zaman tüm aşağı akış yapılarını da yürütür. Bir geliştiricinin aşağı yönde bir şeyi kırdığı bir değişiklik, bir kitaplığı değiştirirken kolayca görünmez (altta yatan bir veri türünü bir SortedSet'ten bir HashSet'e değiştirirken (yalnızca Set'in sözleşmesini sağlayarak) ve aşağı doğru bir kişi yanlış bir varsayım üzerinde çalıştığında Set sıralandı). CI sunucusundaki (akış aşağı) testlerini çalıştırmamak, bir süre boyunca bu böcek iltihabını sağlar.

2
@MichaelT İyi yakalamak. Aslında bu günlerde CI başarısızlıklarımızın>% 90'ının sebebi, nasıl unuttuğumdan emin değilim ...
Ixrec

34
Ayrıca, onları bir CI ortamında çalıştırmak genellikle projenizi sıfırdan kurduğunuz anlamına gelir ve yapınızın tekrarlanabilir olmasını sağlar .
mgarciaisaia

5
Ayrıca, ayrı ayrı tamamıyla test edilen, ancak birbirlerini kıran iki değişiklik yapılabilir (örneğin, kullanılmayan bir API’yi kaldırırken diğeri kullanmaya başlar).
Simon Richter,

74

Kaynak kontrolü yapmadan önce tüm entegrasyon ve birim testlerini yapmayan bir geliştirici olarak, savunmamı burada sunacağım.

Bir uygulamanın doğru çalıştığını test etmek, test etmek ve doğrulamak zorunda kalacağım:

  • Microsoft Windows XP ve Vista ile Visual Studio 2008 derleyicisi.
  • Microsoft Windows 7 ile Visual Studio 2010 derleyicisi.
    • Oh, ve MSI bunların her biri için inşa ediyor.
  • RHEL 5 ve 6, sırasıyla 4.1 ve 4.4 (aynı şekilde CentOS) ile
    • 7 tane yakında. Voop-de-woop.
  • Son üç sürüm için GCC ile Fedora Workstation.
  • Son üç sürüm için Debian (ve Ubuntu gibi türevleri).
  • Son üç sürümdeki Mac OSX.
    • Ve paketler (rpm, dmg, etc)

Fortran'da (hem Intel hem de GNU derleyicilerle birlikte), Python (ve işletim sistemine bağlı olarak çeşitli sürümleri var) ve bash / bat komut dosyası bileşenlerini ekleyin.

Bu yüzden, günde birkaç kez birkaç test yapmak için kullanmam gereken on altı makine var. Bunun için sadece altyapıyı yönetmek neredeyse tam zamanlı bir iş olurdu. Neredeyse herkesin mantıksız olduğunu kabul edeceğini düşünüyorum, özellikle bunu projedeki insan sayısı ile çarparak. Bu yüzden CI sunucularımızın işi yapmasına izin veriyoruz.

Ünite testleri, bozuk kod işlemenizi engellemez, size bir şey kırdığınızı bildiklerini söyler . İnsanlar "birim testlerinin hızlı olması gerektiğini" söyleyebilir ve ilkeler ve tasarım kalıpları ve metodolojileri üzerine devam ederler, ancak gerçekte bazen tekrarlayan, monoton işler için tasarladığımız bilgisayarların bunları yapmasına izin vermek ve sadece buna izin vermek bize bir şey bulduğunu söyle.


3
Birim test testleri kod yapılandırmaları değil. Yeni bir test eklemek ve onu önce yerel olarak çalıştırmadan duvarın üzerinden atmak cidden inert olur ...
Robbie Dee

33
@RobbieDee Korkarım amacınızı göremiyorum? Ben yerel olarak test ya da sadece körü körüne bunları kendiniz test yapmadan kaynak kontrolüne şeyler işlemekle olmadan yeni testler oluşturmak önermiyorum, ben ederim kendi makinede testler - ama "yapılandırma" tutarlı davranış için test edilmeye ihtiyacı yoktur ve geliştiricinin zihni hala bu alanda olduğunda nispeten hızlı yapmak, baskın olarak Mac kullanan ekibin dört bin mil öteden uyanıp kopyalarını güncellerken bir sorun bulmaktan daha iyidir.
TZHX

7
@RobbieDee Eğer yapabilirlerse TZHX'in tüm testleri yerel olarak yapacağını söyleyebilirim ama yapamazlar . TZHX'in yapamadığı için, yerel olarak bazı testler yapıyorlar (örneğin, dev sistemlerinde çalışabilen ve değiştirilen kodla yeterince kısa veya çok ilgili olanlar) ve tam pilin CI sistemi üzerinde çalışmasına izin verdiler. Oldukça makul.
Muru

11
@RobbieDee: Birim testine inanıyor. Bu yüzden onları Macbook havasında test eder ve geçer ve kontrol eder. Red Hat, Solaris ve Windows çalıştıran CI sunucuları daha sonra bu testleri tekrar çalıştırır. Test ettiğin şeyin üretim platformlarında da çalıştığını bilmek hoş değil mi?
Slebetman,

2
@RobbieDee: Sıklıkla belirli bir platformda belirli bir derleyiciye özgü Birim Testleri yazdım. Örneğin, yalnızca g ++ (GNU C ++ derleyici) sürüm 4.5 veya daha yeni sürümlerinde kullanılabilen AMD (Intel rakibi) özel CPU talimatlarını kullanan bir grafik altsistemi düşünün, ancak bir Atom CPU ve ICC (Intel C ++) üzerinde çalışıyorum Derleyici). Bu makinede AMD / g ++ 4.5-testlerini her seferinde yapmak saçma, ancak piyasaya sürülmeden önce test edilecek kod; artı kendi CPU bağımsız kodum, birlikte çalışabilirlik açısından test edilmelidir. Tabii, VM'leri ve emülatörlerine vardır ...
phresnel

23

Mükemmel Oded cevabından başka:

  • Kodu depodan test edersiniz . Makinenizde, işlemeyi unuttuğunuz ... dosyalarınızla çalışabilir. Oluşturma komut dosyasının bulunmadığı yeni bir tabloya (örneğin liquibase'de), bazı yapılandırma verilerine veya özellik dosyalarına bağlı olabilir.
  • Kod entegrasyon sorunlarını önlersiniz. Bir geliştirici son sürümü indirir, birim ve entegrasyon testi oluşturur, kod ekler, tüm testi kendi makinesinde geçirir, taahhüt eder ve zorlar. Başka bir geliştirici de aynısını yaptı. Her iki değişiklik de kendi başına doğrudur, ancak birleşme bir hataya sebep olur. Bu, havuzun birleşmesi veya bir çatışma olarak algılanmaması olabilir. Örneğin Dev 1, hiç kullanılmamış bir dosyayı siler. Dev 2 bu dosyaya karşı kodlar ve Dev 1 değişiklikleri olmadan test eder.
  • Depodan otomatik olarak dağıtmak için bir komut dosyası geliştirirsiniz. Evrensel bir yapıya sahip olmak ve senaryoyu dağıtmak birçok sorunu çözer. Bazı geliştiriciler, herkes tarafından paylaşılmayan bir lib veya derleme seçeneği eklenmiş olabilir. Bu sadece size zaman kazandırmakla kalmaz, aynı zamanda daha önemlisi dağıtımı güvenli ve öngörülebilir yapar. Ayrıca, havuzunuza 2.3.1 sürümüne geri dönebilir ve bu sürümü bu sürümle çalışan bir komut dosyasıyla dağıtabilirsiniz. Görünümler, saklı yordamlar, görünümler ve sürümlenmesi gereken tetikleyiciler gibi veritabanı nesnelerini içerir. (Ya da uygulanabilir bir sürüme geri dönemezsiniz).
  • Diğer testler : Entegrasyon, performans ve uçtan uca testler gibi. Bu yavaş olabilir ve Selenyum gibi test araçlarını içerebilir. Sahte nesneler veya HSQL yerine gerçek bir veritabanına sahip tam bir veri kümesine ihtiyacınız olabilir.

Bir zamanlar, birleşme ve yerleştirme süreci nedeniyle dağıtımda çok fazla sorunu olan bir firmada çalıştım. Bu, test etmeyi ve CI'yi zorlaştıran tuhaf bir mülkiyet çerçevesinden kaynaklandı. Geliştirme konusunda kusursuz çalışan kodun üretime girmediğini bulmak mutlu bir deneyim değildi.


Yeap, sadece bazı değişikliklerin yapılmasını unutmayı çok yaygındır. Yeni dosyaları "svn" eklemeyi unutmayı ve daha sonra bunları işlemeyi unutmayı başaramayan bir otomatik derleme elde etmenin en popüler yol olduğunu söyleyebilirim.
sharptooth

22

Öyle düşünürdün, değil mi - ama geliştiriciler insan ve bazen unutuyorlar.

Ayrıca, geliştiriciler genellikle en son kodu alamazlar. En son testleri check-in sırasında daha sonra iyi sonuç verebilir, bir başkası bir değişiklik yapar.

Testleriniz ayrıca yerel (denetlenmeyen) bir kaynağa da dayanabilir. Yerel birimin test edemeyeceği bir şey.

Yukarıdakilerin hepsinin hayali olduğunu düşünüyorsanız , başarısız testlerden geçirilen yapıların raflarda tutulduğu ve kod tabanına bağlı olmadığı CI'nin üzerinde (en azından TFS'de ) Gated diye bir seviye vardır .


7
Kabul etmeyi umduğum CI başarısızlıklarını taahhüt etmeyi unuttuğum daha fazla ayet gördüm.
Dan Neely,

@DanNeely Adil olmak gerekirse, inşaat müdürü tarafından kıçınıza tekmeyi basmaktan iyidir, çünkü ona bir şey anlatmayı unuttunuz ... :-)
Robbie Dee

3
CI'yi sevmemin sebeplerinden biri de bu. Kendi ooopseslerinizi bulmak ve düzeltmek, başkasının sizin için bulmasını sağlamaktan çok daha iyidir.
Dan Neely,

14

Bir şey ustalaşmaya karar verdiğinde

Genelde CI'mı her iş için çalışacak şekilde ayarlarım. Şubeler test edilinceye kadar şubeler master ile birleştirilmez. Master'da testleri çalıştırmaya güveniyorsanız, derlemenin kırılması için bir pencere açılır.

Testlerin bir CI makinesinde yapılması, tekrarlanabilir sonuçlar ile ilgilidir. CI sunucusunun VCS'nizden çıkardığı bilinen bir temiz ortamı olduğundan, test sonuçlarının doğru olduğunu biliyorsunuzdur. Yerel olarak çalıştırırken, geçmeleri için gereken bazı kodları vermeyi veya başarısız olmaları durumunda geçmelerini sağlayan açık kodları kullanmayı unutabilirsiniz.

Ayrıca, farklı süitleri paralel olarak çalıştırarak, özellikle her değişiklikten sonra yerel olarak çalıştırılmayan yavaş, çok dakikalık testler varsa, geliştiricilere zaman kazandırabilir.

Şu andaki işimde üretim dağıtımımız tüm testlerden geçerek CI'ye giriş yapıyor. Konuşlandırma komut dosyaları, geçmedikleri sürece dağıtımı engeller. Bu, yanlışlıkla çalıştırmayı unutmayı imkansız kılar.

CI iş akışının bir parçası olmak, geliştiricilerin de sorumluluğunu üstlenir. Bir geliştirici olarak genellikle her değişiklik için bir linter, statik analizör, birim testi, kod kapsamı ve entegrasyon testi kullanıyor musunuz? CI, tamamen otomatik olarak ve düşünmeye gerek kalmadan karar vermedeki yorgunluğu azaltabilir.


1
Gerçekten yavaş ünite testleri yaptırmamalısınız - bu İLK ilkelerini ihlal ediyor .
Robbie Dee

4
@RobbieDee: Genelde CI sunucusunun sadece birim testlerini değil tüm testleri yaptığını düşünüyorum.
RemcoGerlich

4
@RobbieDee: Teoride tüm ünite testleri hızlı. Uygulamada .... Ne olursa olsun, CI tüm testleri çalıştırabilir ve yapmalıdır - linerler, statik analiz, birim testleri, entegrasyon testleri.
Daenyth

2
@RobbieDee Açıkçası konfigürasyonun özellikleri takımdan takıma değişecektir. Binalar birkaç dakika sürse bile, bu binaların çoğunu paralel olarak çalıştırmak çoğu zaman mümkündür. Tek bir monolitik kod temeli göz önüne alındığında, daha büyük bir dezavantaj olabilir, ancak IME bir engel değildir.
Daenyth

1
@RobbieDee Sanırım mimarinize daha çok bağlı. 80 kişilik bir mühendislik ekibi için el için çalıştığını gördüm, ancak ürün alanları için iyi tanımlanmış alt ekipler var.
Daenyth,

4

Bir şey ustalaşmaya karar verdiğinde, bir geliştirici tüm birim testlerini çoktan yapmalıydı ... ama yapmamışlarsa? CI sunucusundaki birim testlerini çalıştırmazsanız, başkaları makinelerinde değişiklik yapana ve testlerin henüz üstünden geçtiğini bulana kadar bilemezsiniz.

Ek olarak, geliştirici bir hata yapmış ve makinelerine özgü yerel bir kaynağa başvurmuş olabilir. Kodu kontrol ettiklerinde ve CI çalışması başarısız olduğunda, problem hemen tanımlanır ve düzeltilebilir.


3

Geliştiricilerin oldukça disiplinli olduklarını ve taahhütten önce birim testlerini yürüttüklerini varsaymak, bunun birkaç nedeni olabilir:

  • bazı özel kurulumlarda koşu ünite testleri uzun sürebilir. Örneğin, bellek denetleyiciyle (valgrind gibi) birim testlerinin çalışması daha uzun sürebilir. Tüm birim testleri geçmesine rağmen, bellek kontrolü başarısız olabilir.
  • Sonuç bazı özel ayarlar için önemli değildir - örneğin, kod kapsamını kontrol etmek için test ünitelerinin çalıştırılması özel derleme bayrakları gerektirir. Normal geliştiriciler için kod kapsamı o kadar önemli değil - takım liderleri gibi kodun belirli bir kaliteyi korumasına özen gösteren insanlar için daha fazla.

3

A değişiminin testi geçemediği ve B değişiminin testi geçemediği, ancak A ve B'nin birlikte geçtiği durumları hayal etmek mümkündür . A ve B farklı geliştiriciler tarafından yapılırsa, yalnızca CI sunucusu yeni hatayı algılar. A ve B, aynı uzun cümlenin iki kısmı bile olabilir.

İki lokomotif A ve B'nin sürdüğü bir tren düşünün. Belki bir tanesi fazlasıyla yeterlidir ve uygulanacak çözüm budur. Bununla birlikte, iki "düzeltme" her ikisini de kaldırarak uygulanırsa, tren hareket etmeyecektir.

Ayrıca, çoğu geliştirici bunu yaparken tüm geliştiriciler tüm Ünite testlerini yapmazlar.


2

Eşdeğer bir soru soralım:

Kodu neden bir CI sunucusunda oluşturdunuz?

Şüphesiz, bir şeyin ustalaşmaya karar vermesiyle, bir geliştirici kodu önceden oluşturmuş ve yeni kodlarında oluşabilecek hataları düzeltmiştir. Bu bina kodunun amacı değil mi? Aksi halde, sadece bozuk kod işlediler.


CI yapmanın birkaç nedeni vardır, ancak CI'nin asıl amacı, kodun zaman içinde ne olduğu hakkında bir fikir edinmek için. Bunun sağladığı asıl yarar (birkaç tanesinin dışında), derlemenin ne zaman bozulduğunu öğrenmemiz, onu neyin kırdığını bulmamız ve sonra düzeltmemizdir.

Kod asla bozulmazsa, neden CI kullanıyoruz? Testler için derlemeler sunmak için, gece derlemeler yeterince iyi olacaktı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.