
PHP ์จ๋ผ์ธ ๊ฐ์
>PHP - ์ต์๊ธ
๐ 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) ํ ์คํธ์ ์ ์์ ์ญํ
#E2E(#End-to-End) #ํ ์คํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ #์ฒ์๋ถํฐ #๋๊น์ง(#End_to_End) ์ ์ฒด ํ๋ฆ์ ๊ฒ์ฆํ๋ #ํ ์คํธ #์๋ํ ๋ฐฉ๋ฒ์ด์์. #๋จ์ #ํ ์คํธ๋ #ํตํฉ #ํ ์คํธ๊ฐ ์ฝ๋์ ํน์ ๋ถ๋ถ์ด๋ ๊ฒฐํฉ๋ #๋ชจ๋์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๋ค๋ฉด, #E2E ํ ์คํธ๋ #์ค์ #์ฌ์ฉ์์ ๊ด์ ์์ ์์คํ ์ ๋ชจ๋ #์ปดํฌ๋ํธ๊ฐ ์ ๋๋ก ์ฐ๋๋๋์ง ํ์ธํด์.
์ด๋ #์น #๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์ฌ์ฉ์์ #๋ก๊ทธ์ธ, #์ํ #๊ตฌ๋งค, #ํ์ด์ง #์ด๋ ๋ฑ ๋ณต์กํ #์๋๋ฆฌ์ค๋ฅผ #์๋ฎฌ๋ ์ด์ ํ์ฌ #ํ๋ก ํธ์๋๋ถํฐ #๋ฐฑ์๋ #๋ฐ์ดํฐ๋ฒ ์ด์ค๊น์ง ์ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ #๋ฒ๊ทธ๋ฅผ ์ฌ์ ์ ๋ฐ๊ฒฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํด์. #PHP #์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์ฃผ๋ก #ํ๋ก ํธ์๋ #๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ข ์ ์ธ #HTTP #์๋ต๊ณผ #๋ธ๋ผ์ฐ์ #๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ๊ฒ ๋ผ์.
Codeception์ ์ด์ฉํ E2E ํ ์คํธ (PHP ์ค์ฌ)
#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 ํ ์คํธ (ํ๋ก ํธ์๋ ์ค์ฌ)
#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!