From 0bb344f857935afa80f295c1a47665757ed8c453 Mon Sep 17 00:00:00 2001 From: MagicSoup Date: Tue, 10 Jan 2023 21:00:40 +0100 Subject: [PATCH 1/2] [feature#13] Improve testing configuration --- .github/workflows/maven.yml | 16 ++- pom.xml | 101 ++++++++++++++---- .../EventManagerSecurityApplicationTests.java | 7 +- .../config/DefaultSpringBootTest.java | 20 ++++ .../controller/MemberControllerTest.java | 11 +- .../controller/RoleControllerTest.java | 9 +- .../das/MemberDASImplIntegrationTest.java | 9 +- 7 files changed, 127 insertions(+), 46 deletions(-) create mode 100644 src/test/java/com/event/manager/security/config/DefaultSpringBootTest.java diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index a49a76a..74405df 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -23,7 +23,7 @@ on: jobs: build: - name: Build + name: Compile runs-on: ubuntu-latest steps: @@ -34,15 +34,15 @@ jobs: java-version: '19' distribution: 'temurin' cache: maven - - name: Build with Maven - run: mvn -B package --file pom.xml + - name: Compile with Maven + run: mvn -B clean compile # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - name: Update dependency graph uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 sonar: - name: SonarCloud Scan + name: Publish to SonarCloud Scan runs-on: ubuntu-latest steps: @@ -53,7 +53,13 @@ jobs: java-version: '19' distribution: 'temurin' cache: maven + - name: Compile with Maven + run: mvn -B compile + - name: Unit Test with Maven + run: mvn -B test -Pcoverage + - name: Integration Test with Maven + run: mvn -B integration-test -Pintegration-test,coverage - name: SonarCloud Scan - run: mvn -B clean verify -Pcoverage,sonar -Dsonar.login=${{ secrets.SONAR_TOKEN }} + run: mvn -B verify -Pintegration-test,coverage,sonar -Dsonar.login=${{ secrets.SONAR_TOKEN }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/pom.xml b/pom.xml index ffb5db1..24b7e8f 100644 --- a/pom.xml +++ b/pom.xml @@ -16,17 +16,15 @@ - 3.9.1.2184 - 0.8.8 - 3.0.0-M7 + 3.9.1.2184 + 0.8.8 + 3.0.0-M7 19 - - **/com/event/manager/security/domain/exception/**/*, - **/com/event/manager/security/domain/**/*, - **/com/event/manager/security/EventManagerSecurityApplication.java - - target/site/jacoco/jacoco.xml + + false + ${skipTests} + true @@ -101,20 +99,20 @@ + + org.apache.maven.plugins + maven-surefire-plugin + ${surefire-maven-plugin.version} + org.jacoco jacoco-maven-plugin - ${jacoco.version} + ${jacoco-maven-plugin.version} org.sonarsource.scanner.maven sonar-maven-plugin - ${sonar.version} - - - org.apache.maven.plugins - maven-surefire-plugin - ${surefire.version} + ${sonar-maven-plugin.version} @@ -176,32 +174,90 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + ${skipUTs} + + integration, system + + + + org.apache.maven.plugins + maven-failsafe-plugin + + ${skipITs} + integration + system + + **/*IntegrationTest.java + + + + + + integration-test + verify + + + + + + integration-test + + false + + coverage true + + + ${project.basedir}/target/jacoco.exec + ${project.basedir}/target/jacoco.xml + ${project.basedir}/target/jacoco-class-folders + org.jacoco jacoco-maven-plugin + + ${jacoco.binary.file} + + com/event/manager/** + + + **/generated/** + + prepare-agent + + ${jacoco.binary.file} + true + - report - test + jacoco-integration-initialize + pre-integration-test - report + prepare-agent-integration + + ${jacoco.binary.file} + true + @@ -211,12 +267,17 @@ sonar + ${jacoco.xml.file} + + **/com/event/manager/security/domain/exception/**/*, + **/com/event/manager/security/domain/**/*, + **/com/event/manager/security/EventManagerSecurityApplication.java + https://sonarcloud.io magicsoup EventManager_java-event-manager-security-app ${project.groupId}:${project.artifactId} ${code.coverage.exclusions} - ${jacoco.report.xml.path} false diff --git a/src/test/java/com/event/manager/security/EventManagerSecurityApplicationTests.java b/src/test/java/com/event/manager/security/EventManagerSecurityApplicationTests.java index 34e7a12..070af0d 100644 --- a/src/test/java/com/event/manager/security/EventManagerSecurityApplicationTests.java +++ b/src/test/java/com/event/manager/security/EventManagerSecurityApplicationTests.java @@ -1,15 +1,12 @@ package com.event.manager.security; +import com.event.manager.security.config.DefaultSpringBootTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.jdbc.Sql; import static org.assertj.core.api.Assertions.assertThat; -@ActiveProfiles({"test"}) -@SpringBootTest +@DefaultSpringBootTest class EventManagerSecurityApplicationTests { @Value("${server.port}") diff --git a/src/test/java/com/event/manager/security/config/DefaultSpringBootTest.java b/src/test/java/com/event/manager/security/config/DefaultSpringBootTest.java new file mode 100644 index 0000000..a8a20c6 --- /dev/null +++ b/src/test/java/com/event/manager/security/config/DefaultSpringBootTest.java @@ -0,0 +1,20 @@ +package com.event.manager.security.config; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.annotation.AliasFor; +import org.springframework.test.context.ActiveProfiles; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@SpringBootTest +@ActiveProfiles +public @interface DefaultSpringBootTest { + @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfile() default {"test"}; + + @AliasFor(annotation = SpringBootTest.class, attribute = "webEnvironment") SpringBootTest.WebEnvironment webEnvironment() default SpringBootTest.WebEnvironment.NONE; +} diff --git a/src/test/java/com/event/manager/security/controller/MemberControllerTest.java b/src/test/java/com/event/manager/security/controller/MemberControllerTest.java index 7f1b85e..a5149f2 100644 --- a/src/test/java/com/event/manager/security/controller/MemberControllerTest.java +++ b/src/test/java/com/event/manager/security/controller/MemberControllerTest.java @@ -1,33 +1,30 @@ package com.event.manager.security.controller; -import com.event.manager.security.domain.model.api.MemberDTO; +import com.event.manager.security.config.DefaultSpringBootTest; import com.event.manager.security.domain.exception.notfound.MemberNotFoundException; +import com.event.manager.security.domain.model.api.MemberDTO; import com.event.manager.security.service.MemberService; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.MOCK; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@ActiveProfiles({"test"}) -@SpringBootTest @AutoConfigureMockMvc +@DefaultSpringBootTest(webEnvironment = MOCK) class MemberControllerTest { - private final static String API_BASE_URI = "/api/v1/member"; - @Autowired private MockMvc mockMvc; diff --git a/src/test/java/com/event/manager/security/controller/RoleControllerTest.java b/src/test/java/com/event/manager/security/controller/RoleControllerTest.java index d4e74ff..556256b 100644 --- a/src/test/java/com/event/manager/security/controller/RoleControllerTest.java +++ b/src/test/java/com/event/manager/security/controller/RoleControllerTest.java @@ -1,8 +1,9 @@ package com.event.manager.security.controller; -import com.event.manager.security.domain.model.api.RoleDTO; +import com.event.manager.security.config.DefaultSpringBootTest; import com.event.manager.security.domain.exception.notfound.RoleNotFoundException; import com.event.manager.security.domain.model.Role; +import com.event.manager.security.domain.model.api.RoleDTO; import com.event.manager.security.mapper.RoleMapper; import com.event.manager.security.service.RoleService; import com.fasterxml.jackson.databind.JavaType; @@ -10,10 +11,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; @@ -24,13 +23,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.MOCK; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@ActiveProfiles({"test"}) -@SpringBootTest @AutoConfigureMockMvc +@DefaultSpringBootTest(webEnvironment = MOCK) class RoleControllerTest { private final static String API_BASE_URI = "/api/v1/role"; diff --git a/src/test/java/com/event/manager/security/service/das/MemberDASImplIntegrationTest.java b/src/test/java/com/event/manager/security/service/das/MemberDASImplIntegrationTest.java index 2c788ba..cb02578 100644 --- a/src/test/java/com/event/manager/security/service/das/MemberDASImplIntegrationTest.java +++ b/src/test/java/com/event/manager/security/service/das/MemberDASImplIntegrationTest.java @@ -1,14 +1,15 @@ package com.event.manager.security.service.das; +import com.event.manager.security.config.DefaultSpringBootTest; import com.event.manager.security.domain.exception.notfound.MemberNotFoundException; import com.event.manager.security.domain.model.entity.MemberEntity; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Tags; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; import java.util.stream.Stream; @@ -17,8 +18,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.params.provider.Arguments.of; -@ActiveProfiles("test") -@SpringBootTest +@Tags({@Tag("integration")}) +@DefaultSpringBootTest class MemberDASImplIntegrationTest { @Autowired From ebcdf444aed5773037ceb42b8cc80c4c6366820c Mon Sep 17 00:00:00 2001 From: MagicSoup Date: Wed, 11 Jan 2023 18:55:47 +0100 Subject: [PATCH 2/2] [feature#13] Improve testing configuration - create specific annotation for controller tests (no database init with flyway) --- .../EventManagerSecurityApplicationTests.java | 2 +- .../ControllerSetupSpringBootTest.java | 18 ++++++++++++++++++ .../DefaultSpringBootTest.java | 7 +++++-- .../controller/MemberControllerTest.java | 7 ++----- .../controller/RoleControllerTest.java | 7 ++----- .../das/MemberDASImplIntegrationTest.java | 2 +- 6 files changed, 29 insertions(+), 14 deletions(-) create mode 100644 src/test/java/com/event/manager/security/annotations/ControllerSetupSpringBootTest.java rename src/test/java/com/event/manager/security/{config => annotations}/DefaultSpringBootTest.java (67%) diff --git a/src/test/java/com/event/manager/security/EventManagerSecurityApplicationTests.java b/src/test/java/com/event/manager/security/EventManagerSecurityApplicationTests.java index 070af0d..be98782 100644 --- a/src/test/java/com/event/manager/security/EventManagerSecurityApplicationTests.java +++ b/src/test/java/com/event/manager/security/EventManagerSecurityApplicationTests.java @@ -1,6 +1,6 @@ package com.event.manager.security; -import com.event.manager.security.config.DefaultSpringBootTest; +import com.event.manager.security.annotations.DefaultSpringBootTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; diff --git a/src/test/java/com/event/manager/security/annotations/ControllerSetupSpringBootTest.java b/src/test/java/com/event/manager/security/annotations/ControllerSetupSpringBootTest.java new file mode 100644 index 0000000..e7eade2 --- /dev/null +++ b/src/test/java/com/event/manager/security/annotations/ControllerSetupSpringBootTest.java @@ -0,0 +1,18 @@ +package com.event.manager.security.annotations; + +import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.MOCK; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@AutoConfigureMockMvc +@DefaultSpringBootTest(webEnvironment = MOCK, exclude = {FlywayAutoConfiguration.class}) +public @interface ControllerSetupSpringBootTest { +} diff --git a/src/test/java/com/event/manager/security/config/DefaultSpringBootTest.java b/src/test/java/com/event/manager/security/annotations/DefaultSpringBootTest.java similarity index 67% rename from src/test/java/com/event/manager/security/config/DefaultSpringBootTest.java rename to src/test/java/com/event/manager/security/annotations/DefaultSpringBootTest.java index a8a20c6..2d44ba3 100644 --- a/src/test/java/com/event/manager/security/config/DefaultSpringBootTest.java +++ b/src/test/java/com/event/manager/security/annotations/DefaultSpringBootTest.java @@ -1,5 +1,6 @@ -package com.event.manager.security.config; +package com.event.manager.security.annotations; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.annotation.AliasFor; import org.springframework.test.context.ActiveProfiles; @@ -13,8 +14,10 @@ @Target(ElementType.TYPE) @SpringBootTest @ActiveProfiles +@EnableAutoConfiguration public @interface DefaultSpringBootTest { @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfile() default {"test"}; - @AliasFor(annotation = SpringBootTest.class, attribute = "webEnvironment") SpringBootTest.WebEnvironment webEnvironment() default SpringBootTest.WebEnvironment.NONE; + @AliasFor(annotation = SpringBootTest.class, attribute = "properties") String[] properties() default {}; + @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "exclude") Class[] exclude() default {}; } diff --git a/src/test/java/com/event/manager/security/controller/MemberControllerTest.java b/src/test/java/com/event/manager/security/controller/MemberControllerTest.java index a5149f2..a8202b5 100644 --- a/src/test/java/com/event/manager/security/controller/MemberControllerTest.java +++ b/src/test/java/com/event/manager/security/controller/MemberControllerTest.java @@ -1,13 +1,12 @@ package com.event.manager.security.controller; -import com.event.manager.security.config.DefaultSpringBootTest; +import com.event.manager.security.annotations.ControllerSetupSpringBootTest; import com.event.manager.security.domain.exception.notfound.MemberNotFoundException; import com.event.manager.security.domain.model.api.MemberDTO; import com.event.manager.security.service.MemberService; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.web.servlet.MockMvc; @@ -16,13 +15,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.MOCK; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@AutoConfigureMockMvc -@DefaultSpringBootTest(webEnvironment = MOCK) +@ControllerSetupSpringBootTest class MemberControllerTest { private final static String API_BASE_URI = "/api/v1/member"; @Autowired diff --git a/src/test/java/com/event/manager/security/controller/RoleControllerTest.java b/src/test/java/com/event/manager/security/controller/RoleControllerTest.java index 556256b..72b2ed2 100644 --- a/src/test/java/com/event/manager/security/controller/RoleControllerTest.java +++ b/src/test/java/com/event/manager/security/controller/RoleControllerTest.java @@ -1,6 +1,6 @@ package com.event.manager.security.controller; -import com.event.manager.security.config.DefaultSpringBootTest; +import com.event.manager.security.annotations.ControllerSetupSpringBootTest; import com.event.manager.security.domain.exception.notfound.RoleNotFoundException; import com.event.manager.security.domain.model.Role; import com.event.manager.security.domain.model.api.RoleDTO; @@ -10,7 +10,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.web.servlet.MockMvc; @@ -23,13 +22,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.MOCK; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@AutoConfigureMockMvc -@DefaultSpringBootTest(webEnvironment = MOCK) +@ControllerSetupSpringBootTest class RoleControllerTest { private final static String API_BASE_URI = "/api/v1/role"; diff --git a/src/test/java/com/event/manager/security/service/das/MemberDASImplIntegrationTest.java b/src/test/java/com/event/manager/security/service/das/MemberDASImplIntegrationTest.java index cb02578..c11ea13 100644 --- a/src/test/java/com/event/manager/security/service/das/MemberDASImplIntegrationTest.java +++ b/src/test/java/com/event/manager/security/service/das/MemberDASImplIntegrationTest.java @@ -1,6 +1,6 @@ package com.event.manager.security.service.das; -import com.event.manager.security.config.DefaultSpringBootTest; +import com.event.manager.security.annotations.DefaultSpringBootTest; import com.event.manager.security.domain.exception.notfound.MemberNotFoundException; import com.event.manager.security.domain.model.entity.MemberEntity; import org.junit.jupiter.api.Tag;