Ağır jquery / backbonejs web uygulamalarında% 100 kod kapsamı beklemek uygun mudur? Asıl kod kapsamı, javascript / jquery'de% 92 -% 95 arasında değiştiğinde,% 100 kapsamın karşılanmaması nedeniyle bir sprint başarısız olması makul mü?
Ağır jquery / backbonejs web uygulamalarında% 100 kod kapsamı beklemek uygun mudur? Asıl kod kapsamı, javascript / jquery'de% 92 -% 95 arasında değiştiğinde,% 100 kapsamın karşılanmaması nedeniyle bir sprint başarısız olması makul mü?
Yanıtlar:
Gerçekçi olmadığı için aynı derecede gerçekçi.
Gerçekçi
Tüm kod tabanını kapsadığı gösterilen otomatik bir test yaptırdıysanız,% 100 kapsamda kalmakta ısrar etmek makul olacaktır.
Aynı zamanda projenin ne kadar kritik olduğuna da bağlı. Ne kadar kritik olursa, kod kapsamının tamamını beklemek / talep etmek daha makul olur.
Küçük ve orta ölçekli projeler için bunu yapmak daha kolaydır.
Gerçekçi
değil% 0 güvencesinde başlıyorsunuz ...
Proje, yeniden yaratılması veya tetiklenmesi zor birçok hata yoluyla canavarca.
Yönetim, kapsamın orada olduğundan emin olmak için taahhüt / yatırım yapmak istemez.
Kapsamadan terbiyeli olana kadar çeşitli projelerle çalıştım. Asla% 100'lük bir proje değil, ancak% 100'lük bir kapsamaya daha yakın olmasını dilediğim zamanlar oldu.
Nihayetinde soru, mevcut kapsamın ekibin ürünün nakliyesinde rahat olması için gereken davaları yeterince karşılayıp karşılamadığıdır.
Başarısızlığın projeniz üzerindeki etkisini bilmiyoruz, bu nedenle% 92 veya% 95'in yeterli olup olmadığını veya% 100'ünün gerçekten gerekli olup olmadığını söyleyemeyiz. Veya bu konuda% 100 tamamen beklediğiniz her şeyi test eder.
Teorik anlamda ve iş açısından pratik olmamakla birlikte en iyi ve gerçekçi olmamak çok saftır .
Testler yazmak çok pahalı, kendini yazması ve test etmesi gereken kod, gerçekten test etmeye çalıştığı şeyin belgelenmesi gereken kod, iş mantığı değişimleriyle sürdürülmesi gereken kod ve testler başarısız oldu çünkü güncel değiller. Otomatikleştirilmiş testlerin sürdürülmesi ve bunlarla ilgili dokümantasyon, bazen kodu korumaktan daha pahalı olabilir.
Bu, ünite testi ve entegrasyon testlerinin faydalı olmadığını söylemek değildir, ancak yalnızca anlamlı oldukları yerlerde ve insanları öldürebilecek endüstrilerin dışında, bir kod tabanında her kod satırını denemek ve test etmek mantıklı değildir. Bu kritik öldürme grubunun dışında, kod tabanlarını hızlı bir şekilde kodlayın,% 100 kod kapsamının gerektireceği olumlu bir yatırım getirisi hesaplamak mümkün değildir.
Hesaplanabilirlik teorisinde durma problemi , keyfi bir bilgisayar programı ve bir girdi tanımından programın çalışmayı bitirip bitirmeyeceğini veya sonsuza kadar çalışmaya devam edip etmeyeceğini belirleme problemidir.
Alan Turing, 1936'da, olası tüm program giriş çiftleri için durma problemini çözmek için genel bir algoritmanın bulunmadığını kanıtladı. İspatın önemli bir kısmı, bir Turing makinesi olarak bilinen bir bilgisayarın ve programın matematiksel bir tanımıydı; Durma problemi Turing makinelerinde kararsız. Karar probleminin ilk örneklerinden biridir.
Bir şeyin% 100 işe yaradığını bile kanıtlayamadığın için neden bunu hedefin haline getirdin?
getXXX()/setXXX()
, değer nesneleri için basit ve basit atama yapıcılarını kapsayacak sınama senaryoları yazmanın zaman ve kaynakların iyi bir şekilde kullanıldığını, aslında gerçekte böyle olmadığı için üzgünüm ve bunu destekleyecek gerçek dünya deneyiminden yoksun bir saf görüş olduğunu düşünüyorsunuz. Test kodunun hala bakımı yapılması gereken kod olduğunu unutmayın. Bir sorunu çözmek için ne kadar az kod yazarsanız her durumda o kadar iyi olur .
Çoğu durumda,% 100 kod kapsamı, biraz "hile yaptığınız" anlamına gelir:
Temel olarak, test edilmesi zor kısımlar, mutlaka "kod" olarak sayılmayan alanlara yönlendirildi. Her zaman gerçekçi değildir, ancak test etmenize yardımcı olmaktan bağımsız olarak, tüm bu uygulamaların kod tabanınızı üzerinde çalışmasını kolaylaştırdığını unutmayın.
% 100 branş kapsamının etkileyici, gerçek dünya örneği için bkz . SQLite Nasıl Test Edilmiştir .
Sorunuzu özellikle tamamen farklı bir yazılım ürünü olan javascript hakkında sorar, ancak yeterli motivasyonla neler yapılabileceğine dair farkındalık getirmek istiyorum.
Belirli bir uygulamanın tüm parçaları için birim testleri için% 100 kod kapsamı, yeni projelerle bile, boru rüyasıdır. Keşke durum böyle olsaydı, ama bazen dış bağımlılıkları özümsemek için ne kadar uğraşırsanız çalışın bir kod parçası yazamazsınız. Örneğin, kodunuzun bir web servisini çağırması gerektiğini varsayalım. Web servisi aramalarını bir arabirimin arkasına gizleyebilirsiniz, böylece o parçayı alay edebilir ve web mantığı öncesi ve sonrası iş mantığını test edebilirsiniz. Ancak web servisini çağırması gereken asıl parça birim test edilemez (yine de çok iyi). Başka bir örnek, bir TCP sunucusuna bağlanmanız gerekirse. Bir TCP sunucusuna bağlanan kodu bir arabirimin arkasına gizleyebilirsiniz. Ancak fiziksel olarak bir TCP sunucusuna bağlanan kod ünite test edilemez, çünkü herhangi bir nedenden dolayı düşerse, bu durum ünite testinin başarısız olmasına neden olur. Ve birim testleri ne zaman başlatıldıklarına bakılmaksızın her zaman geçmelidir.
İyi bir kural, tüm iş mantığınızın% 100 kod kapsamına sahip olması gerektiğidir. Ancak dış bileşenleri çağırması gereken parçaların mümkün olduğunca% 100 kod kapsamına sahip olması gerekir. Eğer ulaşamazsan, fazla terlemem.
Çok daha önemli, testler doğru mu? İşletmenizi ve gereksinimlerinizi doğru bir şekilde yansıtıyor mu? Kod kapsamına sahip olmak, yalnızca kod kapsamasına sahip olmak, yaptığınız tüm yanlış testler veya yanlış kodları test etmek anlamına gelmez. Bu, eğer testleriniz iyi ise,% 92-95 oranında kapsama sahip olması olağanüstüdür.
Kod,% 100 test kapsamına izin vermek için belirli bir amaç için tasarlanmadığı sürece% 100 elde edilemeyebilir. Sebeplerden biri, savunmayı kodlamanız durumunda - ki hangisini yapmalısınız - bazen sistemle ilgili bilginiz verildiğinden emin olmamanız gerektiğine ya da olamayacağınıza emin olmanız gereken kodları kullanmanız gerekir. Bu tür kodları testlerle ele almak tanım olarak çok zor olacaktır. Bu tür bir kodun bulunmaması tehlikeli olabilir - ya yanılıyorsanız ve bu durum 256'dan bir kez meydana gelirse? Ya ilgisiz yerde, imkansız olanı mümkün kılan bir değişiklik olursa? Öyleyse,% 100'e "doğal" yollarla ulaşmak oldukça zor olabilir - örneğin, belleği ayıran bir kodunuz varsa ve bellek yöneticisini alay etmediğiniz sürece (başarısız olabilir) başarısız olup olmadığını kontrol eden bir kodunuz varsa ve bu kodu kapsayan zor olabilir, "bellek yetersiz" döndüren bir test yazın. JS uygulaması için, farklı tarayıcılarda olası DOM tuhaflıkları, harici hizmetlerin olası hataları vb.
Bu yüzden, birinin mümkün olduğunca% 100'e yakın olması için çaba göstermesi gerektiğini ve delta için iyi bir nedeninin olması gerektiğini söyleyebilirim, ancak kesin olarak başarısızlığın% 100'ünü alamayacağımı görmüyorum. % 95'ine bağlı olarak% 95'i büyük bir projede iyi olabilir.
Eğer yeni bir projeyle başlıyorsanız ve kesinlikle bir test-ilk metodolojisi kullanıyorsanız, testlerinizin uygulandığı sırada tüm kodunuzun bir noktada çağrılacağı anlamında% 100 kod kapsamına girmeniz tamamen mantıklı olacaktır. idam edildi. Bununla birlikte, her bir metodu veya algoritmayı, metot görünürlüğü nedeniyle doğrudan test etmemiş olabilirsiniz ve bazı durumlarda bazı metodları dolaylı olarak bile test etmemiş olabilirsiniz.
Kodunuzun% 100'ünün test edilmesi potansiyel olarak pahalı bir egzersizdir, özellikle sisteminizi bu hedefe ulaşmanıza izin verecek şekilde tasarlamadıysanız ve tasarım çalışmalarınızı test edilebilirliğe odaklıyorsanız, muhtemelen yeterince dikkatinizi vermiyorsunuzdur. Uygulamanızı, özellikle projenin büyük olduğu durumlarda, özel gereksinimlerini karşılayacak şekilde tasarlamak. Üzgünüm, ama hiçbir şeyden ödün vermeden iki şekilde de sahip olamazsınız.
Daha önce testlerin sürdürülmediği veya dahil edilmediği mevcut bir projeye testler sunuyorsanız, eforun ağırlığındaki egzersizin masrafları olmadan% 100 kod kapsamı elde etmek mümkün değildir. Önceden umut verebileceğiniz en iyi şey, kod adı verilen en kritik bölümler için test kapsamı sağlamaktır.
Asıl kod kapsamı, javascript / jquery'de% 92 -% 95 arasında değiştiğinde,% 100 kapsamın karşılanmaması nedeniyle bir sprint başarısız olması makul mü?
Çoğu durumda, sprintinizin yalnızca hedeflerinizi gerçekleştirmediyseniz 'başarısız' olduğunu düşünmeniz gerektiğini söyleyebilirim. Aslında, böyle durumlarda sprintlerin başarısız olduğunu düşünmemeyi tercih ederim, çünkü bir sonraki sprint tanımladığınızda planlamanızı doğru yapmak için beklentileri karşılamayan sprintlerden öğrenebilmeniz gerekir. Ne olursa olsun, kod kapsamını bir sprintin göreceli başarısında bir faktör olarak kabul etmenin makul olduğunu sanmıyorum. Amacınız, her şeyin belirtildiği şekilde çalışmasını sağlayacak kadar yapmak ve ilk önce test kodunu kullanıyorsanız, testlerinizin bu amacı destekleyeceğinden emin olmanız gerekir. Eklemeniz gerekebileceğini düşündüğünüz herhangi bir ek test etkili bir şekilde şeker kaplamadır ve böylece sprintlerinizi tatmin edici şekilde tamamlamada sizi tutabilecek ilave bir masraftır.
Bunu elbette yapmıyorum ama iki büyük projede yaptım. Zaten ayarlanmış birim testleri için bir çerçeveye sahipseniz, tam olarak zor değildir, ancak çok fazla test ekler.
Karşılaştığınız, bu son birkaç çizgiye çarpmanızı önleyen belirli bir engel var mı? Olmazsa,% 95'ten% 100'e kadar kapsama almak kolay ise, o zaman gitmeye devam edebilirsiniz. Burada sorduğun için , bir şey olduğunu kabul edeceğim . Bu da ne?
% 92 iyi. Gerçek soruların şöyle olduğunu hissediyorum:
% 92 şimdi 'yeni' normu mu? Bir sonraki sprint% 88 teste sahipse, sorun olur mu? Bu genellikle terkedilmiş test süitlerinin başlangıcıdır.
Yazılımın çalışması ve hata olmaması ne kadar önemlidir. Bu nedenlerden dolayı test yapıyorsun, "test uğruna" değil.
Geri dönüp eksik testleri doldurmak için bir plan var mı?
Neden test ediyorsun Odaklanılan bölüm% fonksiyonellik değil kapalı
Martin Fowler blogunda yazıyor :I would be suspicious of anything like 100% - it would smell of someone writing tests to make the coverage numbers happy, but not thinking about what they are doing.
Bununla birlikte, birim seviyesinde% 100 kapsamayı zorunlu kılan standartlar bile vardır. Örneğin, Avrupa uzay uçuşu topluluğunun (ECSS, Avrupa Uzay Standardizasyonu İşbirliği) standartlarındaki şartlardan biridir. Buraya bağlanan makale , daha önce tamamlanmış bir yazılımda% 100 test kapsamına ulaşmayı hedefleyen ilginç bir proje hikayesini anlatıyor. Birim testlerini geliştiren ilgili mühendislerle yapılan görüşmelere dayanmaktadır.
Derslerden bazıları:
Belki uygulanabilir ve makul olup olmadığını sormak, sorulacak en yararlı sorular değildir. Muhtemelen en pratik cevap kabul edilmiştir. Bunu daha felsefi bir düzeyde analiz edeceğim.
% 100 kapsama alanı ideal olacaktır, ancak ideal olarak, ihtiyaç duyulmayacak veya elde edilmesi çok daha kolay olacaktır. Yapılabilir ya da makul olmaktan ziyade doğal ve insan olup olmadığını düşünmeyi tercih ederim.
Doğru programlama, bugünün araçlarıyla imkansızdır. Tamamen doğru olan ve hataları olmayan kodlar yazmak çok zor. Bu sadece doğal değil. Bu nedenle, bariz bir seçenek olmadan TDD gibi tekniklere ve kod kapsamını izlemeye gidiyoruz. Ancak sonuç hala doğal olmayan bir süreç olduğu sürece, insanları sürekli ve mutlu bir şekilde yapma konusunda zorlanacaksınız.
% 100 kod kapsamı elde etmek doğal olmayan bir işlemdir. Çoğu insan için, onları başarmaya zorlamak, bir tür işkence olacaktır.
Doğal zihinsel modellerimizle eşleşen süreçlere, araçlara, dillere ve koda ihtiyacımız var. Bunu başaramazsak, kaliteyi bir üründe test etmenin bir yolu yoktur.
Bugün oradaki tüm yazılıma bak. Birçoğu oldukça düzenli bir şekilde karışıyor. Buna inanmak istemiyoruz. Teknolojimizin büyülü olduğuna inanmak ve bizi mutlu etmek istiyoruz. Ve böylece teknolojimizin sık sık karıştığı şeyleri görmezden gelmeyi, mazeret etmeyi ve unutmayı seçiyoruz. Ancak olayların dürüst bir şekilde değerlendirilmesini sağlarsak, bugünkü yazılımların çoğu oldukça berbattır.
Kodlamayı daha doğal hale getirmek için birkaç çaba:
https://github.com/jcoplien/trygve
https://github.com/still-dreaming-1/PurposefulPhp
Daha sonra son derece eksik ve deneysel. Aslında bu benim başlattığım bir proje, ancak tamamlama için kendime zaman ayırabilirsem, programlama sanatı için ileriye doğru büyük bir adım olacağına inanıyorum. Temel olarak, eğer sözleşmeler bizim değer verdiğimiz bir sınıf davranışının tek yönlerini ifade ediyorsa ve sözleşmeleri zaten kod olarak ifade ediyorsak, neden yalnızca sözleşmelerle birlikte sınıf ve yöntem tanımlarının olmadığı da bir fikirdir. Bu şekilde sözleşmeler kod olacaktır ve tüm yöntemleri uygulamamız gerekmez. Kütüphanenin bizim için yapılan sözleşmeleri nasıl onurlandıracağını bulmasına izin verin.
Yeni kodda% 100'e ulaşmak çok başarılı olmalı ve TDD'yi uyguluyorsanız, üretim kodunun her satırı için çok fazla test yazarken muhtemelen varsayılan olarak buna çarpacaksınız.
Ünite testi olmadan yazılmış mevcut eski kodda, eski test kodu akılda tutularak yazılmadığından ve çok sayıda yeniden düzenleme gerektirdiğinden, eski kodlar zor olabilir. Bu yeniden yapılanma düzeyi genellikle risk ve zamanlamanın gerçekleri göz önüne alındığında pratik değildir, bu nedenle işlemlerinizi gerçekleştirirsiniz.
Ekibimde% 100 kod kapsamı belirtiyorum ve kod incelemesinde bundan daha azını görürsek, bileşenin teknik sahibinin% 100 geliştiriciye neden erişilmediğini ve geliştiricinin mantığını kabul etmesi gerektiğini tartışın. Genellikle,% 100'e ulaşmada bir sorun varsa, geliştirici kod incelemesinden önce teknik sahiple konuşacaktır. Alışkanlık haline geldikten ve bazı ortak meseleler üzerinde çalışmak için teknikler öğrendikten sonra, eski% 100'e düzenli olarak vurmanın ilk başlarda düşündüğünüz kadar zor olmadığını test ederek kodları test ederek öğrendik.
Michael Feather'ın " Eski Kodla Etkili Çalışma " adlı kitabı , eski kodumuza testler eklemek için stratejiler geliştirdiğimiz için bizim için çok değerli oldu.
Hayır, mümkün değil ve asla olmayacak. Mümkün olsaydı tüm matematik finalitizm içine düşecekti. Örneğin, iki 64 bit tam sayı alan ve çarpılan bir işlevi nasıl test edersiniz? Bu, her zaman bir programın doğru olduğunu kanıtlamaya karşı test etmedeki sorunum olmuştur. En önemsiz programlardan başka herhangi bir şey için, test, yalnızca az sayıda vakayı kapsadığı için temel olarak işe yaramaz. 1000 numarayı kontrol etmek ve Goldbach varsayımını kanıtladığını söylemek gibi.