JavaScript๋ฅผ ์ฌ์ฉํ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ ์๋ํ ์ข ํฉ ๊ฐ์ด๋. ์ ์ธ๊ณ ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์์ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก, ํ๋ ์์ํฌ, ์ ๋ต์ ์์๋ณด์ธ์.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ ์๋ํ: ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ JavaScript ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ์ ํจ์ฑ ๊ฒ์ฌ
์ค๋๋ ์ํธ ์ฐ๊ฒฐ๋ ๋์งํธ ํ๊ฒฝ์์ ์น์ฌ์ดํธ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์์ ์๋ฒฝํ๊ฒ ์๋ํ๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋์ฟ์์ ํฌ๋กฌ์ผ๋ก ์ฌ์ดํธ์ ์ ์ํ๋ ์ฌ์ฉ์๋ ๋ถ์๋ ธ์ค์์ด๋ ์ค์์ ํ์ด์ดํญ์ค๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์ ๋์ผํ ๋ฐ์ด๋ ๊ฒฝํ์ ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ๋ ๋ ์ด์ ์ ํ ์ฌํญ์ด ์๋๋๋ค. ์ด๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ๋๋ฌํ๊ณ ๊ธ์ ์ ์ธ ๋ธ๋๋ ํํ์ ์ ์งํ๊ธฐ ์ํ ํ์์ ์ธ ์์์ ๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ ์๋ํ์ ์ธ๊ณ๋ฅผ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ๋ฉฐ, ํนํ JavaScript๋ฅผ ํ์ฉํ์ฌ ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ์ด์ ์ฒด์ ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค. ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ธ ํ ์คํธ ์ ๋ต์ ๊ตฌํํ๋ ๋ฐ ๋์์ด ๋๋ ์ด์ , ๊ณผ์ , ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์ธ๊ธฐ ์๋ ํ๋ ์์ํฌ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ๊ฐ ์ค์ํ ์ด์ ๋ ๋ฌด์์ผ๊น์?
ํฌ๋กฌ, ํ์ด์ดํญ์ค, ์ฌํ๋ฆฌ, ์ฃ์ง, ์คํ๋ผ์ ๊ฐ์ ๋ค์ํ ๋ธ๋ผ์ฐ์ ๋ HTML, CSS, JavaScript ์ฝ๋๋ฅผ ์ฝ๊ฐ์ฉ ๋ค๋ฅด๊ฒ ํด์ํฉ๋๋ค. ์ด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์๊ฐ์ ๋ถ์ผ์น: ๊นจ์ง ๋ ์ด์์, ์ ๋ ฌ์ด ๋ง์ง ์๋ ์์, ์๊ณก๋ ์ด๋ฏธ์ง.
- ๊ธฐ๋ฅ์ ๋ฌธ์ : ์๋ํ์ง ์๋ ๋ฒํผ, ์ ์ถ๋์ง ์๋ ์์, JavaScript ์ค๋ฅ.
- ์ฑ๋ฅ ๋ฌธ์ : ๋๋ฆฐ ๋ก๋ฉ ์๊ฐ, ๋ฐ์์ด ์๋ ์ธํฐํ์ด์ค, ๋ฉ๋ชจ๋ฆฌ ๋์.
- ๋ณด์ ์ทจ์ฝ์ : ๋ธ๋ผ์ฐ์ ๋ณ ํน์ด์ ์ผ๋ก ์ธํ ์ ์ฉ ๊ฐ๋ฅํ ์ฝ์ .
๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ๋ฌด์ํ๋ฉด ๋จํธ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ํ์ฌ ๊ณ ๊ฐ ์ดํ, ๋ถ์ ์ ์ธ ๋ฆฌ๋ทฐ, ๋ธ๋๋ ์ด๋ฏธ์ง ์์์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ ์ผ์ ์ ์ฌ ๊ณ ๊ฐ์ด ์ฌํ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ์์ ์ ํ์ ๊ตฌ๋งคํ๋ ค๊ณ ํ๋๋ฐ '์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ' ๋ฒํผ์ด ๊ณ ์ฅ ๋ ์ํฉ์ ์์ํด ๋ณด์ญ์์ค. ๊ทธ๋ค์ ๊ตฌ๋งค๋ฅผ ํฌ๊ธฐํ๊ณ ๋ ์ํํ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒฝ์์ฌ๋ฅผ ์ฐพ์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๋ ๋์๊ฐ, ์ ๊ทผ์ฑ์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ๊ณผ ๊น์ด ์ฐ๊ด๋์ด ์์ต๋๋ค. ์น์ฌ์ดํธ๊ฐ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋์ง ์์ผ๋ฉด, ๋ณด์กฐ ๊ธฐ์ ์ ์์กดํ๋ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ ์ฝํ ์ธ ์ ์ ๊ทผํ์ง ๋ชปํ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ์ฐ์ ์ํ๋ ๊ฒ์ ํฌ๊ด์ ์ธ ์น ๋์์ธ์ ํต์ฌ ๊ตฌ์ฑ ์์์ด๋ฉฐ, ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ํํ์ ์ค๋๋ค.
์๋ํ์ ์ด์
์๋ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ๋ ์ง๋ฃจํ๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ณผ์ ์ ๋๋ค. ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์์ ์น์ฌ์ดํธ๋ฅผ ์๋์ผ๋ก ํ ์คํธํด์ผ ํ๋ฉฐ, ์ด๋ ํนํ ์ ๋ฐ์ดํธ๊ฐ ์ฆ์ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋นํ์ค์ ์ผ ์ ์์ต๋๋ค. ์๋ํ๋ ๋ค์๊ณผ ๊ฐ์ ์๋นํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ํจ์จ์ฑ ์ฆ๋: ์๋ํ๋ ํ ์คํธ๋ ๋น ๋ฅด๊ณ ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋ ์ ์์ด QA ํ์ด ๋ ๋ณต์กํ ํ ์คํธ ์์ ์ ์ง์คํ ์ ์์ต๋๋ค.
- ์ ํ์ฑ ํฅ์: ์๋ํ๋ ํ ์คํธ๋ ์ฌ๋์ ์ค์์ ๋ ์ทจ์ฝํ์ฌ ์ผ๊ด๋๊ณ ์ ๋ขฐํ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
- ๋น์ฉ ์ ๊ฐ: ์๋ํ๋ ํ ์คํธ์ ํ์ํ ์๊ฐ๊ณผ ์์์ ํฌ๊ฒ ์ค์ฌ ๋น์ฉ ์ ๊ฐ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋ ๋น ๋ฅธ ํผ๋๋ฐฑ: ์๋ํ๋ ํ ์คํธ๋ ์ฝ๋ ๋ณ๊ฒฝ์ ๋ํ ์ ์ํ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐ ์ฃผ๊ธฐ ์ด๊ธฐ์ ๋ฒ๊ทธ๋ฅผ ์๋ณํ๊ณ ์์ ํ ์ ์๋๋ก ํฉ๋๋ค.
- ๋ ๋์ ์ปค๋ฒ๋ฆฌ์ง: ์๋ํ๋ฅผ ํตํด ๋ ๊ด๋ฒ์ํ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์์ ์น์ฌ์ดํธ๋ฅผ ํ ์คํธํ์ฌ ํฌ๊ด์ ์ธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ๋ฅผ ์๋ํํจ์ผ๋ก์จ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ํํ๊ณ , ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ง์ ํฅ์์ํค๋ฉฐ, ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ค๊ตญ์ ์ ์์๊ฑฐ๋ ํ์ฌ๊ฐ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ์ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ์๋ํ๋ ํ ์คํธ๋ฅผ ํตํด ๊ธฐ๋ฅ์ ๋ฐฐํฌํ๊ธฐ ์ ์ ์ฌ๋ฌ ์ง์ญ์์ ์ธ๊ธฐ ์๋ ๋ค์ํ ๋ธ๋ผ์ฐ์ (์: ์์์์ UC ๋ธ๋ผ์ฐ์ , ๋ฌ์์์ ์๋ฑ์ค ๋ธ๋ผ์ฐ์ )์์ ๊ธฐ๋ฅ์ฑ์ ์ฆ์ ๊ฒ์ฆํ์ฌ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๊ณ ์ํํ ์ถ์๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ๋ฅผ ์ํ JavaScript ํ๋ ์์ํฌ
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ๋ฅผ ์๋ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ๊ฐ๋ ฅํ JavaScript ํ๋ ์์ํฌ๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ช ๊ฐ์ง ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ๋ ๋์(Selenium)
์ ๋ ๋์์ ์น ๋ธ๋ผ์ฐ์ ์ํธ ์์ฉ์ ์๋ํํ๊ธฐ ์ํด ๋๋ฆฌ ์ฌ์ฉ๋๋ ์คํ ์์ค ํ๋ ์์ํฌ์ ๋๋ค. JavaScript๋ฅผ ํฌํจํ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์๋ํ๋ ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฅ์ : ์ฑ์ํ๊ณ ์ ์ ๋ฆฝ๋์ด ์์ผ๋ฉฐ, ๊ด๋ฒ์ํ ๋ธ๋ผ์ฐ์ ์ ์ด์ ์ฒด์ ๋ฅผ ์ง์ํ๊ณ , ๋๊ท๋ชจ ์ปค๋ฎค๋ํฐ ์ง์์ ๋ฐ์ผ๋ฉฐ, ์ ์ฐํ๊ณ ์ฌ์ฉ์ ์ ์๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๋จ์ : ์ค์ ๋ฐ ๊ตฌ์ฑ์ด ๋ณต์กํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ผ๋ถ ํ๋ ์์ํฌ์ ๋นํด ๋ ๋ง์ ์ฝ๋ฉ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค.
- ์์: WebDriverJS์ ํจ๊ป ์ ๋ ๋์์ ์ฌ์ฉํ์ฌ ํฌ๋กฌ ๋ฐ ํ์ด์ดํญ์ค์์ ๋ก๊ทธ์ธ ํ๋ก์ธ์ค๋ฅผ ์๋ํํฉ๋๋ค.
const { Builder, By, Key, until } = require('selenium-webdriver');
(async function example() {
let driver = await new Builder().forBrowser('chrome').build();
try {
await driver.get('https://www.example.com/login');
await driver.findElement(By.id('username')).sendKeys('your_username');
await driver.findElement(By.id('password')).sendKeys('your_password', Key.RETURN);
await driver.wait(until.titleIs('Example Dashboard'), 5000);
} finally {
await driver.quit();
}
})();
์ฌ์ดํ๋ ์ค(Cypress)
์ฌ์ดํ๋ ์ค๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ์ค๊ณ๋ ํ๋์ ์ธ ์๋ํฌ์๋(end-to-end) ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. ์๊ฐ ์ฌํ ๋๋ฒ๊น ๋ฐ ์๋ ๋๊ธฐ์ ๊ฐ์ ๋ด์ฅ ๊ธฐ๋ฅ์ผ๋ก ์ ๋ ๋์์ ๋นํด ๋ ๊ฐ๋ฐ์ ์นํ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- ์ฅ์ : ์ค์ ๋ฐ ์ฌ์ฉ์ด ์ฝ๊ณ , ๋ฐ์ด๋ ๋๋ฒ๊น ๊ธฐ๋ฅ, ๋น ๋ฅด๊ณ ์์ ์ ์ด๋ฉฐ, ๋ด์ฅ๋ ๋จ์ธ(assertion) ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๋จ์ : ๋ธ๋ผ์ฐ์ ์ง์์ด ์ ํ์ ์ ๋๋ค(์ฃผ๋ก ํฌ๋กฌ ๊ธฐ๋ฐ ๋ธ๋ผ์ฐ์ , ํ์ด์ดํญ์ค ๋ฐ ์ฃ์ง์ ๋ํ ์คํ์ ์ง์).
- ์์: ์ฌ์ดํ๋ ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง์์ ์์์ ๊ฐ์์ฑ์ ํ์ธํฉ๋๋ค.
describe('My First Test', () => {
it('Visits the Kitchen Sink', () => {
cy.visit('https://example.cypress.io')
cy.contains('type').click()
cy.url().should('include', '/commands/actions')
cy.get('.action-email')
.type('fake@email.com')
.should('have.value', 'fake@email.com')
})
})
ํ๋ ์ด๋ผ์ดํธ(Playwright)
ํ๋ ์ด๋ผ์ดํธ๋ ๋ง์ดํฌ๋ก์ํํธ๊ฐ ๊ฐ๋ฐํ ๋ธ๋ผ์ฐ์ ์ํธ ์์ฉ ์๋ํ๋ฅผ ์ํ Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ํฌ๋ก๋ฏธ์, ํ์ด์ดํญ์ค, ์นํท(์ฌํ๋ฆฌ ์์ง)์ ์ง์ํ๋ฉฐ ์๋ํ๋ ํ ์คํธ ์์ฑ์ ์ํ ํฌ๋ก์ค ํ๋ซํผ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฅ์ : ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์ง์, ํฌ๋ก์ค ํ๋ซํผ, ๋น ๋ฅด๊ณ ์์ ์ ์ด๋ฉฐ, ๋ฐ์ด๋ ์๋ ๋๊ธฐ ๋ฐ ์ถ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๋จ์ : ์ ๋ ๋์์ ๋นํด ๋น๊ต์ ์๋กญ์ง๋ง ๋น ๋ฅด๊ฒ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ต๋๋ค.
- ์์: ํ๋ ์ด๋ผ์ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ์นํ์ด์ง์ ์คํฌ๋ฆฐ์ท์ ์บก์ฒํฉ๋๋ค.
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://www.example.com');
await page.screenshot({ path: 'example.png' });
await browser.close();
})();
ํ ์คํธ์นดํ(TestCafe)
ํ ์คํธ์นดํ๋ ๋ณ๋์ ์ค์ ์์ด ๋ฐ๋ก ์๋ํ๋ Node.js ์๋ํฌ์๋ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. WebDriver๋ ๋ธ๋ผ์ฐ์ ํ๋ฌ๊ทธ์ธ์ด ํ์ํ์ง ์์ ์ค์ ๋ฐ ์ฌ์ฉ์ด ๊ฐํธํฉ๋๋ค.
- ์ฅ์ : ์ค์ ๋ฐ ์ฌ์ฉ์ด ์ฝ๊ณ , WebDriver๊ฐ ํ์ ์์ผ๋ฉฐ, ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ์ง์ ๋ฐ ๋ด์ฅ๋ ๋ฆฌํฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๋จ์ : ๋ณต์กํ ํ ์คํธ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ ์ ๋ ๋์๋ณด๋ค ์ ์ฐ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
- ์์: ํ ์คํธ์นดํ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง์์ ์์์ ํ ์คํธ ์ฝํ ์ธ ๋ฅผ ํ์ธํฉ๋๋ค.
fixture `Getting Started`
.page `https://www.example.com`;
test('My first test', async t => {
await t
.expect(Selector('h1').innerText).eql('Example Domain');
});
์ฌ๋ฐ๋ฅธ ํ๋ ์์ํฌ ์ ํํ๊ธฐ
ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ ํฉํ ํ๋ ์์ํฌ๋ ํน์ ์๊ตฌ ์ฌํญ๊ณผ ํ์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๋ธ๋ผ์ฐ์ ์ง์: ํ๋ ์์ํฌ๊ฐ ํ ์คํธํด์ผ ํ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๋์ง ํ์ธํ์ญ์์ค.
- ์ฌ์ฉ ์ฉ์ด์ฑ: ํนํ ์๋ํ ํ ์คํธ ๊ฒฝํ์ด ์ ํ์ ์ธ ๊ฒฝ์ฐ ์ค์ ๋ฐ ์ฌ์ฉ์ด ์ฌ์ด ํ๋ ์์ํฌ๋ฅผ ์ ํํ์ญ์์ค.
- ์ปค๋ฎค๋ํฐ ์ง์: ํฌ๊ณ ํ๋ฐํ ์ปค๋ฎค๋ํฐ๊ฐ ์๋ ํ๋ ์์ํฌ๋ฅผ ์ ํํ๋ฉด ๋ฆฌ์์ค์ ์ง์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ฅ ๋ฐ ๊ธฐ๋ฅ์ฑ: ๊ฐ ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ๊ธฐ๋ฅ์ฑ์ ํ๊ฐํ๊ณ ํ ์คํธ ์๊ตฌ์ ๋ง๋ ๊ฒ์ ์ ํํ์ญ์์ค.
- ๋น์ฉ: ํนํ ์์ฉ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ ํ๋ ์์ํฌ์ ๊ด๋ จ๋ ๋ผ์ด์ ์ค ๋น์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
ํ ์คํธ ํ๊ฒฝ ์ค์ ํ๊ธฐ
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ ์๋ํ๋ฅผ ์์ํ๊ธฐ ์ ์ ํ ์คํธ ํ๊ฒฝ์ ์ค์ ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์์ด ํฌํจ๋ฉ๋๋ค.
- ํ์ํ ์ํํธ์จ์ด ์ค์น: Node.js, npm(๋ ธ๋ ํจํค์ง ๋งค๋์ ), ์ ํํ ํ ์คํธ ํ๋ ์์ํฌ.
- ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ฑ: ๋ธ๋ผ์ฐ์ ๋๋ผ์ด๋ฒ ๋ฐ ํ ์คํธ ๋ฌ๋์ ๊ฐ์ ํ ์คํธ ํ๋ ์์ํฌ์ ํ์ํ ๊ตฌ์ฑ์ ์ค์ ํฉ๋๋ค.
- ํ ์คํธ ํ๋ซํผ ์ ํ: ๋ก์ปฌ ๋จธ์ , ๊ฐ์ ๋จธ์ ๋๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ํ ์คํธ ์๋น์ค์ ๊ฐ์ ํ ์คํธ ์คํ ํ๋ซํผ์ ์ ํํฉ๋๋ค.
์์ฒด ์ธํ๋ผ๋ฅผ ๊ด๋ฆฌํ๋ ๋ถ๋ด ์์ด ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ์ด์ ์ฒด์ ์์ ํ ์คํธ๋ฅผ ์คํํ๋ ค๋ฉด ๋ธ๋ผ์ฐ์ ์คํ(BrowserStack) ๋ฐ ์์ค๋ฉ(Sauce Labs)๊ณผ ๊ฐ์ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ํ ์คํธ ํ๋ซํผ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
๋ธ๋ผ์ฐ์ ์คํ(BrowserStack)
๋ธ๋ผ์ฐ์ ์คํ์ ํด๋ผ์ฐ๋์์ ๋ค์ํ ์ค์ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ์ฌ ๋ค์ํ ์กฐ๊ฑด์์ ์น์ฌ์ดํธ๋ฅผ ํ ์คํธํ ์ ์๋๋ก ํฉ๋๋ค. ์ ๋ ๋์, ์ฌ์ดํ๋ ์ค, ํ๋ ์ด๋ผ์ดํธ๋ฅผ ํฌํจํ ๋ค์ํ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ง์ํฉ๋๋ค.
์์ค๋ฉ(Sauce Labs)
์์ค๋ฉ์ ๋ธ๋ผ์ฐ์ ์คํ๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ํ ์คํธ ํ๋ซํผ์ ๋๋ค. ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์์ ์๋ํ๋ ํ ์คํธ๋ฅผ ์คํํ๊ธฐ ์ํ ์์ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ ์๋ํ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ ์๋ํ์ ํจ๊ณผ๋ฅผ ๋ณด์ฅํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
- ์ผ์ฐ ์์ํ๊ธฐ: ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ๋ฅผ ํตํฉํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ํด๊ฒฐํ๊ธฐ ๋ ์ด๋ ต๊ณ ๋น์ฉ์ด ๋ง์ด ๋ค๊ธฐ ์ ์ ๊ฐ๋ฐ ์ฃผ๊ธฐ ์ด๊ธฐ์ ๋ฒ๊ทธ๋ฅผ ์๋ณํ๊ณ ์์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ํ ์คํธ ์ฐ์ ์์ ์ ํ๊ธฐ: ์น์ฌ์ดํธ์ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ๊ณผ ๊ธฐ๋ฅ์ฑ์ ๋จผ์ ํ ์คํธํ๋ ๋ฐ ์ง์คํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ํ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ์ฌ์ฉ์๊ฐ ๊ธ์ ์ ์ธ ๊ฒฝํ์ ํ ์ ์๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ ์ฌ์ฉํ๊ธฐ: ํฌ๊ด์ ์ธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ๊ด๋ฒ์ํ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์์ ์น์ฌ์ดํธ๋ฅผ ํ ์คํธํ์ญ์์ค. ๋์ ๊ณ ๊ฐ์๊ฒ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์๋น ๋ถ๋ถ์ด ์ค๊ตญ์ ์๋ค๋ฉด QQ ๋ธ๋ผ์ฐ์ ๋ ๋ฐ์ด๋ ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ๋ก ํ ์คํธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ํ ์คํธ ์์ฑํ๊ธฐ: ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ํ ์คํธ๋ฅผ ์์ฑํ์ญ์์ค. ํ ์คํธ์ ๋จ์ธ์ ์ค๋ช ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ ๋ณต์กํ ๋ ผ๋ฆฌ๋ ํผํ์ญ์์ค.
- ๋ฐ์ดํฐ ๊ธฐ๋ฐ ํ ์คํธ ์ฌ์ฉํ๊ธฐ: ๋ฐ์ดํฐ ๊ธฐ๋ฐ ํ ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ฐ์ดํฐ ์ธํธ๋ก ๋์ผํ ํ ์คํธ๋ฅผ ์คํํ์ญ์์ค. ์ด๋ ํน์ ์กฐ๊ฑด์์๋ง ๋ฐ์ํ๋ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์๊ฐ์ ํ๊ท ํ ์คํธ ๊ตฌํํ๊ธฐ: ์๊ฐ์ ํ๊ท ํ ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ์ ๋ค๋ฅธ ๋ฒ์ ๊ฐ์ ์๊ฐ์ ์ฐจ์ด๋ฅผ ๊ฐ์งํ์ญ์์ค. ์ด๋ ๋ ์ด์์ ๋ฌธ์ ๋ฐ ๊ธฐํ ์๊ฐ์ ๋ถ์ผ์น๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- CI/CD์ ํตํฉํ๊ธฐ: ์๋ํ๋ ํ ์คํธ๋ฅผ ์ง์์ ํตํฉ ๋ฐ ์ง์์ ๋ฐฐํฌ(CI/CD) ํ์ดํ๋ผ์ธ๊ณผ ํตํฉํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ํ ์คํธ๊ฐ ์๋์ผ๋ก ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ํ ์คํธ ์ ์ง ๊ด๋ฆฌํ๊ธฐ: ํ ์คํธ๊ฐ ์ฌ์ ํ ๊ด๋ จ์ฑ ์๊ณ ํจ๊ณผ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ผ๋ก ๊ฒํ ํ๊ณ ์ ๋ฐ์ดํธํ์ญ์์ค. ์น์ฌ์ดํธ๊ฐ ์งํํจ์ ๋ฐ๋ผ ํ ์คํธ๋ ํจ๊ป ์งํํด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
์๋ํ๋ ํ ์คํธ๋ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ง๋ง ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์์ธ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์์ ๋๋ค.
- CSS ์ ๋์ฌ(Prefixing): ๋ธ๋ผ์ฐ์ ๋ ํน์ ์์ฑ์ ๋ํด ๋ค๋ฅธ CSS ์ ๋์ฌ๊ฐ ํ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌํ๋ฆฌ์ ํฌ๋กฌ์ ๊ฒฝ์ฐ `-webkit-`, ํ์ด์ดํญ์ค์ ๊ฒฝ์ฐ `-moz-`, ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ์ ๊ฒฝ์ฐ `-ms-`๊ฐ ์์ต๋๋ค. ์คํ ํ๋ฆฌํฝ์(Autoprefixer)์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์ ๋์ฌ๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํ์ญ์์ค.
- JavaScript ๊ตฌ๋ฌธ: ์ด์ ๋ธ๋ผ์ฐ์ ๋ ์ต์ JavaScript ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ ์ ์์ต๋๋ค. ๋ฐ๋ฒจ(Babel)๊ณผ ๊ฐ์ ํธ๋์คํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ผ์ฐ์ ์ ํธํ๋๋ ๋ฒ์ ์ผ๋ก ๋ณํํ์ญ์์ค.
- HTML5 ๊ธฐ๋ฅ: ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ชจ๋ HTML5 ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒ์ ์๋๋๋ค. ๊ธฐ๋ฅ ๊ฐ์ง(feature detection)๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ํน์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ง์ํ๋์ง ํ์ธํ์ญ์์ค.
- ๊ธ๊ผด ๋ ๋๋ง: ๋ธ๋ผ์ฐ์ ๋ง๋ค ๊ธ๊ผด์ ๋ค๋ฅด๊ฒ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์น ๊ธ๊ผด์ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์ ๋ง๊ฒ ์ต์ ํํ์ญ์์ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ์ ๋ฏธ๋
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ๋ ์งํํ๋ ๋ถ์ผ์ ๋๋ค. ์๋ก์ด ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ๊ฐ ๋ฑ์ฅํ๊ณ ์น ๊ธฐ์ ์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ธ ํ ์คํธ ์ ๋ต์ ํ์์ฑ์ ๋์ฑ ์ปค์ง ๊ฒ์ ๋๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ์ ๋ฏธ๋์์ ์ฃผ๋ชฉํด์ผ ํ ๋ช ๊ฐ์ง ํธ๋ ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- AI ๊ธฐ๋ฐ ํ ์คํธ: ์ธ๊ณต์ง๋ฅ(AI)์ ํ ์คํธ ์ผ์ด์ค ์์ฑ ๋ฐ ๋ฒ๊ทธ ๊ฐ์ง์ ๊ฐ์ ํ ์คํธ์ ๋ค์ํ ์ธก๋ฉด์ ์๋ํํ๋ ๋ฐ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
- ์๊ฐ์ AI ํ ์คํธ: ์ ํ๋ฆฌํด์ฆ(Applitools)์ ๊ฐ์ ๋๊ตฌ๋ ์๊ฐ์ AI๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ์ ํ๊ท๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ์ฌ ์๊ฐ์ ํ ์คํธ์ ์ ํ์ฑ๊ณผ ํจ์จ์ฑ์ ํฅ์์ํต๋๋ค.
- ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ํ ์คํธ ํ๋ซํผ: ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ํ ์คํธ ํ๋ซํผ์ ๋ก์ปฌ ์ธํ๋ผ ์์ด๋ ๊ด๋ฒ์ํ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์ ์ ๋ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ต๋๋ค.
- ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ : ๊ทธ๋ํฝ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(GUI) ์์ด ์คํ๋๋ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ์กด ๋ธ๋ผ์ฐ์ ๋ณด๋ค ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ฏ๋ก ์๋ํ๋ ํ ์คํธ์ ์ ์ ๋ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ต๋๋ค.
- ์ ๊ทผ์ฑ ํ ์คํธ ํตํฉ: ์ ์ธ๊ณ์ ์ผ๋ก ํฌ๊ด์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ ์ํฌํ๋ก์ฐ ๋ด์์ ์ ๊ทผ์ฑ ํ ์คํธ๋ฅผ ๋์ฑ ๊ธด๋ฐํ๊ฒ ํตํฉํ๋ ๊ฒ์ด ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ต๋๋ค.
๊ฒฐ๋ก
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ ์๋ํ๋ ํ๋ ์น ๊ฐ๋ฐ์ ํ์์ ์ธ ๋ถ๋ถ์ ๋๋ค. ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ธ ํ ์คํธ ์ ๋ต์ ๊ตฌํํจ์ผ๋ก์จ ์น์ฌ์ดํธ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์์ ์๋ฒฝํ๊ฒ ์๋ํ๋๋ก ๋ณด์ฅํ๊ณ , ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋๊ณ ๊ธ์ ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ JavaScript ํ๋ ์์ํฌ๋ฅผ ์ ํํ๊ณ , ํ ์คํธ ํ๊ฒฝ์ ์ค์ ํ๊ณ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ , ์ต์ ํธ๋ ๋๋ฅผ ํ์ ํ์ฌ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ ๋ ธ๋ ฅ์ ํจ๊ณผ๋ฅผ ๊ทน๋ํํ์ญ์์ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ ์คํธ ์๋ํ๋ฅผ ์์ฉํจ์ผ๋ก์จ ์ ์ธ๊ณ ์ฌ์ฉ์์ ๋ค์ํ ์๊ตฌ๋ฅผ ์ถฉ์กฑ์ํค๋ ๋ฐ์ด๋ ์น ๊ฒฝํ์ ์ ๊ณตํ๊ณ , ๊ถ๊ทน์ ์ผ๋ก ๋น์ฆ๋์ค ์ฑ๊ณต์ ์ด๋๊ณ ๊ธ์ ์ ์ธ ๋ธ๋๋ ์ด๋ฏธ์ง๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.