Alat analisis kode apa yang Anda gunakan untuk proyek Java Anda? [Tutup]

117

Alat analisis kode apa yang Anda gunakan pada proyek Java Anda?

Saya tertarik pada semua jenis

  • alat analisis kode statis (FindBugs, PMD, dan lainnya)
  • alat cakupan kode (Cobertura, Emma, ​​dan lainnya)
  • alat berbasis instrumentasi lainnya
  • apa pun, jika saya melewatkan sesuatu

Jika memungkinkan, nyatakan juga alat build yang Anda gunakan dan seberapa baik alat ini terintegrasi dengan IDE dan alat build Anda.

Jika suatu alat hanya tersedia dengan cara tertentu (sebagai plugin IDE, atau, katakanlah, plugin alat build) informasi itu juga perlu diperhatikan.

Joshua McKinnon
sumber
Lihat juga UCDetector: ucdetector.org
Christophe
Akan checkout Pitest untuk cakupan tes mutasi.
mucaho

Jawaban:

70

Untuk alat analisis statis saya sering menggunakan CPD, PMD , FindBugs , dan Checkstyle .

CPD adalah alat PMD "Copy / Paste Detector". Saya menggunakan PMD untuk beberapa saat sebelum saya melihat link "Menemukan Kode yang Digandakan" di halaman web PMD .

Saya ingin menunjukkan bahwa alat-alat ini terkadang dapat diperluas melampaui seperangkat aturan "di luar kotak" mereka. Dan bukan hanya karena ini open source sehingga Anda dapat menulis ulang. Beberapa alat ini dilengkapi dengan aplikasi atau "pengait" yang memungkinkannya diperpanjang. Misalnya, PMD dilengkapi dengan alat "desainer" yang memungkinkan Anda membuat aturan baru. Selain itu, Checkstyle memiliki cek DescendantToken yang memiliki properti yang memungkinkan penyesuaian substansial.

Saya mengintegrasikan alat ini dengan build berbasis Ant . Anda dapat mengikuti tautan untuk melihat konfigurasi saya yang dikomentari.

Selain integrasi sederhana ke dalam build, saya merasa terbantu untuk mengonfigurasi alat agar agak "terintegrasi" dalam beberapa cara lain. Yakni, pembuatan laporan dan keseragaman penekanan peringatan. Saya ingin menambahkan aspek ini ke diskusi ini (yang mungkin juga memiliki tag "analisis-statis"): bagaimana orang mengonfigurasi alat ini untuk membuat solusi "terpadu"? (Saya telah menanyakan pertanyaan ini secara terpisah di sini )

Pertama, untuk laporan peringatan, saya mengubah output sehingga setiap peringatan memiliki format sederhana:

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

Ini sering disebut "format Emacs", tetapi meskipun Anda tidak menggunakan Emacs, ini adalah format yang masuk akal untuk menyeragamkan laporan. Sebagai contoh:

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

Transformasi format peringatan saya dilakukan oleh skrip Ant saya dengan rantai filter Ant .

"Integrasi" kedua yang saya lakukan adalah untuk menekan peringatan. Secara default, setiap alat mendukung komentar atau anotasi (atau keduanya) yang dapat Anda tempatkan di kode Anda untuk membungkam peringatan yang ingin Anda abaikan. Namun berbagai permintaan penekanan peringatan ini tidak memiliki tampilan yang konsisten yang tampaknya agak konyol. Saat Anda menekan sebuah peringatan, Anda menekan sebuah peringatan, jadi mengapa tidak selalu menulis " SuppressWarning?"

Misalnya, konfigurasi default PMD menekan pembuatan peringatan pada baris kode dengan string " NOPMD" dalam komentar. Selain itu, PMD mendukung @SuppressWarningsanotasi Java . Saya mengonfigurasi PMD untuk menggunakan komentar yang berisi " SuppressWarning(PMD." alih-alih NOPMDagar penekanan PMD terlihat sama. Saya mengisi aturan tertentu yang dilanggar saat menggunakan penekanan gaya komentar:

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

Hanya bagian " SuppressWarnings(PMD." yang signifikan untuk komentar, tetapi konsisten dengan dukungan PMD untuk @SuppressWarninganotasi yang mengenali pelanggaran aturan individu berdasarkan nama:

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

Demikian pula, Checkstyle menekan pembuatan peringatan di antara pasangan komentar (tidak ada dukungan anotasi yang disediakan). Secara default, komentar untuk menonaktifkan dan mengaktifkan Checkstyle berisi string CHECKSTYLE:OFFdan CHECKSTYLE:ON, masing-masing. Mengubah konfigurasi ini (dengan "SuppressionCommentFilter" dari Checkstyle) untuk menggunakan string " BEGIN SuppressWarnings(CheckStyle." dan " END SuppressWarnings(CheckStyle." membuat kontrol lebih mirip PMD:

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

Dengan komentar Checkstyle, pelanggaran centang tertentu ( HiddenField) menjadi signifikan karena setiap tanda centang memiliki BEGIN/ENDpasangan komentar " " sendiri .

FindBugs juga mendukung penghentian pembuatan peringatan dengan @SuppressWarningsanotasi, jadi tidak diperlukan konfigurasi lebih lanjut untuk mencapai beberapa tingkat keseragaman dengan alat lain. Sayangnya, Findbugs harus mendukung @SuppressWarningsanotasi khusus karena anotasi Java @SuppressWarningsbawaan memiliki SOURCEkebijakan penyimpanan yang tidak cukup kuat untuk mempertahankan anotasi di file kelas tempat FindBugs membutuhkannya. Saya sepenuhnya memenuhi syarat penindasan peringatan FindBugs untuk menghindari bentrok dengan @SuppressWarningsanotasi Java :

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

Teknik ini membuat segala sesuatunya terlihat cukup konsisten di seluruh alat. Perhatikan bahwa setiap penekanan peringatan berisi string " SuppressWarnings" memudahkan untuk menjalankan pencarian sederhana untuk menemukan semua contoh untuk semua alat di seluruh basis kode.

Greg Mattes
sumber
wow, jawaban yang cukup detail. terima kasih sudah berbagi. saya akan meniru praktik Anda ke dalam praktik pengkodean saya.
Vatsala
16

Saya menggunakan kombinasi Cobertura, Checkstyle, (Ecl) Emma dan Findbugs.

EclEmma adalah plugin Eclipse yang luar biasa yang menunjukkan cakupan kode dengan mewarnai sumber java di editor ( tangkapan layar ) - cakupan dihasilkan dengan menjalankan tes JUnit. Ini sangat berguna ketika Anda mencoba untuk mencari tahu garis mana yang tercakup dalam kelas tertentu, atau jika Anda ingin melihat garis mana yang tercakup dalam satu tes. Ini jauh lebih ramah pengguna dan berguna daripada membuat laporan dan kemudian melihat laporan tersebut untuk melihat kelas mana yang memiliki cakupan rendah.

Plugin Checkstyle dan Findbugs Eclipse juga berguna, mereka menghasilkan peringatan di editor saat Anda mengetik.

Maven2 memiliki plugin laporan yang bekerja dengan alat di atas untuk menghasilkan laporan pada waktu pembuatan. Kami menggunakan ini untuk mendapatkan laporan proyek secara keseluruhan, yang lebih berguna saat Anda menginginkan angka agregat. Ini dihasilkan oleh build CI kami, yang dijalankan menggunakan Continuum .

Ken Liu
sumber
1
wow @ EclEmma! Saya tahu tentang Emma, ​​tetapi terintegrasi langsung ke Eclipse? Aturan itu.
Joshua McKinnon
3
Continuum menyebalkan, aturan Hudson.
Ken Liu
11

Semua hal berikut ini kami gunakan dan integrasikan dengan mudah di kedua build Maven 2.x kami dan Eclipse / RAD 7:

  • Pengujian - JUnit / TestNG
  • Analisis kode - FindBugs, PMD
  • Cakupan kode - Semanggi

Selain itu, dalam build Maven kami, kami memiliki:

  • JDepend
  • Pemeriksa tag (TODO, FIXME, dll)

Lebih lanjut, jika Anda menggunakan Maven 2.x, CodeHaus memiliki koleksi plugin Maven yang berguna di proyek Mojo mereka .

Catatan: Clover memiliki integrasi out-of-the-box dengan server Bamboo CI (karena keduanya adalah produk Atlassian). Ada juga plugin Bamboo untuk FindBugs, PMD, dan CheckStyle tetapi, seperti yang dicatat, server Hudson CI gratis juga memilikinya.

Brian Laframboise
sumber
9

Saya menggunakan analisis statis yang dibangun ke dalam IntelliJ IDEA. Integrasi sempurna.

Saya menggunakan cakupan kode yang dibangun ke dalam Intellij IDEA (berdasarkan EMMA). Sekali lagi, integrasi sempurna.

Solusi terintegrasi ini dapat diandalkan, bertenaga, dan mudah digunakan dibandingkan dengan menyatukan alat dari berbagai vendor.

Steve McLeod
sumber
4

Checkstyle adalah salah satu yang saya gunakan di perusahaan sebelumnya ... ini terutama untuk pemeriksaan gaya, tetapi juga dapat melakukan beberapa analisis statis. Juga, Clover untuk cakupan kode, meskipun ketahuilah bahwa ini bukan alat gratis.

Mike Stone
sumber
3

Kami menggunakan FindBugs dan Checkstyle serta Clover untuk Cakupan Kode.

Saya pikir penting untuk memiliki semacam analisis statis, yang mendukung pengembangan Anda. Sayangnya masih belum tersebar luas bahwa alat-alat ini penting.

dlinsin
sumber
1

Kami menggunakan FindBugs dan JDepend yang terintegrasi dengan Ant. Kami menggunakan JUnit tetapi kami tidak menggunakan alat cakupan apa pun.

Saya tidak menggunakannya terintegrasi dengan Rational Application Developer (IDE yang saya gunakan untuk mengembangkan aplikasi J2EE) karena saya suka tampilannya yang rapi ketika Anda menjalankan javac di konsol Windows. : P

ggasp
sumber
1

Saya beruntung dengan Cobertura. Ini adalah alat cakupan kode yang dapat dijalankan melalui skrip ant Anda sebagai bagian dari build normal Anda dan dapat diintegrasikan ke dalam Hudson.

Randyaa
sumber
1

Tim kami menggunakan PMD dan Cobertura, sebenarnya proyek kami adalah proyek maven dan sangat mudah untuk menyertakan plugin untuk analisis kode. Pertanyaan sebenarnya adalah untuk proyek tertentu analisis mana yang perlu Anda gunakan, pendapat saya adalah Anda tidak dapat menggunakan plugin yang sama untuk setiap proyek.

vaske
sumber
1

dalam proyek kami, kami menggunakan Sonar di depan checkstyle, pmd .... bersama dengan CI (Bambu, Hudson) kami juga mendapatkan riwayat yang bagus tentang kualitas sumber kami dan apa yang mengarahkan kami pergi. Saya suka Sonar, karena Anda satu alat utama di CI Stack yang melakukannya untuk Anda, dan Anda dapat dengan mudah menyesuaikan aturan untuk setiap proyek.

Satu sen
sumber
1

Structure 101 bagus dalam analisis kode dan menemukan dependensi paket siklik.

Jeffrey Lee
sumber
0

Saya mencari banyak jawaban untuk mempelajari alat-alat baru dan mengkonsolidasikan pengetahuan ini dalam satu pertanyaan / utas, jadi saya ragu akan ada 1 jawaban yang benar untuk pertanyaan ini.

Jawaban saya untuk pertanyaan saya sendiri adalah yang kami gunakan:

  • Findbugs untuk mencari kesalahan umum bad / coding - dijalankan dari maven, dan juga terintegrasi dengan mudah ke dalam Eclipse
  • Cobertura untuk laporan cakupan kami - dijalankan dari maven

Hudson juga memiliki plugin pemindai tugas yang akan menampilkan hitungan TODO dan FIXME Anda, serta menunjukkan di mana mereka berada di file sumber.

Semua terintegrasi dengan Maven 1.x dalam kasus kami dan terikat ke Hudson, yang menjalankan build kami saat check-in serta hal-hal tambahan setiap malam dan mingguan. Tren Hudson membuat grafik pengujian JUnit, cakupan, findbugs, serta tugas terbuka kami. Ada juga plugin Hudson yang melaporkan dan membuat grafik peringatan kompilasi kami. Kami juga memiliki beberapa tes kinerja dengan grafik kinerja dan penggunaan memori mereka sendiri dari waktu ke waktu menggunakan plugin plot Hudson juga.

Joshua McKinnon
sumber