From f2f56a00c7c30514cdeb065acbeffc447dcfe2f4 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 21:21:54 +0900 Subject: [PATCH 01/13] =?UTF-8?q?CI=20=EA=B8=B0=EC=B4=88=20:=20jacoco=20+?= =?UTF-8?q?=20spotless=20=ED=94=8C=EB=9F=AC=EA=B7=B8=EC=9D=B8=20=EC=8B=A4?= =?UTF-8?q?=EC=8A=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. jacoco 플러그인을 적용해 테스트 커버리지 확인 가능 2. spotless 플러그인을 통해 팀 내의 코드 컨벤션 체크 및 자동 적용 --- practice-gradle/app/build.gradle.kts | 23 ++++++++++++++++++- .../app/src/main/java/org/example/App.java | 7 ++++++ .../src/main/java/org/example/item/Item.java | 13 +++++++++++ .../src/test/java/org/example/AppTest.java | 4 +++- 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 practice-gradle/app/src/main/java/org/example/item/Item.java diff --git a/practice-gradle/app/build.gradle.kts b/practice-gradle/app/build.gradle.kts index 8ce74f5..6944196 100644 --- a/practice-gradle/app/build.gradle.kts +++ b/practice-gradle/app/build.gradle.kts @@ -9,6 +9,7 @@ plugins { // Apply the application plugin to add support for building a CLI application in Java. application id("com.diffplug.spotless") version "7.0.3" + jacoco } repositories { @@ -18,11 +19,22 @@ repositories { spotless{ java { - googleJavaFormat("1.20.0").aosp() + googleJavaFormat("1.20.0") + .aosp() target("src/**/*.java") + + importOrder("java|javax", "org", "com.mycorp", "", "\\#") + removeUnusedImports() + + trimTrailingWhitespace() + endWithNewline() } } +jacoco { + toolVersion = "0.8.13" +} + dependencies { // Use JUnit Jupiter for testing. testImplementation(libs.junit.jupiter) @@ -48,4 +60,13 @@ application { tasks.named("test") { // Use JUnit Platform for unit tests. useJUnitPlatform() + finalizedBy(tasks.jacocoTestReport) } +tasks.jacocoTestReport { + dependsOn(tasks.test) + reports { + html.required.set(true) + xml.required.set(true) + } +} + diff --git a/practice-gradle/app/src/main/java/org/example/App.java b/practice-gradle/app/src/main/java/org/example/App.java index 8e74367..1b8a09a 100644 --- a/practice-gradle/app/src/main/java/org/example/App.java +++ b/practice-gradle/app/src/main/java/org/example/App.java @@ -3,6 +3,11 @@ */ package org.example; +import java.util.ArrayList; +import java.util.List; + +import org.example.item.Item; + public class App { public String getGreeting() { return "Hello Second World!"; @@ -10,5 +15,7 @@ public String getGreeting() { public static void main(String[] args) { System.out.println(new App().getGreeting()); + Item item = new Item(); + List list = new ArrayList(); } } diff --git a/practice-gradle/app/src/main/java/org/example/item/Item.java b/practice-gradle/app/src/main/java/org/example/item/Item.java new file mode 100644 index 0000000..ccfc095 --- /dev/null +++ b/practice-gradle/app/src/main/java/org/example/item/Item.java @@ -0,0 +1,13 @@ +package org.example.item; + +import java.util.ArrayList; +import java.util.List; + +public class Item { + + List names = new ArrayList(); + + public void addName(String name) { + names.add(name); + } +} diff --git a/practice-gradle/app/src/test/java/org/example/AppTest.java b/practice-gradle/app/src/test/java/org/example/AppTest.java index f5ce33d..a1d15c8 100644 --- a/practice-gradle/app/src/test/java/org/example/AppTest.java +++ b/practice-gradle/app/src/test/java/org/example/AppTest.java @@ -4,10 +4,12 @@ package org.example; import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.*; class AppTest { - @Test void appHasAGreeting() { + @Test + void appHasAGreeting() { App classUnderTest = new App(); assertNotNull(classUnderTest.getGreeting(), "app should have a greeting"); } From 2547afe12b5fc402e81c107772c4d79494ec7642 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 22:01:27 +0900 Subject: [PATCH 02/13] =?UTF-8?q?SpotBugs=20=ED=94=8C=EB=9F=AC=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드 정적 분석 도구로 CI과정이 길어질 수 있어 사용에 주의해야한다. --- practice-gradle/app/build.gradle.kts | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/practice-gradle/app/build.gradle.kts b/practice-gradle/app/build.gradle.kts index 6944196..27b02f0 100644 --- a/practice-gradle/app/build.gradle.kts +++ b/practice-gradle/app/build.gradle.kts @@ -1,3 +1,5 @@ +import com.github.spotbugs.snom.SpotBugsTask + /* * This file was generated by the Gradle 'init' task. * @@ -10,6 +12,7 @@ plugins { application id("com.diffplug.spotless") version "7.0.3" jacoco + id("com.github.spotbugs") version "6.1.10" } repositories { @@ -35,6 +38,12 @@ jacoco { toolVersion = "0.8.13" } +spotbugs { + toolVersion.set("4.9.3") + effort.set(com.github.spotbugs.snom.Effort.MAX) + reportLevel.set(com.github.spotbugs.snom.Confidence.MEDIUM) +} + dependencies { // Use JUnit Jupiter for testing. testImplementation(libs.junit.jupiter) @@ -62,6 +71,7 @@ tasks.named("test") { useJUnitPlatform() finalizedBy(tasks.jacocoTestReport) } + tasks.jacocoTestReport { dependsOn(tasks.test) reports { @@ -70,3 +80,31 @@ tasks.jacocoTestReport { } } +tasks.named("spotbugsMain") { + + // 필요 시 커스텀 클래스 경로 지정 + // classes.setFrom(sourceSets.main.get().output) + + reports.apply { + /* HTML */ + create("html") { + required.set(true) + outputLocation.set( + layout.buildDirectory.file("reports/spotbugs/${name}.html") + ) + setStylesheet("fancy-hist.xsl") + } + + /* XML — SonarQube, CI 파싱용 */ + create("xml") { + required.set(true) + } + + /* SARIF — GitHub Code Scanning 용 (필요 없으면 true→false) */ + create("sarif") { + required.set(false) + } + } +} + +tasks.check { dependsOn("spotbugsMain") } \ No newline at end of file From ad99572d470b64316e281fc47bfd7873db35d7d3 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 22:25:52 +0900 Subject: [PATCH 03/13] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=98=88=EC=8B=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- practice-gradle/app/build.gradle.kts | 1 + .../src/main/java/org/example/item/Item.java | 13 +++++---- .../test/java/org/example/item/ItemTest.java | 28 +++++++++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 practice-gradle/app/src/test/java/org/example/item/ItemTest.java diff --git a/practice-gradle/app/build.gradle.kts b/practice-gradle/app/build.gradle.kts index 27b02f0..6b5087d 100644 --- a/practice-gradle/app/build.gradle.kts +++ b/practice-gradle/app/build.gradle.kts @@ -52,6 +52,7 @@ dependencies { // This dependency is used by the application. implementation(libs.guava) + testImplementation("org.assertj:assertj-core:3.27.3") } // Apply a specific Java toolchain to ease working on different environments. diff --git a/practice-gradle/app/src/main/java/org/example/item/Item.java b/practice-gradle/app/src/main/java/org/example/item/Item.java index ccfc095..1a8d77f 100644 --- a/practice-gradle/app/src/main/java/org/example/item/Item.java +++ b/practice-gradle/app/src/main/java/org/example/item/Item.java @@ -1,13 +1,14 @@ package org.example.item; -import java.util.ArrayList; -import java.util.List; - public class Item { - List names = new ArrayList(); + private int cnt = 0; + + public int getCnt() { + return cnt; + } - public void addName(String name) { - names.add(name); + public void increaseCnt() { + cnt++; } } diff --git a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java new file mode 100644 index 0000000..bd0ab44 --- /dev/null +++ b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java @@ -0,0 +1,28 @@ +package org.example.item; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class ItemTest { + + @Test + void getTest() { + // given + Item item = new Item(); + + // then + assertThat(item.getCnt()).isEqualTo(0); + } + + @Test + void incrementTest() { + // given + Item item = new Item(); + + // when + item.increaseCnt(); + + assertThat(item.getCnt()).isEqualTo(1); + } +} From 378089459d68fa870571b7e779f9148be0b103e3 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 22:30:32 +0900 Subject: [PATCH 04/13] =?UTF-8?q?ci=20=ED=99=95=EC=9D=B8=EC=9A=A9=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- practice-gradle/app/src/main/java/org/example/item/Item.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/practice-gradle/app/src/main/java/org/example/item/Item.java b/practice-gradle/app/src/main/java/org/example/item/Item.java index 1a8d77f..8ba01cc 100644 --- a/practice-gradle/app/src/main/java/org/example/item/Item.java +++ b/practice-gradle/app/src/main/java/org/example/item/Item.java @@ -11,4 +11,8 @@ public int getCnt() { public void increaseCnt() { cnt++; } + + public void decreaseCnt() { + cnt--; + } } From 30dd3b48595ea409957184f39ac6410c1cd4f794 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 22:38:17 +0900 Subject: [PATCH 05/13] =?UTF-8?q?ci=20=ED=99=95=EC=9D=B8=EC=9A=A9=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B(2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/test/java/org/example/item/ItemTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java index bd0ab44..03c9409 100644 --- a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java +++ b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java @@ -25,4 +25,13 @@ void incrementTest() { assertThat(item.getCnt()).isEqualTo(1); } + + @Test + void decrementTest() { + Item item = new Item(); + + item.decreaseCnt(); + + assertThat(item.getCnt()).isEqualTo(-1); + } } From 976e0f7efc8fe798fbc86f02f037812599536e8e Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 22:41:21 +0900 Subject: [PATCH 06/13] =?UTF-8?q?spotBug=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- practice-gradle/app/src/main/java/org/example/App.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/practice-gradle/app/src/main/java/org/example/App.java b/practice-gradle/app/src/main/java/org/example/App.java index 1b8a09a..fa6b60b 100644 --- a/practice-gradle/app/src/main/java/org/example/App.java +++ b/practice-gradle/app/src/main/java/org/example/App.java @@ -15,7 +15,5 @@ public String getGreeting() { public static void main(String[] args) { System.out.println(new App().getGreeting()); - Item item = new Item(); - List list = new ArrayList(); } } From b1e763c14ddc2db997afbf96fed8dffb681c91d1 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 22:45:25 +0900 Subject: [PATCH 07/13] =?UTF-8?q?sarif=20=EC=84=A4=EC=A0=95=20true=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- practice-gradle/app/build.gradle.kts | 2 +- practice-gradle/app/src/main/java/org/example/item/Item.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/practice-gradle/app/build.gradle.kts b/practice-gradle/app/build.gradle.kts index 6b5087d..08166b3 100644 --- a/practice-gradle/app/build.gradle.kts +++ b/practice-gradle/app/build.gradle.kts @@ -103,7 +103,7 @@ tasks.named("spotbugsMain") { /* SARIF — GitHub Code Scanning 용 (필요 없으면 true→false) */ create("sarif") { - required.set(false) + required.set(true) } } } diff --git a/practice-gradle/app/src/main/java/org/example/item/Item.java b/practice-gradle/app/src/main/java/org/example/item/Item.java index 8ba01cc..d2a8d19 100644 --- a/practice-gradle/app/src/main/java/org/example/item/Item.java +++ b/practice-gradle/app/src/main/java/org/example/item/Item.java @@ -15,4 +15,8 @@ public void increaseCnt() { public void decreaseCnt() { cnt--; } + + public String toString() { + return cnt + ""; + } } From b323ea0d56c77c0a817a485c85e2982af6fca65b Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 22:49:06 +0900 Subject: [PATCH 08/13] =?UTF-8?q?=EC=BD=94=EB=93=9C=20=ED=8F=AC=EB=A7=B7?= =?UTF-8?q?=ED=8C=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- practice-gradle/app/src/main/java/org/example/App.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/practice-gradle/app/src/main/java/org/example/App.java b/practice-gradle/app/src/main/java/org/example/App.java index fa6b60b..8e74367 100644 --- a/practice-gradle/app/src/main/java/org/example/App.java +++ b/practice-gradle/app/src/main/java/org/example/App.java @@ -3,11 +3,6 @@ */ package org.example; -import java.util.ArrayList; -import java.util.List; - -import org.example.item.Item; - public class App { public String getGreeting() { return "Hello Second World!"; From e7b775bb10b819bdca2c701b4483e8943e6b6e60 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 22:56:21 +0900 Subject: [PATCH 09/13] =?UTF-8?q?CI=20=EA=B2=80=EC=A6=9D=EC=9A=A9=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/test/java/org/example/item/ItemTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java index 03c9409..d24aa05 100644 --- a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java +++ b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java @@ -34,4 +34,10 @@ void decrementTest() { assertThat(item.getCnt()).isEqualTo(-1); } + + @Test + void equalsTest() { + Item item = new Item(); + assertThat(item).isEqualTo(item); + } } From 53c92e066adcb89718809d6bdb854670cd7cd1e8 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 23:05:50 +0900 Subject: [PATCH 10/13] =?UTF-8?q?ci=20=ED=99=95=EC=9D=B8=EC=9A=A9=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B(2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- practice-gradle/app/src/main/java/org/example/item/Item.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/practice-gradle/app/src/main/java/org/example/item/Item.java b/practice-gradle/app/src/main/java/org/example/item/Item.java index d2a8d19..a5f46b7 100644 --- a/practice-gradle/app/src/main/java/org/example/item/Item.java +++ b/practice-gradle/app/src/main/java/org/example/item/Item.java @@ -19,4 +19,8 @@ public void decreaseCnt() { public String toString() { return cnt + ""; } + + public void setCnt(int cnt) { + this.cnt = cnt; + } } From 258d6049cb08e1509e7d1344c940b04e50d8c317 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 23:16:24 +0900 Subject: [PATCH 11/13] =?UTF-8?q?ci=20=ED=99=95=EC=9D=B8=EC=9A=A9=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B(3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/test/java/org/example/item/ItemTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java index d24aa05..bbe4e80 100644 --- a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java +++ b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java @@ -40,4 +40,11 @@ void equalsTest() { Item item = new Item(); assertThat(item).isEqualTo(item); } + + @Test + void setTest() { + Item item = new Item(); + item.setCnt(1); + assertThat(item.getCnt()).isEqualTo(1); + } } From e9b797f303d33e599c37d5cdff09cec553d8dd50 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 23:24:42 +0900 Subject: [PATCH 12/13] =?UTF-8?q?CI=20=ED=99=95=EC=9D=B8=EC=9A=A9=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B(4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/test/java/org/example/item/ItemTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java index bbe4e80..24c5370 100644 --- a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java +++ b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java @@ -44,7 +44,7 @@ void equalsTest() { @Test void setTest() { Item item = new Item(); - item.setCnt(1); - assertThat(item.getCnt()).isEqualTo(1); + item.setCnt(2); + assertThat(item.getCnt()).isEqualTo(2); } } From 51cb1d1e4b7fde9e2e227cc3ebc11c9435987a68 Mon Sep 17 00:00:00 2001 From: Hee Chan <88177732+HeeChanN@users.noreply.github.com> Date: Thu, 1 May 2025 23:32:47 +0900 Subject: [PATCH 13/13] =?UTF-8?q?ci=20=ED=99=95=EC=9D=B8=EC=9A=A9=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B(5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/test/java/org/example/item/ItemTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java index 24c5370..71497e5 100644 --- a/practice-gradle/app/src/test/java/org/example/item/ItemTest.java +++ b/practice-gradle/app/src/test/java/org/example/item/ItemTest.java @@ -44,7 +44,7 @@ void equalsTest() { @Test void setTest() { Item item = new Item(); - item.setCnt(2); - assertThat(item.getCnt()).isEqualTo(2); + item.setCnt(3); + assertThat(item.getCnt()).isEqualTo(3); } }