Nakliye test kodu. Neden istemiyorsun?


17

Test kodunu bir ürünle birlikte göndermek istiyorum. Özellikle, programımızın bir kopyası olan herkesin "kendi kendini sınama" düğmesine basabilmesi veya komut satırında kendi kendini sınaması ve tüm birim paketinden geçebilmesi için bir seçenek sağlayın | uyum testleri.

Çoğunlukla alanda keşfedilen sorunların hatalarını ayıklamak için bunu yapmak istiyorum, bu yüzden son kullanıcıdan bir hata raporu geldiğinde "ve ayrıca bu üç test makinemde başarısız oldu" tarafından desteklenme şansı var. Manuel test cihazlarının üniteyi çalıştırabilmesini istiyorum | entegrasyon testleri de.

Bununla birlikte, ekibin testi, test kodunun üretim kodu olmadığına ve bu nedenle gönderilmeyeceğine inanmaktadır. Çoğu açık kaynak projesi bir test paketi gönderdiğinden, bu argümanı gerçekten anlamıyorum. Kapalı yazılımda olağandışı görünmektedir.

Argümanın her iki tarafı için kanıtları veya fıkraları desteklemek istiyorum. Hangi yığın değişim sitesinin en uygun olacağını tahmin ediyorum, ancak lütfen bunun yerinde olup olmadığını bana bildirin.


8
Kapalı kaynak programındaki (veya değiştirilmemiş bir açık kaynak programındaki) birim testi neden başarısız olur? Ürününüz makul miktarda kurulum gerektiriyorsa ve kurulum sorunları genellikle hata kaynağıysa, veritabanı bağlantısını doğrulama, diğer harici hizmetlere bağlantıları doğrulama gibi şeyler yapan bir çeşit "yapılandırmamı doğrula" uygulaması göndermek mantıklı olabilir kodunuzun çalıştığına vb. bağlıdır. Kodun çalıştığını zaten doğruladığınızdan, bir birim testinin başarısız olması mantıklı olmaz.
Justin Cave


15
Ünite testi neden sahada başarısız olur? Kafamın üstünde: Bozuk program. Tehlikeli donanım. Yerel olarak görmediğimiz yarış koşulları. Farklı bir dinamik kitaplığa bağlı. Virüsten koruma veya işletim sistemi ile çakışıyor. Eksik güncelleme nedeniyle ilgili yazılımın şaşırtıcı sürümü ile kullanılması. Beklendiği gibi davranmayan diğer süreçlerle etkileşim. Böceklerin sahada ortaya çıkmasının birçok nedeni vardır ve birçoğu bir birim testinden (belirli bir birim tanımı için)
Jon Chesterfield

7
@JonChesterfield: Programınızda bir kendi kendine test özelliği oluşturmak muhtemelen iyi bir şeydir. Ve bu kendi kendine test özelliği, birim testlerinizdeki kodu kısmen yeniden kullanabiliyorsa, neden olmasın? Ancak böyle bir özellik ve yeniden kullanılabilir parçalar bir "üretim kodu" bakış açısı ile geliştirilmelidir.
Doc Brown

2
@JonChesterfield Bu nedenlerin çoğunda başarısız olan bir birim testini hayal etmekte zorlanıyorum. Entegrasyon testleri başka bir konudur - çok fazla şey yapmadan yapılabiliyorsa onları göndermenin değerini görebilirim.
Loren Pechtel

Yanıtlar:


19

Bazen test kodu, şirketinize harici ve dahili üçüncü taraflardan kod snippet'leri içerir. Bu, kullanıcıların dosya hataları olarak gerçekleşir; testleriniz (regresyon testleri gibi) daha sonra çoğaltmak için kendileri tarafından sağlanan kodu içerir. Genellikle, bu tür kod parçacıklarının hataları yeniden oluşturmak için lisanslanması belirsizdir. Bu nedenle, fikri mülkiyet sorunlarının farkında olmalısınız. Yanlışlıkla şirketinizin farklı bir departmanının veya harici ortaklarınızın ticari sırlarını veya fikri mülkiyetini ortaya koyan test kodu göndermek istemezsiniz.

Başka bir notta, test kodu nadiren üretim kodu standartlarına uygundur: kod incelemeleri mutlaka yapılmaz; kodlama standartları uygulanmadı, vs.

Öte yandan, birçok test utanç verici derecede kötüdür ve bazılarının test edildiğini düşündüklerini bile test etmeyin. Bu farklı bir konu ...

Sonuçta, tüm bu faktörler nedeniyle, testlerinizi açık kaynak olarak gönderilebilen ve yapamayanlar olarak sınıflandırmak isteyebilirsiniz . (Bazı özel testleri, bunları akılda tutarak, diğerlerini yavaşça bu sete geçirerek yazmak isteyebilirsiniz.)


Üçüncü taraf sorunu gerçekten iyi bir nokta. Test kodunu "harici olarak görünür" ve "belki gizli" olarak gruplamak hataya açık ve önemli bir ek yük olacaktır. Bu tek başına bir anlaşma kırıcı, teşekkürler.
Jon Chesterfield

Evet, bundan sonra yapmak zor. Gönderim testlerini geliştirmek için özel bir çaba ile daha fazla şansınız olacağını düşünüyorum.
Erik Eidt

@ErikEidt: "Açık kaynak olarak" kaldırılması için bir öneri yapma özgürlüğünü aldım, çünkü muhtemelen OP'nin aklında olan şey bu değildi - Bence testleri kapalı kaynak olarak göndermek istiyor.
Doc Brown

@DocBrown, anladım. Muhtemelen OP'nin görevin bir yerinde "açık kaynak" dan bahsettiği gibi bir yorum meselesi. Her durumda, düzenlemeniz noktayı güzelce genelleştirir.
Erik Eidt

18

Nakliye testleri? Evet. Nakliye Birimi testleri? Hayır.

Yorumda söylediğiniz gibi, bir istemci bilgisayarda ürünü çalıştırırken karşılaşabileceğiniz sorun yanlış dll ile bağlantı gibi sorunlar içerecektir, genellikle bu bir birim test yakalayacak bir şey değil (şüphesiz dll dışarı alay edecek kodu test etmek için).

Şimdi, bir entegrasyon test paketi, dll çağıran mantığı çağıran UI çağırır ... çok daha iyi çalışacaktır. Entegrasyon testleri, başarısız kurulumların birim testlerin görünmeyeceği diğer yönlerini gösterebilir. (örneğin, şu anki ürünüm lisanslama nedeniyle paketlememize izin verilmeyen bir k-lite codec bileşeninin yüklenmesini gerektiriyor. Birim testleri kodumuzun iyi çalıştığını gösterebilir, ancak yine de müşteri memnuniyeti için çalışmıyor. Benzer şekilde, codec bileşenleri yapılandırmamız düzgün çalışmıyorsa, birim testleri de bunu göstermez).

Bunun yerine, yüklü, entegre bir ürün için tam olarak istediğiniz gibi bazı entegrasyon testlerinizi gönderin.


2

Bir çapraz platform sunarken, her CPU çekirdeğini, SIMD intrinsics, GPU, GPGPU, vb. Kullanan çok iş parçacıklı bir yeni nesil AAA oyun motoru gibi, donanımın her bir inçini kapladığınız alanlarda bu endişeyi anlayabiliyorum. ürün.

Bu durumlarda, en kötü kabusunuz genellikle testlerinizin (birim ve entegrasyon) test edilen ilk 5.000 farklı makine / platform için geçeceği, ancak belirsiz bir GPU modeli için sürücü hatası nedeniyle 5.001'de başarısız olduğu durumlar olacaktır. Bu konuda bana titreme verir - bunları önceden test edemez veya önceden tahmin edemezsiniz.

Özellikle GPU gölgelendiricileri yazarsanız, dahil olan tüm GPU modelleri / sürücüleri tarafından uygulanan birkaç taşınabilir standart garanti olduğundan, yazdığınız kodun yarısının tanımlanmamış davranışı çağıracağı ters bir piyango oynayabilirsiniz. Bu günlerde mayın tarama gemisi oynamak gibi gittikçe azalırken, bu insanlara bir fikir vermelidir: http://theorangeduck.com/page/writing-portable-opengl . 90'ların sonunda ve 2000'lerin başında bunu denemek gerçekten korkunçtu ve mayın tarama gemisi oldu.

Bu tür durumlar için, ürünü gerçekten sağlamlaştırmak ve kararlı bir sürümden önce kendinden emin olmak için genellikle çok çeşitli donanım ve işletim sistemlerine sahip 10.000'den fazla test kullanıcısına ihtiyaç duyarsınız . Tüm şirketler bu kadar geniş bir test tabanına sahip olmayı göze alamaz ve herkesin bunu doğru yapmak için disiplini yoktur (geniş çapta fark edilen tüm sorunlar , bazı dahili ön alfa / alfa aşamasında veya daha fazla testçiye sahip olmadan önce düzeltilmelidir . gereksiz raporlar, geliştiricileri bir yama ve dua panikine atabilir).

Bu durumda önerdiğim, başkalarının önerdiği şey, dağıtılmış bir entegrasyon testleri setine odaklanmak. Yükleyiciyle paketleyebilir ve kullanıcıların, kurulumun size neden başarısız olabileceğini, geliştiricilerin neden başarısız olabileceğine ilişkin ayrıntıları sağlamaya dikkat ederek temel bir tanılama denetimini geçmesini gerektirir.

Başka bir şey (patronu ikna edebiliyorsanız), bitişik entegrasyon için geniş bir donanım yelpazesine sahip olmaktır. Donanım / OS kombinasyonlarında daha fazla çeşitlilik, daha iyi. CI sunucularınız için minimum donanım gereksinimlerini modelleyen çeşitli bok donanımları bile istersiniz: asla bilemezsiniz.

Ama önerebileceğim bir şey daha var:

Kerestecilik

Yukarıda tarif ettiğim senaryo gibi bir şeyle uğraşıyorsanız, genellikle en sorunlu (muhtemelen en kötü zamanda ortaya çıkan ve hatta muhtemelen en kötü ihtimalle ortaya çıkamayan) olası şeyleri test edemezsiniz. çok ayrıntılı bir donanım / işletim sistemi birleşimiyle sınırlı olduğu için en kapsamlı test paketi).

Ancak, belirsiz donanım uyumsuzlukları veya doğrudan sürücü hataları veya yanlış dylib'e (aslında bu endişeyle hiç karşılaşmadım) bağlanma gibi sorunların çoğu, yazılımı başlatmanın çok ötesine geçmez. Genellikle çökecek ve çok yakında, kabaca konuşarak yanacak.

Ben, akıl sağlığı için, kaçınılmaz olanı kucaklamayı öneririm. Muhtemelen kapsamlı bir şekilde test edemeyeceğiniz bu şeyler hakkında hiçbir şey yapamazsınız. Kasırga (imkansız) önlemek için çalışmayın, ama o pencerelere bindik.

Tipik olarak burada yapabileceğimiz en iyi şey, sorunu olabildiğince çabuk, nerede olabildiğince ayrıntılı olarak ortaya çıkarmak (şüpheliler listemizi daraltmak) ve bildirildikten sonra ASAP sorununu düzeltmektir.

Bu durumda, günlük kaydı bir cankurtaran olabilir. Bu tür alanlar için, hiç kimsenin okuyamayacağı bu spam içerikli teknik günlükleri oluşturabilirsiniz. Genellikle ilgili, kullanıcı bir sürücü hatası nedeniyle bir çökme ile karşılaşmadan önce günlüğe kaydedilen en son satırdır, örneğin, çökmeleri izleyen ve daha sonra kullanıcıların kopyalayabileceği günlüğün son satırını gösteren harici bir işlem veya kanca yazabilirsiniz. ve örneğin bir çökme çöplüğüne ek olarak size yapıştırabilirsiniz.

Bu genellikle ayrıntılı bilgilere ihtiyaç duyduğundan ve bu donanım / platform / sürücü sorunlarına ilişkin koddaki en hassas alanların çoğu performans açısından kritik olduğundan, günlüğe kaydetmenin o kadar sık ​​bir oranda gerçekleşebileceği garip bir sorun var. yazılım.

Bu durumda yararlı bir hile, bir kez yürütülen bir şeyin ikinci kez, üçüncü kez vb. Başarılı bir şekilde yürütüleceği varsayımına güvenmektir. Bu en sağlam varsayım değildir, ancak genellikle "yeterince iyi" (ve hiçbir şeyden sonsuz derecede daha iyi) . Bununla, bir şeyin zaten günlüğe kaydedildiğini takip etmek için biraz dış durum kullanabilir ve kodun bir döngüde tekrar tekrar çağrılacağı gerçekten ayrıntılı durumlar için günlüğe kaydetme girişimlerini atlayabilirsiniz.

Her neyse, umarım bu yardımcı olur. Geçmişte bu tür bir günaha maruz kaldım ve GPU kodlamasını (GPGPU ve gölgelendiriciler) çevreleyen biraz paranoyaya sahibim ve kendim ve ekibim arasındaki geçmiş deneyimlerin bir sonucu olarak (bazen sadece diğer ekip üyelerinin bunlarla gerçekten başa çıktığını görmek) geç ve bırakıldıktan sonra, belirli bir Radeon modelindeki bazı yumuşatılmış çizgilerin oluşturulmasında çökecek bazı ATI aksaklıkları gibi sürünürler oluştu, daha sonra bildirildi ve sadece geçici bir çözümle bilinen bir sorun olarak işaretlendi).

Günlüğe kaydetme, popomuzu kurtaran şeydi ve sık sık duymadığımız bir yerleşik GPU ile 10.001'inci belirsiz prototip makinedeki sorunu sık sık görmemize izin verdi, son kod satırı derhal hatanın tam olarak nerede olduğunu tespit etmemizi sağladı. veya şüpheli olarak 3 satır kod, örneğin ayrıntılı bir gölgelendiricinin içindeyse, bir GPU gölgelendiricisinin içine giriş yapamadığımız için bir tür SOL'yuz, ancak en azından hangi gölgelendiricinin sorunu olduğunu görmek için günlüğü kullanabiliriz soruşturmayı başlatmak.


2
Günlük kodunu kaydetmek zekidir. Şu anda - büyük ölçüde performans kaygıları nedeniyle - günlük üretmiyoruz, bu nedenle hata ayıklama çekirdek dökümü içerir. Tanılayıcı testlerin yükleyici ile birlikte yerleştirilmesi de iyi bir fikirdir. Ayrıntılı cevap için teşekkür ederim.
Jon Chesterfield
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.