Gradle bietet ein Standard-Plug-In für die Verwendung statischer Analysewerkzeuge. Erfahren Sie, wie Sie sie in Ihr Gradle-Projekt integrieren können.
Wenn Sie etwas falsch finden, lassen Sie es uns bitte wissen oder fordern Sie eine Bearbeitung an. : Bogen:
"Softwaretest aus null Wissen [überarbeitete Ausgabe]" Als ich das Buch las, fand ich plötzlich die zyklomatische Komplexität meines Projekts. Ich möchte die Komplexität messen.
In Java hat Eclipse ein Plug-In, aber ich persönlich möchte Eclipse nur zum Schreiben von Code verwenden, und ich denke auch, dass das Gradle-Plug-In die Reproduktion der Umgebung erleichtert, so Gradle Ich fragte mich, ob es von verwendet werden könnte, und fand heraus, dass das PMD-Plug-In standardmäßig bereitgestellt wird. Es gibt ziemlich viele japanische Kommentarartikel zu diesem Plug-In, und wenn ich mich darauf beziehe, kann ich ohne Probleme messen.
Dieses Mal werde ich vorstellen, wie man es einfach benutzt, einschließlich Plug-Ins, die andere statische Analysewerkzeuge verwenden.
Es wird gesagt, dass die Methode der Analyse ohne Ausführung des Programms so genannt wird. Bei Java analysiert das Tool den Quellcode und den Bytecode. Die automatische Ausführung durch die Maschine kann dazu beitragen, Fehler und Inkonsistenzen zu finden, die für das menschliche Auge schwer zu finden sind, zukünftige eingebettete Fehler zu verhindern und Code in gut lesbaren Code umzuschreiben.
Product | Version |
---|---|
Java SE | 1.8.0_111 |
OS | Windows 10 |
Gradle | 3.2.1 |
Verwenden Sie den zuvor erstellten RatPack-Beispielcode.
Ordnerhierarchie(tree /f)
src
├─main
│ ├─java
│ │ └─jp
│ │ └─toastkid
│ │ ├─libs
│ │ │ └─tinysegmenter
│ │ │ CharacterClassifier.java
│ │ │ ScoreMap.java
│ │ │ TinySegmenter.java
│ │ │
│ │ └─ratpack
│ │ │ Main.java
│ │ │
│ │ └─models
│ │ WordCloud.java
│ │
│ └─resources
│ │ .ratpack
│ │ wordcloud.html
│ │
│ └─public
│ ├─images
│ │ favicon.png
│ │ icon.png
│ │
│ ├─javascripts
│ │ │ jquery-1.6.4.min.js
│ │ │
│ │ ├─d3
│ │ │ d3.js
│ │ │ LICENSE(d3)
│ │ │
│ │ └─d3-cloud
│ │ d3.layout.cloud.js
│ │ index.js
│ │ LICENSE
│ │ package.json
│ │ README.md
│ │
│ └─stylesheets
│ main.css
│
└─test
└─java
└─jp
└─toastkid
└─ratpack
└─models
WordCloudTest.java
PMD Es ist ein statisches Analysewerkzeug, das auf problematischen Code aus grundlegenden Programmierindikatoren hinweist.
Sie können es nur verwenden, indem Sie das Hinzufügen eines Steckers angeben.
build.gradle
apply plugin: 'pmd'
$ gradle pmdmain
Bitte führen Sie die.
Lauf
$ gradle pmdMain
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:pmdMain
BUILD SUCCESSFUL
Total time: 2.938 secs
Die Berichtsdatei wird im HTML- und XML-Format in `` `build / reports / pmd``` ausgegeben.
Basic, das standardmäßig verwendet wird, enthält nur wenige Kontrollkästchen. Fügen wir also ein wenig hinzu. In PMD können Sie die Regeln verwenden, die unter dem folgenden Link veröffentlicht werden.
http://pmd.sourceforge.net/pmd-4.3.0/rules/index.html
Die zyklomatische Komplexität kann mit CodeSize gemessen werden. Fügen wir diesmal Klammern und CodeSize hinzu. Beachten Sie, dass bei der Angabe der Regel das Präfix `` `java-``` erforderlich war.
build.gradle
pmd {
ruleSets = [
'java-braces',
'java-codesize',
]
}
$ gradle pmdmain
Bitte führen Sie die.
Lauf
$ gradle pmdMain
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:pmdMain FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':pmdMain'.
> 10 PMD rule violations were found. See the report at: file:///C:/Users/Toast%20kid/Documents/workspace/ratpack_word_cloud-master/build/reports/pmd/main.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 2.266 secs
Der Build schlug gewaltsam fehl, weil die Anzahl der Anzeigen über einem bestimmten Niveau lag.
project\src\main\java\jp\toastkid\libs\tinysegmenter\ScoreMap.java 1492 The constructor 'ScoreMap' has a Cyclomatic Complexity of 43.
Es wurde darauf hingewiesen, dass "ScoreMap.java-Konstruktoren 43 zyklomatische Komplexitäten aufweisen". Je niedriger dieser Wert ist, desto präziser ist der Code. Mehr als 20 sind vorsichtshalber und mehr als 50 sind recht komplex. Standardmäßig gibt CodeSize eine Warnung aus, wenn 10 oder mehr vorhanden sind.
C = Anzahl der Programmrouten - Anzahl der Programmverzweigungspunkte + 2
Das ist nicht immer gut, aber in diesem Fall können Sie `` ignoreFailures = true``` hinzufügen und der Build wird erfolgreich sein.
build.gradle
pmd {
ignoreFailures = true
ruleSets = [
……
}
$ gradle pmdmain
Bitte führen Sie die.
Lauf
$ gradle pmdMain
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:pmdMain
10 PMD rule violations were found. See the report at: file:///C:/Users/Toast%20kid/Documents/workspace/ratpack_word_cloud-master/build/reports/pmd/main.html
BUILD SUCCESSFUL
Total time: 2.25 secs
FindBugs Es ist ein statisches Analysetool, das auf potenzielle Fehler im Java-Code hinweist.
Zu build.gradle hinzufügen.
build.gradle
apply plugin: 'findbugs'
$ gradle findbugsmain
Führen Sie die Analyse mit dem Befehl aus.
Lauf
$ gradle findbugsMain
:compileJava
:processResources
:classes
:findbugsMain
Download https://repo1.maven.org/maven2/com/google/code/findbugs/findbugs/3.0.1/findbugs-3.0.1.pom
...(Unterlassung)...
Download https://repo1.maven.org/maven2/org/ow2/asm/asm/5.0.2/asm-5.0.2.jar
:findbugsMain
FindBugs rule violations were found. See the report at: projet/build/reports/findbugs/main.xml
Das Analyseergebnis wird in XML ausgegeben. Ich möchte es in HTML sehen, konnte die Option jedoch nicht finden.
Sample
<BugInstance type="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE" priority="2" rank="13" abbrev="NP" category="STYLE">
<Class classname="jp.toastkid.jfx.common.Style">
<SourceLine classname="jp.toastkid.jfx.common.Style" start="36" end="137" sourcefile="Style.java" sourcepath="jp/toastkid/jfx/common/Style.java"/>
</Class>
<Method classname="jp.toastkid.jfx.common.Style" name="findJarResourceDir" signature="()Ljava/util/List;" isStatic="true">
<SourceLine classname="jp.toastkid.jfx.common.Style" start="117" end="137" startBytecode="0" endBytecode="633" sourcefile="Style.java" sourcepath="jp/toastkid/jfx/common/Style.java"/>
</Method>
<LocalVariable name="?" register="-1" pc="219" role="LOCAL_VARIABLE_UNKNOWN"/>
<SourceLine classname="jp.toastkid.jfx.common.Style" start="133" end="133" startBytecode="219" endBytecode="219" sourcefile="Style.java" sourcepath="jp/toastkid/jfx/common/Style.java" role="SOURCE_LINE_INVOKED"/>
<SourceLine classname="jp.toastkid.jfx.common.Style" start="133" end="133" startBytecode="216" endBytecode="216" sourcefile="Style.java" sourcepath="jp/toastkid/jfx/common/Style.java" role="SOURCE_LINE_KNOWN_NULL"/>
<Property name="edu.umd.cs.findbugs.detect.NullDerefProperty.DEREFS_ARE_CLONED" value="true"/>
</BugInstance>
Wenn Sie diesem Plug-In `` `ignoreFailures = true``` hinzufügen, wird der Build nicht als Fehler behandelt, unabhängig davon, wie viele Warnungen ausgegeben werden.
build.gradle
findbugs {
ignoreFailures = true
Checkstyle Checkstyle ist ein Tool zum Überprüfen, ob der Java-Quellcode den Codierungsstandards entspricht.
Fügen Sie build.gradle die folgende Zeile hinzu.
build.gradle
apply plugin: 'checkstyle'
$ gradle check
Führen Sie die Prüfung mit aus. Wenn Sie dieses Plug-In alleine überprüfen möchten$ gradle checkstylemain
Es ist möglich mit.
Lauf(Fehler)
$ gradle check
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:checkstyleMain
Download https://repo1.maven.org/maven2/com/puppycrawl/tools/checkstyle/5.9/checkstyle-5.9.pom
……(Unterlassung)……
Download https://repo1.maven.org/maven2/com/google/guava/guava-jdk5/14.0.1/guava-jdk5-14.0.1.jar
:checkstyleMain FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':checkstyleMain'.
> Unable to create a Checker: unable to find project\config\checkstyle\checkstyle.xml
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 7.326 secs
Wenn Sie die Prüfung mit nichts ausführen, schlägt dies wie oben beschrieben fehl. Sie müssen eine Checkstyle-Einstellungsdatei vorbereiten. Rufen Sie daher die Konfigurationsdatei, die die Regeln von Sun reproduziert aus dem Folgenden ab.
https://github.com/checkstyle/checkstyle
Fügen Sie den Ordner `config / checkstyle``` zum Stammverzeichnis Ihres Projekts hinzu und legen Sie dort die`
checkstyle.xml``` ab.
Der Befehl ist der gleiche wie zuvor.
Lauf
$ gradle check
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:checkstyleMain FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':checkstyleMain'.
> Unable to create a Checker: Property 'fileExtensions' in module Checker does not exist, please check the documentation
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 1.782 secs
Es wird gesagt, dass fileExtensions nicht existiert.
Kommentieren Sie das relevante Teil aus und versuchen Sie es auszuführen.
Lauf
$ gradle check
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:checkstyleMain
[ant:checkstyle] project\src\main\java\jp\toastkid\libs\tinysegmenter\CharacterClassifier.java:0: Missing package-info.java file.
[ant:checkstyle] project\src\main\java\jp\toastkid\libs\tinysegmenter\CharacterClassifier.java:0:Die Datei endet nicht mit einer neuen Zeile.
……(Weggelassen, weil es zu viele Punkte gibt)……
[ant:checkstyle] project\src\main\java\jp\toastkid\ratpack\models\WordCloud.java:79:58: 'str'Zu@Benötigt param tag.
:checkstyleMain FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':checkstyleMain'.
> Checkstyle rule violations were found. See the report at: project/build/reports/checkstyle/main.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 3.639 secs
Nun, der Code, den ich dieses Mal vorbereitet habe, war wirklich schrecklich ... Selbst mit diesem Plug-In schlägt der Build fehl, wenn eine Warnung ausgegeben wird, wenn ignoreFailures
falsch ist. Der Bericht wurde erstellt. Schauen wir uns das an.
Berichtsdateien werden in HTML und XML unter `build / reports / checkstyle /`
generiert.
Wenn Sie diesem Plug-In `` `ignoreFailures = true``` hinzufügen, wird der Build nicht als Fehler behandelt, unabhängig davon, wie viele Warnungen ausgegeben werden.
build.gradle
checkstyle {
ignoreFailures = true
JaCoCo Ein Plug-In, das Testberichte ausgibt. Sie können die Testabdeckung messen und visuell referenzieren. Der Name scheint das Akronim von "** Ja ** va ** Co ** de ** Co ** verage" zu sein.
Fügen Sie das JaCoCo-Plug-In zu build.gradle hinzu.
build.gradle
apply plugin: "jacoco"
Der Testbuild muss ausgeführt werden. Führen Sie es diesmal mit `$ gradle test jacocoTestReport
`aus.
Lauf
$ gradle test jacocoTestReport
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
:jacocoTestReport
BUILD SUCCESSFUL
Total time: 3.448 secs
Standardmäßig werden Testberichte im HTML-Format unter `build / reports / jacoco / test / html / index.html
`generiert.
packages
classes
methods
Es wird feiner in der Reihenfolge von Paketen-> Klassen-> Methoden.
Wenn Sie einen Methodennamen auswählen, zeigt ein grüner Hintergrund an, welcher Teil der Klasse aus dem Testcode aufgerufen wurde, und ein roter Hintergrund zeigt an, wo er nicht bestanden wurde. Es ist sehr leicht zu verstehen.
JDpend Es scheint ein Werkzeug für die statische Analyse von Paket zu Paket zu sein.
build.gradle
apply plugin: 'jdepend'
$ gradle jdependmain
Laufen Sie mit.
Lauf
$ gradle jdependMain
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jdependMain
Download https://repo1.maven.org/maven2/jdepend/jdepend/2.9.1/jdepend-2.9.1.pom
Download https://repo1.maven.org/maven2/org/apache/ant/ant-jdepend/1.9.6/ant-jdepend-1.9.6.pom
Download https://repo1.maven.org/maven2/org/apache/ant/ant-parent/1.9.6/ant-parent-1.9.6.pom
Download https://repo1.maven.org/maven2/jdepend/jdepend/2.9.1/jdepend-2.9.1.jar
Download https://repo1.maven.org/maven2/org/apache/ant/ant-jdepend/1.9.6/ant-jdepend-1.9.6.jar
[ant:jdependreport] ependMain
[ant:jdependreport] Unknown constant: 18
BUILD SUCCESSFUL
Total time: 3.719 secs
Berichtsdateien werden im XML-Format in `` `build / reports / jdepend``` generiert.
Wenn Sie diesem Plug-In `` `ignoreFailures = true``` hinzufügen, wird der Build nicht als Fehler behandelt, unabhängig davon, wie viele Warnungen ausgegeben werden.
build.gradle
JDepend {
ignoreFailures = true
Es hat nichts mit statischen Analysewerkzeugen zu tun, aber ich habe gelernt, dass es ein solches Plug-In zu geben scheint, also werde ich es versuchen.
Fügen Sie das Plug-In zu build.gradle hinzu.
build.gradle
apply plugin: 'project-report'
$ gradle projectreport
Generieren Sie alle Berichte mit.
Lauf
$ gradle projectReport
:dependencyReport
:htmlDependencyReport
:propertyReport
:taskReport
:projectReport
BUILD SUCCESSFUL
Total time: 1.472 secs
build/reports/project/dependencies/root.Es wird in HTML ausgegeben. Zum Anzeigen benötigen Sie die Berechtigung zum Ausführen von JavaScript.
![projectReport.png](https://qiita-image-store.s3.amazonaws.com/0/102004/afbec792-774d-583f-ce7f-50f8aad62ea9.png)
Es zeigt nicht nur Abhängigkeiten bei der Anwendungskompilierung, sondern auch Plugin-Abhängigkeiten. Wenn das Textformat gut ist, wird es in `` `build / reports / project / dependencies.txt`` `generiert, daher sollten Sie darauf verweisen.
## Referenz
- [Kapitel 41 Projektbericht-Plugin](http://gradle.monochromeroad.com/docs/userguide/project_reports_plugin.html)
----
[License Gradle Plugin](https://github.com/hierynomus/license-gradle-plugin)
Es ist kein Standard-Plug-In, aber ich fand es einfach und nützlich zu installieren, also werde ich darüber schreiben. Dies ist ein Plug-In, das die Lizenz des Projekts auf die Abhängigkeit zurückführt und an den Bericht ausgibt.
Je nach Unternehmen kann es erforderlich sein, die Lizenz vor der Verwendung der OSS-Bibliothek oder vor der Freigabe des Liefergegenstandes zu überprüfen. Wenn es jedoch schwierig ist, pom.xml nacheinander zu befolgen, sollten Sie dieses Plug-In einführen. Sie können es versuchen.
## Einführung
[Geben Sie die Lizenzliste der Abhängigkeiten mit gradle aus](http://blog.olivinecafe.info/post/105264504040/gradle%E3%81%A7dependencies%E3%81%AE%E3%83%A9%E3%82% A4% E3% 82% BB% E3% 83% B3% E3% 82% B9% E4% B8% 80% E8% A6% A7% E3% 82% 92% E5% 87% BA% E5% 8A% 9B% Wenn Sie sich auf E3% 81% 99% E3% 82% 8B beziehen, können Sie es sofort installieren.
Fügen Sie build.gradle Folgendes hinzu, und Sie können loslegen.
#### **`build.gradle`**
```groovy
apply plugin: "com.github.hierynomus.license"
......
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "gradle.plugin.nl.javadude.gradle.plugins:license-gradle-plugin:0.13.1"
}
}
$ gradle downloadlicenses
Bitte führen Sie die.
Lauf
$ gradle downloadLicenses
:downloadLicenses
BUILD SUCCESSFUL
Total time: 10.753 secs
build/reports/license/
Im Ordner werden zwei Arten von HTML und XML für insgesamt vier Dateien generiert.
Dateiname | Erläuterung |
---|---|
license-dependency | Zusammenfassung nach Lizenz |
dependency-license | Zusammenfassung nach Abhängigkeitseinheiten |
license-dependency
dependency-license
`Lizenzabhängigkeit``` ist nützlich, um nach GPL-basierten Lizenzen zu suchen, und`
Abhängigkeitslizenz``` wird empfohlen, wenn Sie nach einzelnen Lizenzen suchen müssen. ..
Ich habe die Verwendung eines statischen Analysetools vorgestellt, das einfach über das Gradle-Plug-In verwendet werden kann. Es ist wichtig, dass diese Tools automatisch regelmäßig über CI ausgeführt werden, anstatt jedes Mal durch Eingabe von Befehlen ausgeführt zu werden.
Ordnerhierarchie(tree /f)
build
│
└─reports
├─jacoco
│ └─test
│ └─html
│ │ index.html
│ │ jacoco-sessions.html
│ │
│ ├─jacoco-resources
│ │ branchfc.gif
│ │ branchnc.gif
│ │ branchpc.gif
│ │ bundle.gif
│ │ class.gif
│ │ down.gif
│ │ greenbar.gif
│ │ group.gif
│ │ method.gif
│ │ package.gif
│ │ prettify.css
│ │ prettify.js
│ │ redbar.gif
│ │ report.css
│ │ report.gif
│ │ session.gif
│ │ sort.gif
│ │ sort.js
│ │ source.gif
│ │ up.gif
│ │
│ ├─jp.toastkid.libs.tinysegmenter
│ │ CharacterClassifier.html
│ │ CharacterClassifier.java.html
│ │ index.html
│ │ index.source.html
│ │ ScoreMap.html
│ │ ScoreMap.java.html
│ │ TinySegmenter.html
│ │ TinySegmenter.java.html
│ │
│ ├─jp.toastkid.ratpack
│ │ index.html
│ │ index.source.html
│ │ Main.html
│ │ Main.java.html
│ │
│ └─jp.toastkid.ratpack.models
│ index.html
│ index.source.html
│ WordCloud.html
│ WordCloud.java.html
│
├─license
│ dependency-license.html
│ dependency-license.xml
│ license-dependency.html
│ license-dependency.xml
│
├─pmd
│ main.html
│ main.xml
│
├─project
│ │ dependencies.txt
│ │ properties.txt
│ │ tasks.txt
│ │
│ └─dependencies
│ │ index.html
│ │ root.html
│ │ root.js
│ │
│ ├─css
│ │ base-style.css
│ │ style.css
│ │ tree.css
│ │
│ ├─images
│ │ d.gif
│ │ d.png
│ │ throbber.gif
│ │
│ └─js
│ jquery.jstree.js
│ jquery.min-1.11.0.js
│ script.js
│
└─tests
└─test
│ index.html
│
├─classes
│ jp.toastkid.ratpack.models.WordCloudTest.html
│
├─css
│ base-style.css
│ style.css
│
├─js
│ report.js
│
└─packages
jp.toastkid.ratpack.models.html
Recommended Posts