REST Assured๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ ์กฐ์ง์€ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ฒดํฌํ•˜์ง€ ์•Š๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋ ˆ์ด์–ด๋ฅผ ์œ„์ฃผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ํ–ˆ์—ˆ๋‹ค. ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ˜•ํƒœ์˜ B2B ์†”๋ฃจ์…˜์ด ์•„๋‹Œ SaaS ์„œ๋น„์Šค๋ฅผ ์ค€๋น„ํ•˜๋ฉด์„œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋ฅผ ์œ„ํ•ด ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ผ๋‹จ Playwright์™€ Allure Report๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ์ค€๋น„์ค‘์ด๋ผ ์ด์— ๋งž์ถฐ ์„œ๋น„์Šค ๊ฐœ๋ฐœ ์‹œ Allure Report์™€ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” JUnit5 + Rest Assured๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

Gradle Dependencies

Rest Assured ์™€ ํ•จ๊ป˜ Hamcrest๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ์Šคํ”„๋ง ๋ถ€ํŠธ ์Šคํƒ€ํ„ฐ์˜ ํ…Œ์ŠคํŠธ ์˜์กด์„ฑ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Hamcrest๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ Hamcrest๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ์ ์€ ์—†์–ด์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— ์ž˜ ํ™œ์šฉํ•ด๋ณด๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.

build.gradle
dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.rest-assured:rest-assured:5.5.0' }

Behavior Driven Development

๊ทธ๋™์•ˆ์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋”๋ผ๋„ TDD๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋Š” ์•Š์•˜์œผ๋ฉฐ ์†”๋ฃจ์…˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๋Š”์ง€๋งŒ ํ™•์ธํ•ด์™”๋‹ค. Rest Assured๋Š” BDD๋กœ E2E ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ก ํŠธ์—”๋“œ๋‚˜ QA ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์ž‘์„ฑํ•˜๋Š” Playwright ์™€๋„ ๋น„์Šทํ•˜๊ฒŒ ์ž‘์„ฑํ•ด๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

@DisplayName("End to End Test")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class DemoApplicationTests {

    @LocalServerPort
    int port;

    @BeforeEach
    void setup() {
        RestAssured.port = port;
    }

    @Test
    void whenGet_thenOk() {
        RestAssured
                .given()
                .filter(new AllureRestAssured())
                .log().all()
                .header(HttpHeaders.USER_AGENT,
                        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36")

                .when()
                .get("/")

                .then()
                .log().ifValidationFails()
                .statusCode(HttpStatus.OK.value())
                .body(Matchers.is("Hello World"));
    }
}

Allure REST Assured

๊ทธ๋ž˜๋“ค ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  allureReport ๋˜๋Š” allureServe ํƒœ์Šคํฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Allure ๋ฆฌํฌํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

build.gradle
plugins { id 'io.qameta.allure' version '2.12.0' } dependencies { testImplementation platform('io.qameta.allure:allure-bom:2.28.0') testImplementation "io.qameta.allure:allure-junit5" testImplementation "io.qameta.allure:allure-rest-assured" }

Allure Report

์ฐธ๊ณ  ๋งํฌ