์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[ATDD] ์ธ์ˆ˜ํ…Œ์ŠคํŠธ, ํ…Œ์ŠคํŠธ๊ฒฉ๋ฆฌ, ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜, RestAssured

๐Ÿ˜Ž ์ง€์‹ in Action/๐Ÿงช

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2026. 1. 18. 21:35

๋ณธ๋ฌธ

์ธ์ˆ˜ํ…Œ์ŠคํŠธ

 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)


  - ์‹ค์ œ ์„œ๋ฒ„๋ฅผ ๋„์›Œ์„œ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” End-to-End ํ…Œ์ŠคํŠธ
  - ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆ
  - RANDOM_PORT: ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ๋žœ๋ค ํฌํŠธ๋กœ ์„œ๋ฒ„ ์‹คํ–‰ (์ถฉ๋Œ ๋ฐฉ์ง€)

 

ํ…Œ์ŠคํŠธ ๊ฒฉ๋ฆฌ 

  @BeforeEach
  void setUp() {
      databaseCleanup.execute();  // ๋งค ํ…Œ์ŠคํŠธ๋งˆ๋‹ค DB ์ดˆ๊ธฐํ™”
  }


  - ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅ
  - ํ…Œ์ŠคํŠธ ์ˆœ์„œ์— ์˜์กดํ•˜์ง€ ์•Š์Œ

 

 ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜ (Test Fixture)

 public class TestFixture {
      public static ExtractableResponse<Response> ์˜ˆ์•ฝ_์ƒ์„ฑ_์š”์ฒญ(...) { }
      public static ExtractableResponse<Response> ์˜ˆ์•ฝ_์ทจ์†Œ_์š”์ฒญ(...) { }
  }


  - ํ…Œ์ŠคํŠธ์—์„œ ๋ฐ˜๋ณต ์‚ฌ์šฉ๋˜๋Š” ํ—ฌํผ ๋ฉ”์„œ๋“œ ๋ชจ์Œ
  - ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ, ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

 

 Nested ํ…Œ์ŠคํŠธ (๊ณ„์ธต์  ๊ตฌ์กฐ)

  @Nested
  @DisplayName("์ •์ƒ ์ผ€์ด์Šค")
  class HappyPath { ... }

  @Nested
  @DisplayName("์˜ˆ์™ธ ์ผ€์ด์Šค")
  class ExceptionCase { ... }

 

  - ํ…Œ์ŠคํŠธ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ทธ๋ฃนํ™”
  - Happy Path / Exception Case ๋ถ„๋ฆฌ

 

RestAssured

RestAssured
      .given().log().all()
      .contentType(MediaType.APPLICATION_JSON_VALUE)
      .body(params)
      .when().post("/api/reservations")
      .then().log().all()
      .extract();


  - HTTP API ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ DSL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  - given() → ์š”์ฒญ ์„ค์ •, when() → ์‹คํ–‰, then() → ๊ฒ€์ฆ

 

 @ActiveProfiles("test")

  - ํ…Œ์ŠคํŠธ ์ „์šฉ ํ”„๋กœํŒŒ์ผ ํ™œ์„ฑํ™”
  - application-test.yml ์„ค์ • ์‚ฌ์šฉ (์žˆ๋‹ค๋ฉด)

 

  @Import(DatabaseCleanup.class)

  - ํ…Œ์ŠคํŠธ ์ปจํ…์ŠคํŠธ์— ํŠน์ • ๋นˆ์„ ์ˆ˜๋™ ๋“ฑ๋ก
  - ํŒจํ‚ค์ง€ ์Šค์บ” ๋ฒ”์œ„ ๋ฐ–์˜ ์ปดํฌ๋„ŒํŠธ ํฌํ•จ

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ