216.73.216.141 TODAY : 4,728

PHP ์˜จ๋ผ์ธ ๊ฐ•์˜

 > 

PHP - ์ตœ์ƒ๊ธ‰

๐Ÿ“š PHP ์ตœ์ƒ๊ธ‰ - 6์ฃผ์ฐจ: ํ…Œ์ŠคํŠธ ์ž๋™ํ™” (๋‹จ์œ„/ํ†ตํ•ฉ/E2E ํ…Œ์ŠคํŠธ)- 03 Codeception/Cypress๋ฅผ ์ด์šฉํ•œ E2E(End-to-End) ํ…Œ์ŠคํŠธ

๐Ÿ“š PHP ์ตœ์ƒ๊ธ‰ - 6์ฃผ์ฐจ: ํ…Œ์ŠคํŠธ ์ž๋™ํ™” (๋‹จ์œ„/ํ†ตํ•ฉ/E2E ํ…Œ์ŠคํŠธ)- 03 Codeception/Cypress๋ฅผ ์ด์šฉํ•œ E2E(End-to-End) ํ…Œ์ŠคํŠธ

์ฃผ์š” ํ”„๋กœ๊ทธ๋žจ ์ŠคํŽ™

  • ํ‰์ : 10.0
  • ๋ผ์ด์„ ์Šค: free
  • ์šด์˜์ฒด์ œ:
  • ํŒŒ์ผ ํฌ๊ธฐ: 0

ํ”ผ๋“œ๋ฐฑ ๋ฐ ๋‹ค์šด๋กœ๋“œ

  • ์‚ฌ์šฉ์ž ํ‰์ : 10.0
  • ๋‹ค์šด๋กœ๋“œ ์ˆ˜: 0
  • ์กฐํšŒ์ˆ˜: 4

์ œ์กฐ์‚ฌ ๋ฐ ๋“ฑ๋ก ์ •๋ณด

  • ์ œ์ž‘์‚ฌ: LUZENSOFT
  • ๋“ฑ๋ก์ผ: 2025-10-21 08:52:17
  •  

- ์„ค๋ช…

E2E(End-to-End) ํ…Œ์ŠคํŠธ์˜ ์ •์˜์™€ ์—ญํ• 

uploadImage

#E2E(#End-to-End) #ํ…Œ์ŠคํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ #์ฒ˜์Œ๋ถ€ํ„ฐ #๋๊นŒ์ง€(#End_to_End) ์ „์ฒด ํ๋ฆ„์„ ๊ฒ€์ฆํ•˜๋Š” #ํ…Œ์ŠคํŠธ #์ž๋™ํ™” ๋ฐฉ๋ฒ•์ด์—์š”. #๋‹จ์œ„ #ํ…Œ์ŠคํŠธ๋‚˜ #ํ†ตํ•ฉ #ํ…Œ์ŠคํŠธ๊ฐ€ ์ฝ”๋“œ์˜ ํŠน์ • ๋ถ€๋ถ„์ด๋‚˜ ๊ฒฐํ•ฉ๋œ #๋ชจ๋“ˆ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•œ๋‹ค๋ฉด, #E2E ํ…Œ์ŠคํŠธ๋Š” #์‹ค์ œ #์‚ฌ์šฉ์ž์˜ ๊ด€์ ์—์„œ ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  #์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์—ฐ๋™๋˜๋Š”์ง€ ํ™•์ธํ•ด์š”.

์ด๋Š” #์›น #๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž์˜ #๋กœ๊ทธ์ธ, #์ƒํ’ˆ #๊ตฌ๋งค, #ํŽ˜์ด์ง€ #์ด๋™ ๋“ฑ ๋ณต์žกํ•œ #์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ #์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ #ํ”„๋ก ํŠธ์—”๋“œ๋ถ€ํ„ฐ #๋ฐฑ์—”๋“œ #๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊นŒ์ง€ ์ „ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” #๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ๋ฐœ๊ฒฌํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ด์š”. #PHP #์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ, ์ฃผ๋กœ #ํ”„๋ก ํŠธ์—”๋“œ #๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ข…์ ์ธ #HTTP #์‘๋‹ต๊ณผ #๋ธŒ๋ผ์šฐ์ € #๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•˜๊ฒŒ ๋ผ์š”.



Codeception์„ ์ด์šฉํ•œ E2E ํ…Œ์ŠคํŠธ (PHP ์ค‘์‹ฌ)

uploadImage

#Codeception์€ #PHP ๊ธฐ๋ฐ˜์˜ ๊ฐ•๋ ฅํ•œ #ํ…Œ์ŠคํŒ… #ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, #๋‹จ์œ„ #ํ…Œ์ŠคํŠธ, #ํ†ตํ•ฉ #ํ…Œ์ŠคํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ #E2E ํ…Œ์ŠคํŠธ๋„ ์ง€์›ํ•ด์š”. #Codeception์€ #Selenium์ด๋‚˜ #WebDriver์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ #๋ž˜ํ•‘(#Wrapping)ํ•˜์—ฌ #PHP #๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ต์ˆ™ํ•œ ๋ฌธ๋ฒ•์œผ๋กœ #๋ธŒ๋ผ์šฐ์ € #์ž๋™ํ™”๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์š”.


1. Codeception ์„ค์ •


#Composer๋ฅผ ํ†ตํ•ด #Codeception์„ ์„ค์น˜ํ•˜๊ณ  codecept init ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์š”. E2E ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด Acceptance ์Šค์œ„ํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ , #WebDriver #๋ชจ๋“ˆ์„ ์„ค์ •ํ•ด์š”.

Bash

# Codeception ์„ค์น˜
composer require --dev codeception/codeception codeception/module-webdriver

#Codeception์€ ๋‚ด๋ถ€์ ์œผ๋กœ #Selenium๊ณผ ํ†ต์‹ ํ•˜๋ฉฐ, ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋Š” #์‚ฌ์šฉ์ž #ํ–‰๋™(#User_Action)์„ ๋ฌ˜์‚ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋ผ์š”.


2. E2E ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ (Gherkin ์Šคํƒ€์ผ)


#Codeception์˜ #Acceptance ํ…Œ์ŠคํŠธ๋Š” #๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์‚ฌ๋žŒ๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด #ํ–‰๋™ #๊ธฐ๋ฐ˜ #๊ฐœ๋ฐœ(#BDD: Behavior Driven Development) ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”.

PHP

<?php
// Acceptance/LoginCest.php ์˜ˆ์‹œ
class LoginCest
{
    // Cest ํด๋ž˜์Šค๋Š” Codeception์˜ ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ
    public function tryToLogin(AcceptanceTester $I)
    {
        // I๋Š” Actor ๊ฐ์ฒด๋กœ, ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ๋‚˜ํƒ€๋ƒ„
        $I->amOnPage('/'); // ์‹œ์ž‘ ํŽ˜์ด์ง€๋กœ ์ด๋™
        $I->see('๋กœ๊ทธ์ธ'); // '๋กœ๊ทธ์ธ' ํ…์ŠคํŠธ๊ฐ€ ๋ณด์ด๋Š”์ง€ ํ™•์ธ
        $I->click('#login-button');
        $I->fillField('username', 'testuser');
        $I->fillField('password', 'password123');
        $I->click('๋กœ๊ทธ์ธ ๋ฒ„ํŠผ');
        $I->see('ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค, testuser๋‹˜!'); // ๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ›„ ๋ฉ”์‹œ์ง€ ํ™•์ธ
        $I->seeInCurrentUrl('/dashboard'); // URL์ด ๋Œ€์‹œ๋ณด๋“œ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
    }
}

#Codeception์˜ ์žฅ์ ์€ #PHP #์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๊ด€๋œ #ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ ์ด์—์š”.



Cypress๋ฅผ ์ด์šฉํ•œ E2E ํ…Œ์ŠคํŠธ (ํ”„๋ก ํŠธ์—”๋“œ ์ค‘์‹ฌ)

uploadImage

#Cypress๋Š” #JavaScript ๊ธฐ๋ฐ˜์˜ ์ฐจ์„ธ๋Œ€ #E2E #ํ…Œ์ŠคํŒ… #๋„๊ตฌ๋กœ, ํŠนํžˆ #SPA(#Single_Page_Application)์™€ ๊ฐ™์€ #ํ”„๋ก ํŠธ์—”๋“œ ์ค‘์‹ฌ์˜ #์›น #์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธ์—์„œ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค˜์š”. #PHP #๋ฐฑ์—”๋“œ๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์ ํŠธ์—์„œ๋„ #ํ”„๋ก ํŠธ์—”๋“œ์™€ #๋ฐฑ์—”๋“œ #ํ†ต์‹ ์„ ๊ฒ€์ฆํ•˜๋Š” #E2E ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋กœ ํ™œ๋ฐœํ•˜๊ฒŒ ์‚ฌ์šฉ๋ผ์š”.


1. Cypress์˜ ํŠน์ง•๊ณผ ์žฅ์ 


  • #๊ฐœ๋ฐœ์ž #๊ฒฝํ—˜(#DX): ์‹ค์‹œ๊ฐ„ #๋ฆฌ๋กœ๋“œ, #๋””๋ฒ„๊น… #๋„๊ตฌ, #์ž๋™ #๋Œ€๊ธฐ(#Automatic_Waiting) ๊ธฐ๋Šฅ ๋“ฑ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ๊ณผ ๋””๋ฒ„๊น…์ด ๋งค์šฐ ์‰ฌ์›Œ์š”.

  • #Time #Travel: ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ค‘ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ #์Šค๋ƒ…์ƒท์œผ๋กœ ์ €์žฅํ•˜์—ฌ, ์‹คํŒจ ์‹œ์ ์„ ์ •ํ™•ํ•˜๊ฒŒ ์žฌํ˜„ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์–ด์š”.

  • #๋„คํŠธ์›Œํฌ #์ œ์–ด: #API #์‘๋‹ต์„ ์‰ฝ๊ฒŒ #Mockingํ•˜๊ฑฐ๋‚˜ #Stubbingํ•  ์ˆ˜ ์žˆ์–ด, #๋ฐฑ์—”๋“œ #์˜์กด์„ฑ ์—†์ด #ํ”„๋ก ํŠธ์—”๋“œ #๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์šฉ์ดํ•ด์š”.


2. Cypress ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ์˜ˆ์‹œ


#Cypress ํ…Œ์ŠคํŠธ๋Š” #JavaScript๋กœ ์ž‘์„ฑ๋˜๋ฉฐ, #Node.js #ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋ผ์š”.

JavaScript

// cypress/integration/login_spec.js ์˜ˆ์‹œ
describe('๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ', () => {
    it('์œ ํšจํ•œ ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•ด์•ผ ํ•œ๋‹ค', () => {
        // Arrange
        cy.visit('http://your-php-app.com/login'); // ํ…Œ์ŠคํŠธํ•  ํŽ˜์ด์ง€ ๋ฐฉ๋ฌธ

        // Act
        cy.get('input[name="email"]').type('test@example.com');
        cy.get('input[name="password"]').type('password123');
        cy.get('button[type="submit"]').click();

        // Assert
        cy.url().should('include', '/dashboard'); // ๋Œ€์‹œ๋ณด๋“œ๋กœ ์ด๋™ํ–ˆ๋Š”์ง€ ํ™•์ธ
        cy.contains('h1', '๋Œ€์‹œ๋ณด๋“œ'); // ํŽ˜์ด์ง€์— ํŠน์ • ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
    });
});

#Cypress๋Š” #๋ธŒ๋ผ์šฐ์ € #๋‚ด๋ถ€์—์„œ ์ง์ ‘ ์‹คํ–‰๋˜์–ด #Selenium๋ณด๋‹ค ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ #ํ…Œ์ŠคํŠธ #๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํฐ ์žฅ์ ์ด์—์š”. #PHP #์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ, #PHP #์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ์—์„œ #Cypress๋ฅผ ์‹คํ–‰ํ•˜์—ฌ #HTTP #์š”์ฒญ๋ถ€ํ„ฐ ์ตœ์ข… #UI #์ƒํƒœ๊นŒ์ง€ ๊ฒ€์ฆํ•ด์š”.



์š”์•ฝ


#E2E #ํ…Œ์ŠคํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ #์‹ ๋ขฐ๋„๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋‹จ๊ณ„์˜ˆ์š”. #PHP #๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” #PHPUnit์˜ ํ™•์žฅ์œผ๋กœ์„œ #Codeception์„ ์‚ฌ์šฉํ•˜์—ฌ #PHP #์นœํ™”์ ์ธ #E2E #ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜, #ํ”„๋ก ํŠธ์—”๋“œ์™€์˜ ์—ฐ๊ณ„๋ฅผ ์ค‘์‹œํ•œ๋‹ค๋ฉด #Cypress์™€ ๊ฐ™์€ #JavaScript #๊ธฐ๋ฐ˜์˜ #ํ˜„๋Œ€์ ์ธ #๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿฌํ•œ #์ž๋™ํ™” #ํ…Œ์ŠคํŠธ๋ฅผ #CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜๋ฉด #์ง€์†์ ์ธ #๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋„ ์ฝ”๋“œ์˜ #์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์–ด์š”.



๊นจ๋—ํ•œ IP๋งŒ ๋ชจ์•„๋†“์€ ๊ณณ, VPN PC,  ๋ชจ๋ฐ”์ผ ์ง€์›์œผ๋กœ ์–ด๋–ค ๊ธฐ๊ธฐ์—์„œ๋„ OK!

https://vpn.luzensoft.com