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.
java
code-coverage
static-analysis
Joshua McKinnon
sumber
sumber
Jawaban:
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:
Ini sering disebut "format Emacs", tetapi meskipun Anda tidak menggunakan Emacs, ini adalah format yang masuk akal untuk menyeragamkan laporan. Sebagai contoh:
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@SuppressWarnings
anotasi Java . Saya mengonfigurasi PMD untuk menggunakan komentar yang berisi "SuppressWarning(PMD.
" alih-alihNOPMD
agar penekanan PMD terlihat sama. Saya mengisi aturan tertentu yang dilanggar saat menggunakan penekanan gaya komentar:Hanya bagian "
SuppressWarnings(PMD.
" yang signifikan untuk komentar, tetapi konsisten dengan dukungan PMD untuk@SuppressWarning
anotasi yang mengenali pelanggaran aturan individu berdasarkan nama: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:OFF
danCHECKSTYLE: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:Dengan komentar Checkstyle, pelanggaran centang tertentu (
HiddenField
) menjadi signifikan karena setiap tanda centang memilikiBEGIN/END
pasangan komentar " " sendiri .FindBugs juga mendukung penghentian pembuatan peringatan dengan
@SuppressWarnings
anotasi, jadi tidak diperlukan konfigurasi lebih lanjut untuk mencapai beberapa tingkat keseragaman dengan alat lain. Sayangnya, Findbugs harus mendukung@SuppressWarnings
anotasi khusus karena anotasi Java@SuppressWarnings
bawaan memilikiSOURCE
kebijakan 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@SuppressWarnings
anotasi Java :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.sumber
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 .
sumber
Semua hal berikut ini kami gunakan dan integrasikan dengan mudah di kedua build Maven 2.x kami dan Eclipse / RAD 7:
Selain itu, dalam build Maven kami, kami memiliki:
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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
sumber
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.
sumber
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.
sumber
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.
sumber
Structure 101 bagus dalam analisis kode dan menemukan dependensi paket siklik.
sumber
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:
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.
sumber