Java projeleriniz için hangi kod analiz araçlarını kullanıyorsunuz? [kapalı]


117

Java projelerinizde hangi kod analizi araçlarını kullanıyorsunuz?

Her türle ilgileniyorum

  • statik kod analiz araçları (FindBugs, PMD ve diğerleri)
  • kod kapsama araçları (Cobertura, Emma ve diğerleri)
  • diğer enstrümantasyon tabanlı araçlar
  • başka bir şey, bir şeyi kaçırıyorsam

Mümkünse, hangi derleme araçlarını kullandığınızı ve bu araçların hem IDE'lerinizle hem de derleme araçlarınızla ne kadar iyi entegre olduğunu da belirtin.

Bir araç yalnızca belirli bir yolla mevcutsa (bir IDE eklentisi veya bir derleme aracı eklentisi olarak) bu bilgi de dikkate değerdir.


Ayrıca UCDetector'a bir göz atın: ucdetector.org
Christophe Roussy

Mutasyon testi kapsamı için Pitest'i kontrol etmeye gidiyor .
mucaho

Yanıtlar:


70

Statik analiz araçları için genellikle CPD, PMD , FindBugs ve Checkstyle kullanıyorum .

CPD, PMD "Kopyala / Yapıştır Detektörü" aracıdır. Ben fark etmeden ise küçük için PMD kullanıyordu "bulma çoğaltılmış kodu" bağlantısını üzerinde PMD web sayfası .

Bu araçların bazen "kullanıma hazır" kuralların ötesine genişletilebileceğini belirtmek isterim. Ve sadece onları yeniden yazabilmeniz için açık kaynak oldukları için değil. Bu araçlardan bazıları, genişletilmelerine izin veren uygulamalarla veya "kancalarla" birlikte gelir. Örneğin, PMD, yeni kurallar oluşturmanıza izin veren "tasarımcı" aracıyla birlikte gelir . Ayrıca, Checkstyle, önemli özelleştirmeye izin veren özelliklere sahip DescendantToken denetimine sahiptir.

Bu araçları Ant tabanlı bir yapıyla entegre ediyorum . Yorumlu yapılandırmamı görmek için bağlantıyı takip edebilirsiniz.

Yapıyla basit entegrasyona ek olarak, araçları birkaç başka yolla bir şekilde "entegre" olacak şekilde yapılandırmayı yararlı buluyorum. Yani, rapor oluşturma ve uyarı bastırma homojenliği. Bu tartışmaya şu yönleri eklemek istiyorum (muhtemelen "statik analiz" etiketi de olmalıdır): millet, "birleşik" bir çözüm oluşturmak için bu araçları nasıl yapılandırıyor? (Bu soruyu burada ayrıca sordum )

İlk olarak, uyarı raporları için çıktıyı her uyarının basit biçime sahip olması için dönüştürüyorum:

/absolute-path/filename:line-number:column-number: warning(tool-name): message

Buna genellikle "Emacs formatı" adı verilir, ancak Emacs kullanmasanız bile, raporları homojenleştirmek için makul bir formattır. Örneğin:

/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.

Uyarı formatı dönüşümlerim Ant betiğim tarafından Ant filtre zincirleri ile yapılır .

Yaptığım ikinci "entegrasyon" uyarı bastırmak içindir. Varsayılan olarak her araç, yok saymak istediğiniz bir uyarıyı susturmak için kodunuza yerleştirebileceğiniz yorumları veya ek açıklamayı (veya her ikisini) destekler. Ancak bu çeşitli uyarı bastırma talepleri, biraz aptalca görünen tutarlı bir görünüme sahip değildir. Bir uyarıyı bastırdığınızda, bir uyarıyı bastırıyorsunuz, öyleyse neden her zaman " SuppressWarning" yazmıyorsunuz ?

Örneğin, PMD'nin varsayılan yapılandırması NOPMD, bir açıklamada " " dizesi bulunan kod satırlarında uyarı oluşturmayı bastırır . Ayrıca PMD, Java'nın @SuppressWarningsaçıklamasını destekler . PMD'yi PMD bastırmalarının benzer görünmesi için SuppressWarning(PMD.yerine " " içeren yorumları kullanacak şekilde yapılandırıyorum NOPMD. Yorum stili gizlemeyi kullanırken ihlal edilen belirli kuralı dolduruyorum:

// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained

SuppressWarnings(PMD.Bir yorum için yalnızca " " kısmı önemlidir, ancak PMD'nin @SuppressWarningbireysel kural ihlallerini isme göre tanıyan ek açıklama desteğiyle tutarlıdır :

@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended

Benzer şekilde, Checkstyle yorum çiftleri arasında uyarı oluşumunu engeller (ek açıklama desteği sağlanmaz). Varsayılan olarak, yorum Checkstyle kapatıp üzerine dizeleri içermesi CHECKSTYLE:OFFve CHECKSTYLE:ONsırasıyla. Bu yapılandırmanın (Checkstyle'ın "SuppressionCommentFilter" ile) " BEGIN SuppressWarnings(CheckStyle." ve " END SuppressWarnings(CheckStyle." dizelerini kullanacak şekilde değiştirilmesi , kontrollerin daha çok PMD gibi görünmesini sağlar:

// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)

Checkstyle yorum ile, özellikle çek ihlali ( HiddenField) olan her çek kendine "çünkü önemli BEGIN/END" yorum çifti.

FindBugs ayrıca bir @SuppressWarningsaçıklama ile uyarı oluşturmayı engellemeyi de destekler , bu nedenle diğer araçlarla belirli bir düzeyde tekdüzelik elde etmek için daha fazla yapılandırma gerekmez. Maalesef, Findbugs'ın özel bir @SuppressWarningsaçıklamayı desteklemesi gerekir çünkü yerleşik Java @SuppressWarningsaçıklama, SOURCEFindBugs'ın ihtiyaç duyduğu sınıf dosyasındaki açıklamayı tutacak kadar güçlü olmayan bir saklama politikasına sahiptir. Java'nın @SuppressWarningsek açıklamasıyla çakışmayı önlemek için FindBugs uyarı engellemelerini tam olarak nitelendiriyorum :

@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")

Bu teknikler, nesnelerin araçlar arasında makul ölçüde tutarlı görünmesini sağlar. Her bir uyarı bastırmanın " SuppressWarnings" dizesini içermesinin, bir kod tabanının tamamında tüm araçların tüm örneklerini bulmak için basit bir arama çalıştırmayı kolaylaştırdığını unutmayın.


vay, oldukça detaylı cevap. paylaşım için teşekkürler. uygulamalarınızı kodlama uygulamalarıma taklit edeceğim.
Vatsala

16

Cobertura, Checkstyle, (Ecl) Emma ve Findbugs kombinasyonunu kullanıyorum.

EclEmma , düzenleyicide java kaynağını renklendirerek kod kapsamını gösteren harika bir Eclipse eklentisidir ( ekran görüntüsü ) - kapsam bir JUnit testi çalıştırılarak oluşturulur. Bu, belirli bir sınıfta hangi satırların kapsandığını anlamaya çalışırken veya yalnızca hangi satırların tek bir testin kapsamında olduğunu görmek istediğinizde gerçekten yararlıdır. Bu, bir rapor oluşturmaktan ve ardından hangi sınıfların kapsamının düşük olduğunu görmek için rapora bakmaktan çok daha kullanıcı dostu ve kullanışlıdır.

Checkstyle ve Findbugs Eclipse eklentileri de kullanışlıdır, siz yazarken düzenleyicide uyarılar oluştururlar.

Maven2, derleme zamanında raporlar oluşturmak için yukarıdaki araçlarla çalışan rapor eklentilerine sahiptir. Bunu, toplu sayılar istediğinizde daha yararlı olan genel proje raporlarını almak için kullanırız. Bunlar Continuum kullanılarak çalışan CI yapılarımız tarafından oluşturulur .


1
vay @ EclEmma! Emma'yı biliyordum ama Eclipse'e entegre olmuştum. Bu kurallar.
Joshua McKinnon

3
Süreklilik berbat, Hudson kuralları.
Ken Liu

11

Aşağıdakilerin tümü hem Maven 2.x kurulumlarımızda hem de Eclipse / RAD 7'de kolaylıkla kullanıp entegre ediyoruz:

  • Test - JUnit / TestNG
  • Kod analizi - FindBugs, PMD
  • Kod kapsamı - Yonca

Ek olarak, Maven yapılarımızda:

  • JDepend
  • Etiket denetleyici (TODO, FIXME vb.)

Ayrıca, Maven 2.x kullanıyorsanız, CodeHaus'un Mojo projesinde kullanışlı Maven eklentileri koleksiyonu vardır .

Not: Clover, Bamboo CI sunucusuyla ezber bozan bir entegrasyona sahiptir (her ikisi de Atlassian ürünü oldukları için). FindBugs, PMD ve CheckStyle için Bamboo eklentileri de vardır, ancak belirtildiği gibi, ücretsiz Hudson CI sunucusu da bunlara sahiptir.


9

IntelliJ IDEA'da yerleşik olarak bulunan statik analizi kullanıyorum. Mükemmel entegrasyon.

Intellij IDEA'da (EMMA'ya dayalı) yerleşik kod kapsamını kullanıyorum. Yine mükemmel entegrasyon.

Bu entegre çözüm, çeşitli satıcıların araçlarını bir araya getirmeye kıyasla güvenilir, güçlü ve kullanımı kolaydır.


4

Checkstyle , önceki bir şirkette kullandığım başka bir yöntem ... esas olarak stil kontrolü için, ancak bazı statik analizler de yapabilir. Ayrıca, kod kapsamı için Clover , ancak bunun ücretsiz bir araç olmadığını unutmayın.


3

FindBugs ve Checkstyle ile Kod Kapsamı için Clover kullanıyoruz.

Bence, gelişiminizi destekleyen bir tür statik analize sahip olmak önemlidir. Ne yazık ki bu araçların önemli olduğu hala yaygın değil.


1

Ant ile entegre FindBugs ve JDepend kullanıyoruz. JUnit kullanıyoruz ama herhangi bir kapsam aracı kullanmıyoruz.

Rational Application Developer (J2EE uygulamaları geliştirmek için kullandığım IDE) ile entegre olarak kullanmıyorum çünkü Windows konsolunda javac çalıştırdığınızda ne kadar düzgün göründüğünü seviyorum. : P


1

Cobertura ile şansım yaver gitti. Normal yapınızın bir parçası olarak karınca betiğiniz aracılığıyla çalıştırılabilen ve Hudson'a entegre edilebilen bir kod kapsama aracıdır.


1

Ekibimiz PMD ve Cobertura kullanıyor, aslında projelerimiz maven projeleridir ve kod analizi için eklentileri eklemek çok basittir. Asıl soru, hangi analizi kullanmanız gereken belirli bir proje için olacaktır, bence her proje için aynı eklentileri kullanamazsınız.


1

Projemizde checkstyle'ın önünde Sonar kullanıyoruz, pmd .... CI (Bamboo, Hudson) ile birlikte kaynak kalitemizin ve hangi yönlendirmeye gittiğimizin güzel bir geçmişini de elde ediyoruz. Sonar'ı seviyorum, çünkü CI Stack'te bunu sizin için yapan merkezi bir araçsınız ve her proje için kuralları kolayca özelleştirebilirsiniz.



0

Yeni araçlar hakkında bilgi edinmek ve bu bilgiyi tek bir soruda / iş parçacığında pekiştirmek için birçok cevap arıyorum, bu yüzden bu soruya 1 gerçek cevap olacağından şüpheliyim.

Kendi soruma cevabım şu:

  • Findbugs kötü / kodlama yaygın hataları aramak için - maven'den çalıştırın ve ayrıca Eclipse'e kolayca entegre olur
  • Kapsama raporlarımız için Cobertura - maven'den çalıştırın

Hudson'da ayrıca TODO ve FIXME'lerinizin sayısını ve kaynak dosyalarda nerede olduklarını gösteren bir görev tarayıcı eklentisi vardır.

Tümü bizim durumumuzda Maven 1.x ile entegre edilmiş ve check-in üzerine yapılan geliştirmelerimizin yanı sıra gecelik ve haftalık ekstra şeyler çalıştıran Hudson'a bağlanmıştır. Hudson trend grafikleri, JUnit testlerimizi, kapsamımızı, bulma hatalarını ve açık görevlerimizi gösterir. Derleme uyarılarımızı raporlayan ve grafiklendiren bir Hudson eklentisi de vardır. Ayrıca Hudson grafikleri eklentisini kullanarak zaman içinde kendi performans grafikleri ve bellek kullanımı ile birkaç performans testimiz var.

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.