diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 65804ec..bc10632 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,6 +10,17 @@ jobs: build-and-test: runs-on: ubuntu-latest + services: + redis: + image: redis:7.0-alpine + ports: + - 6379:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: - name: Checkout code uses: actions/checkout@v3 @@ -24,7 +35,11 @@ jobs: run: chmod +x ./gradlew - name: Build Project - run: ./gradlew build + run: ./gradlew build -x test - name: Run tests run: ./gradlew clean test + env: + SPRING_REDIS_HOST: localhost + SPRING_REDIS_PORT: 6379 + diff --git a/build.gradle b/build.gradle index 7c1e4e7..8aeced7 100644 --- a/build.gradle +++ b/build.gradle @@ -61,8 +61,6 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.testcontainers:testcontainers:1.21.0' - testImplementation 'org.testcontainers:junit-jupiter:1.21.0' } tasks.named('test') { diff --git a/src/test/java/nbc/ticketing/ticket911/Booking911ApplicationTests.java b/src/test/java/nbc/ticketing/ticket911/Booking911ApplicationTests.java index 8812040..7708f99 100644 --- a/src/test/java/nbc/ticketing/ticket911/Booking911ApplicationTests.java +++ b/src/test/java/nbc/ticketing/ticket911/Booking911ApplicationTests.java @@ -2,7 +2,9 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +@ActiveProfiles("test") @SpringBootTest class Booking911ApplicationTests { diff --git a/src/test/java/nbc/ticketing/ticket911/domain/booking/controller/BookingControllerTestByMySQL.java b/src/test/java/nbc/ticketing/ticket911/domain/booking/controller/BookingControllerTestByMySQL.java index 8e87ab2..299a2ba 100644 --- a/src/test/java/nbc/ticketing/ticket911/domain/booking/controller/BookingControllerTestByMySQL.java +++ b/src/test/java/nbc/ticketing/ticket911/domain/booking/controller/BookingControllerTestByMySQL.java @@ -16,6 +16,7 @@ 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.test.context.ActiveProfiles; import nbc.ticketing.ticket911.domain.auth.vo.AuthUser; import nbc.ticketing.ticket911.domain.booking.application.BookingService; @@ -33,6 +34,7 @@ import nbc.ticketing.ticket911.domain.user.entity.User; import nbc.ticketing.ticket911.domain.user.repository.UserRepository; +@ActiveProfiles("test") @SpringBootTest @AutoConfigureMockMvc class BookingControllerTestByMySQL { diff --git a/src/test/java/nbc/ticketing/ticket911/domain/lock/BookingConcurrencyTest.java b/src/test/java/nbc/ticketing/ticket911/domain/lock/BookingConcurrencyTest.java index 8ef6529..befc05b 100644 --- a/src/test/java/nbc/ticketing/ticket911/domain/lock/BookingConcurrencyTest.java +++ b/src/test/java/nbc/ticketing/ticket911/domain/lock/BookingConcurrencyTest.java @@ -17,13 +17,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; -import org.testcontainers.utility.DockerImageName; import lombok.extern.slf4j.Slf4j; import nbc.ticketing.ticket911.common.aop.RedissonMultiLockAspect; @@ -44,26 +37,12 @@ import nbc.ticketing.ticket911.domain.user.repository.UserRepository; @Slf4j -@Testcontainers @ActiveProfiles("test") @SpringBootTest @Import(RedissonMultiLockAspect.class) @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) public class BookingConcurrencyTest { - @Container - static GenericContainer redis = - new GenericContainer<>(DockerImageName.parse("redis:7.0-alpine")) - .withExposedPorts(6379) - .waitingFor(Wait.forListeningPort()) - .withStartupAttempts(5); - - @DynamicPropertySource - static void redisProperties(DynamicPropertyRegistry reg) { - reg.add("spring.data.redis.host", redis::getHost); - reg.add("spring.data.redis.port", redis::getFirstMappedPort); - } - @Autowired private BookingService bookingService; diff --git a/src/test/java/nbc/ticketing/ticket911/domain/lock/LettuceLockManagerTest.java b/src/test/java/nbc/ticketing/ticket911/domain/lock/LettuceLockManagerTest.java index a55daa5..d292ebc 100644 --- a/src/test/java/nbc/ticketing/ticket911/domain/lock/LettuceLockManagerTest.java +++ b/src/test/java/nbc/ticketing/ticket911/domain/lock/LettuceLockManagerTest.java @@ -1,7 +1,6 @@ package nbc.ticketing.ticket911.domain.lock; import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; import java.time.LocalDateTime; import java.util.ArrayList; @@ -18,10 +17,13 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.bean.override.mockito.MockitoBean; +import nbc.ticketing.ticket911.common.aop.RedissonMultiLockAspect; import nbc.ticketing.ticket911.domain.auth.vo.AuthUser; import nbc.ticketing.ticket911.domain.booking.application.BookingService; import nbc.ticketing.ticket911.domain.booking.dto.request.BookingRequestDto; @@ -44,6 +46,9 @@ @SpringBootTest @ActiveProfiles("test") +@Import(RedissonMultiLockAspect.class) +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) class LettuceLockManagerTest { @Autowired private BookingService bookingService; @@ -54,7 +59,7 @@ class LettuceLockManagerTest { @Autowired private BookingDomainService bookingDomainService; - @MockitoBean + @Autowired private UserDomainService userDomainService; @Autowired private ConcertSeatRepository concertSeatRepository; @@ -84,9 +89,6 @@ void setupConcertSeat() { .build() ); - when(userDomainService.findActiveUserById(savedUser.getId())) - .thenReturn(savedUser); - Stage savedStage = stageRepository.save( Stage.builder() .totalSeat(1L) @@ -155,6 +157,7 @@ void setupConcertSeat() { assertThat(resultStats.getOrDefault("성공", 0L)).isEqualTo(1); } + @Test void 동시_예매_테스트_좌석은_하나만_성공해야_한다_AOP기반() throws InterruptedException { int threadCount = 100; diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index a1cfee6..57abb8e 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -19,6 +19,11 @@ spring: liquibase: enabled: false + data: + redis: + host: ${SPRING_REDIS_HOST:localhost} + port: ${SPRING_REDIS_PORT:6379} + logging: level: org.hibernate.SQL: DEBUG