Skip to content

Commit a968998

Browse files
Feat/31 integration test (#44)
* chore: add docker into devcontainer * chore: add live-server into devcontainer * chore: add mysql version test * feat: add /test controller * chore: add container singleton init test * test: add TestContainer and Test it runs * chore: fix mysql conf foler path for Testcontainer * test: add gradle tasks integrationTest * chore: delete \r line (for execute) * test: move RepositoryTest into Integration-Test with testcontainer * chore: remove unused dependency * test: fix repository test for using testcontainer --------- Co-authored-by: ParkJeongseop <[email protected]>
1 parent cb39c03 commit a968998

File tree

15 files changed

+168
-36
lines changed

15 files changed

+168
-36
lines changed

.devcontainer/devcontainer.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111
"gradleVersion": "latest",
1212
"mavenVersion": "latest",
1313
"antVersion": "latest"
14+
},
15+
"ghcr.io/devcontainers/features/docker-in-docker:2": {
16+
"moby": true,
17+
"azureDnsAutoDetection": true,
18+
"installDockerBuildx": true,
19+
"version": "20.10",
20+
"dockerDashComposeVersion": "v1"
1421
}
1522
},
1623

@@ -31,7 +38,8 @@
3138
"extensions": [
3239
"mathiasfrohlich.Kotlin",
3340
"GitHub.copilot",
34-
"vscjava.vscode-gradle"
41+
"vscjava.vscode-gradle",
42+
"ritwickdey.LiveServer"
3543
]
3644
}
3745
}

.github/workflows/gradle-build-test-lint.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,24 @@ jobs:
5050
if: always()
5151
with:
5252
arguments: test -x jacocoTestReport
53+
54+
integrationTest:
55+
runs-on: ubuntu-latest
56+
needs: set-up
57+
if: always()
58+
steps:
59+
- uses: actions/checkout@v3
60+
- name: Set up JDK 17
61+
uses: actions/setup-java@v3
62+
with:
63+
java-version: '17'
64+
distribution: 'temurin'
65+
66+
- name: integrationTest
67+
uses: gradle/gradle-build-action@749f47bda3e44aa060e82d7b3ef7e40d953bd629
68+
if: always()
69+
with:
70+
arguments: integrationTest
5371

5472
coverage:
5573
runs-on: ubuntu-latest

build.gradle.kts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,31 @@ repositories {
2323
mavenCentral()
2424
}
2525

26+
sourceSets {
27+
create("integrationTest") {
28+
compileClasspath += sourceSets.main.get().output
29+
runtimeClasspath += sourceSets.main.get().output
30+
}
31+
}
32+
33+
val integrationTestImplementation by configurations.getting {
34+
extendsFrom(configurations.implementation.get())
35+
}
36+
37+
configurations["integrationTestRuntimeOnly"].extendsFrom(configurations.runtimeOnly.get())
38+
configurations["integrationTestImplementation"].extendsFrom(configurations.testImplementation.get())
39+
40+
val integrationTest = task<Test>("integrationTest") {
41+
description = "Runs integration tests."
42+
group = "verification"
43+
44+
testClassesDirs = sourceSets["integrationTest"].output.classesDirs
45+
classpath = sourceSets["integrationTest"].runtimeClasspath
46+
shouldRunAfter("test")
47+
}
48+
49+
tasks.check { dependsOn(integrationTest) }
50+
2651
dependencies {
2752
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
2853
implementation("org.springframework.boot:spring-boot-starter-web")
@@ -32,8 +57,11 @@ dependencies {
3257
developmentOnly("org.springframework.boot:spring-boot-devtools")
3358
runtimeOnly("com.mysql:mysql-connector-j")
3459
testImplementation("org.springframework.boot:spring-boot-starter-test")
35-
testImplementation("com.h2database:h2")
3660
implementation("org.modelmapper:modelmapper:2.4.2")
61+
integrationTestImplementation("org.springframework.boot:spring-boot-testcontainers")
62+
integrationTestImplementation("org.testcontainers:junit-jupiter")
63+
integrationTestImplementation("org.testcontainers:mysql")
64+
implementation("com.ninja-squad:springmockk:4.0.2")
3765
}
3866

3967
tasks.withType<KotlinCompile> {
@@ -92,7 +120,7 @@ tasks.jacocoTestReport {
92120

93121
tasks.jacocoTestCoverageVerification {
94122

95-
var Qdomains = mutableListOf<String>()
123+
val Qdomains = mutableListOf<String>()
96124

97125
for (qPattern in 'A'..'Z') {
98126
Qdomains.add("*.Q$qPattern*")

docker-compose.yml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
version: "3"
2+
3+
services:
4+
db:
5+
container_name: mysqldb
6+
image: mysql:8.0.33
7+
restart: "no"
8+
environment:
9+
MYSQL_ROOT_PASSWORD: test
10+
ports:
11+
- 3306:3306
12+
volumes:
13+
- ./src/intTest/resources/db/mysql/conf.d:/etc/mysql/conf.d
14+
- ./src/intTest/resources/db/mysql/initdb.d:/docker-entrypoint-initdb.d
15+
healthcheck:
16+
test: ['CMD-SHELL', 'mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD']
17+
interval: 10s
18+
timeout: 2s
19+
retries: 100
20+
21+
networks:
22+
- spring-network
23+
24+
api:
25+
container_name: api
26+
build:
27+
context: .
28+
dockerfile: Dockerfile
29+
restart: "no"
30+
ports:
31+
- 8080:8080
32+
environment:
33+
MYSQL_HOST: mysqldb
34+
MYSQL_PORT: 3306
35+
MYSQL_USERNAME: root
36+
MYSQL_PASSWORD: test
37+
MYSQL_SCHEMA: test
38+
depends_on:
39+
db:
40+
condition: service_healthy
41+
networks:
42+
- spring-network
43+
44+
networks:
45+
spring-network:

gradlew

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,4 +242,4 @@ eval "set -- $(
242242
tr '\n' ' '
243243
)" '"$@"'
244244

245-
exec "$JAVACMD" "$@"
245+
exec "$JAVACMD" "$@"
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.group4.ticketingservice
2+
3+
import org.springframework.boot.test.context.SpringBootTest
4+
import org.springframework.test.context.DynamicPropertyRegistry
5+
import org.springframework.test.context.DynamicPropertySource
6+
import org.testcontainers.containers.MySQLContainer
7+
import org.testcontainers.junit.jupiter.Container
8+
import org.testcontainers.junit.jupiter.Testcontainers
9+
10+
@SpringBootTest
11+
@Testcontainers
12+
abstract class AbstractIntegrationTest {
13+
14+
companion object {
15+
@Container
16+
val mysqlContainer = MySQLContainer("mysql:8.0.33")
17+
.withConfigurationOverride("./db/mysql/conf.d")
18+
19+
@JvmStatic
20+
@DynamicPropertySource
21+
fun datasourceConfig(registry: DynamicPropertyRegistry) {
22+
registry.add("spring.datasource.url", mysqlContainer::getJdbcUrl)
23+
registry.add("spring.datasource.username", mysqlContainer::getUsername)
24+
registry.add("spring.datasource.password", mysqlContainer::getPassword)
25+
}
26+
}
27+
}

src/test/kotlin/com/group4/ticketingservice/bookmark/BookmarkRepositoryTest.kt renamed to src/integrationTest/kotlin/com/group4/ticketingservice/Bookmark/BookmarkRepositoryTest.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
package com.group4.ticketingservice.bookmark
1+
package com.group4.ticketingservice
22

33
import com.group4.ticketingservice.entity.Bookmark
44
import com.group4.ticketingservice.repository.BookmarkRepository
55
import org.assertj.core.api.Assertions.assertThat
66
import org.junit.jupiter.api.Assertions.assertInstanceOf
77
import org.junit.jupiter.api.Test
88
import org.springframework.beans.factory.annotation.Autowired
9-
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
109
import org.springframework.data.repository.findByIdOrNull
1110

12-
@DataJpaTest
1311
class BookmarkRepositoryTest(
1412
@Autowired val bookmarkRepository: BookmarkRepository
15-
) {
13+
) : AbstractIntegrationTest() {
1614

1715
@Test
1816
fun `bookmarkRepository_save should return savedBookmark`() {
@@ -43,7 +41,7 @@ class BookmarkRepositoryTest(
4341
val foundBookmark = bookmarkRepository.findByIdOrNull(savedBookmark.id?.toLong())
4442

4543
// then
46-
assertThat(foundBookmark).isEqualTo(savedBookmark)
44+
assert(savedBookmark.id == foundBookmark?.id)
4745
}
4846

4947
@Test
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.group4.ticketingservice
2+
3+
import org.junit.jupiter.api.Test
4+
import org.springframework.beans.factory.annotation.Autowired
5+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
6+
import org.springframework.test.web.servlet.MockMvc
7+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
8+
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
9+
10+
@AutoConfigureMockMvc
11+
class TestControllerTest : AbstractIntegrationTest() {
12+
@Autowired private lateinit var mockMvc: MockMvc
13+
14+
@Test
15+
fun contextLoads() {
16+
}
17+
18+
@Test
19+
fun `E2E test`() {
20+
mockMvc.perform(MockMvcRequestBuilders.get("/bookmarks"))
21+
.andExpect(status().isOk)
22+
}
23+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
spring.jpa.hibernate.ddl-auto=create
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[client]
2+
default-character-set = utf8mb4
3+
4+
[mysql]
5+
default-character-set = utf8mb4
6+
7+
[mysqld]
8+
character-set-client-handshake = FALSE
9+
character-set-server = utf8mb4
10+
collation-server = utf8mb4_unicode_ci
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-- use ddl-auto

src/main/kotlin/com/group4/ticketingservice/controller/TestController.kt

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/main/resources/application.properties

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/test/kotlin/com/group4/ticketingservice/TicketingserviceApplicationTests.kt

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/test/resources/application.properties

Whitespace-only changes.

0 commit comments

Comments
 (0)