๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ JavaScript ํ ์คํธ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ์ธ์. ํ ์คํธ ํ๋ ์์ํฌ, CI/CD ํตํฉ, ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง, ํฌ๊ด์ ์ธ ์ํํธ์จ์ด ํ์ง ๋ณด์ฆ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์๋ณด์ธ์.
JavaScript ํ ์คํธ ์ธํ๋ผ: ์๋ฒฝํ ๊ตฌํ ๊ฐ์ด๋
์ค๋๋ ์ ์ญ๋์ ์ธ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์์ ๊ฒฌ๊ณ ํ ํ ์คํธ ์ธํ๋ผ๋ ๋จ์ํ ์ฅ์ ์ด ์๋๋ผ ํ์์ ๋๋ค. ์ํธ์์ฉ์ ์ธ ์น์ฌ์ดํธ๋ถํฐ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ , Node.js๋ฅผ ์ฌ์ฉํ ์๋ฒ ์ฌ์ด๋ ํ๊ฒฝ๊น์ง ๋ชจ๋ ๊ฒ์ ๊ตฌ๋ํ๋ JavaScript ํ๋ก์ ํธ์์ ์ ์ ์๋ ํ ์คํธ ์ ๋ต์ ๊ณ ํ์ง์ ์ ๋ขฐํ ์ ์๋ ์ฝ๋๋ฅผ ์ ๊ณตํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋๋ ์ฌ๋ฐ๋ฅธ ๋๊ตฌ ์ ํ๋ถํฐ ์๋ํ๋ ํ ์คํธ ์ํฌํ๋ก ๊ตฌํ ๋ฐ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ชจ๋ํฐ๋ง์ ์ด๋ฅด๊ธฐ๊น์ง ์๋ฒฝํ JavaScript ํ ์คํธ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๊ณ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํฌ๊ด์ ์ธ ์ค๋ช ์ ์ ๊ณตํฉ๋๋ค.
JavaScript ํ ์คํธ ์ธํ๋ผ๊ฐ ์ค์ํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
๊ฒฌ๊ณ ํ ํ ์คํธ ์ธํ๋ผ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ค์ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ์กฐ๊ธฐ ๋ฒ๊ทธ ๋ฐ๊ฒฌ: ๊ฐ๋ฐ ์ฃผ๊ธฐ ์ด๊ธฐ์ ๋ฒ๊ทธ๋ฅผ ์๋ณํ๊ณ ์์ ํ๋ ๊ฒ์ ํ๋ก๋์ ํ๊ฒฝ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น์ฉ์ด ์ ๊ฒ ๋ค๊ณ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ต๋๋ค.
- ์ฝ๋ ํ์ง ํฅ์: ํ ์คํธ๋ ๊ฐ๋ฐ์๊ฐ ๋ ๊นจ๋ํ๊ณ ๋ชจ๋ํ๋์์ผ๋ฉฐ ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ์ฅ๋ คํฉ๋๋ค.
- ํ๊ท ์ํ ๊ฐ์: ์๋ํ๋ ํ ์คํธ๋ ์๋ก์ด ๋ณ๊ฒฝ ์ฌํญ์ด ๊ธฐ์กด ๊ธฐ๋ฅ์ ์์์ํค์ง ์๋๋ก ๋ณด์ฅํ์ฌ ํ๊ท๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋ ๋น ๋ฅธ ๊ฐ๋ฐ ์ฃผ๊ธฐ: ์๋ํ๋ ํ ์คํธ๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ํ๊ฒ ํ์ธํ๊ณ ๋ ๋น ๋ฅด๊ฒ ๋ฐ๋ณต ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ์์ ๊ฐ ์ฆ๊ฐ: ์ ํ ์คํธ๋ ์ฝ๋๋ฒ ์ด์ค๋ ๊ฐ๋ฐ์๊ฐ ๋ณ๊ฒฝ ์์ ์ ์ํํ ๋ ์์ ๊ฐ์ ์ฃผ์ด ๋ ๋น ๋ฅธ ํ์ ๊ณผ ์ ๋ฐ์ ์ธ ์์ฐ์ฑ ํฅ์์ผ๋ก ์ด์ด์ง๋๋ค.
- ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ: ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๊ณ ๊ธฐ๋ฅ์ฑ์ ๋ณด์ฅํจ์ผ๋ก์จ ํ ์คํธ๋ ์ต์ข ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ ์ ์ผ๋ก ๊ฐ์ ํฉ๋๋ค.
JavaScript ํ ์คํธ ์ธํ๋ผ์ ํต์ฌ ๊ตฌ์ฑ ์์
A complete JavaScript testing infrastructure encompasses several key components, each playing a vital role in ensuring software quality.1. ํ ์คํธ ํ๋ ์์ํฌ
ํ ์คํธ ํ๋ ์์ํฌ๋ ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์คํํ๋ ๋ฐ ํ์ํ ๊ตฌ์กฐ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ธ๊ธฐ ์๋ JavaScript ํ ์คํธ ํ๋ ์์ํฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Jest: Facebook์์ ๊ฐ๋ฐํ Jest๋ ์ ๋ก ๊ตฌ์ฑ, ์ค๋ ์ท ํ ์คํธ, ๋ฐ์ด๋ ๋ชจํน(mocking) ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฌ์ธ์(batteries-included) ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ธ๊ธฐ ์๋ ์ ํ์ด๋ฉฐ JavaScript ์ํ๊ณ ์ ๋ฐ์ ๊ฑธ์ณ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ต๋๋ค.
- Mocha: Mocha๋ ๋จ์ธ(assertion) ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ชจํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ ์คํธ ๋ฌ๋๋ฅผ ์ง์ ์ ํํ ์ ์๋ ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. ๋ง์ถคํ ํ ์คํธ ์ํฌํ๋ก๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค.
- Jasmine: Jasmine์ ํ ์คํธ ์์ฑ์ ์ํ ๊นจ๋ํ๊ณ ๊ฐ๋ ์ฑ ๋์ ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ ํ๋ ์ฃผ๋ ๊ฐ๋ฐ(BDD) ํ๋ ์์ํฌ์ ๋๋ค. ์ฃผ๋ก Angular ํ๋ก์ ํธ์์ ์ฌ์ฉ๋ฉ๋๋ค.
- Cypress: Cypress๋ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ๋ชจ๋ ๊ฒ์ ํ ์คํธํ๊ธฐ ์ํด ์ค๊ณ๋ ์๋ํฌ์๋ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. ์ฌ์ฉ์ ์นํ์ ์ธ ์ธํฐํ์ด์ค์ ๊ฐ๋ ฅํ ๋๋ฒ๊น ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Playwright: Microsoft์์ ๊ฐ๋ฐํ Playwright๋ ์ ๋ขฐํ ์ ์๋ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํ ์คํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ต์ ์๋ํฌ์๋ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค.
์์: Jest
๊ฐ๋จํ JavaScript ํจ์๋ฅผ ๊ณ ๋ คํด ๋ด ์๋ค:
function sum(a, b) {
return a + b;
}
module.exports = sum;
์ด ํจ์์ ๋ํ Jest ํ ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
const sum = require('./sum');
describe('sum', () => {
it('should add two numbers correctly', () => {
expect(sum(1, 2)).toBe(3);
});
});
2. ๋จ์ธ(Assertion) ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋จ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ ์คํธ์์ ์์๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์๋์ง ํ์ธํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋จ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Chai: Chai๋ `expect`, `should`, `assert`์ ์ธ ๊ฐ์ง ๋ค๋ฅธ ์คํ์ผ์ ์ง์ํ๋ ๋ค์ฌ๋ค๋ฅํ ๋จ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- Assert (Node.js): Node.js์ ๋ด์ฅ๋ `assert` ๋ชจ๋์ ๊ธฐ๋ณธ์ ์ธ ๋จ์ธ ๋ฉ์๋ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Unexpected: Unexpected๋ ์ฌ์ฉ์ ์ ์ ๋จ์ธ์ ์ ์ํ ์ ์๋ ๋ ํ์ฅ ๊ฐ๋ฅํ ๋จ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์์: Chai
const chai = require('chai');
const expect = chai.expect;
describe('Array', () => {
it('should include a specific element', () => {
const arr = [1, 2, 3];
expect(arr).to.include(2);
});
});
3. ๋ชจํน(Mocking) ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ชจํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์คํธ์์ ์์กด์ฑ์ ์ ์ด๋ ๋์ฒด๋ฌผ๋ก ๊ต์ฒดํ์ฌ ๊ฐ๋ณ ์ฝ๋ ๋จ์๋ฅผ ๊ฒฉ๋ฆฌํ๊ณ ํ ์คํธํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ธ๊ธฐ ์๋ ๋ชจํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Jest์ ๋ด์ฅ ๋ชจํน ๊ธฐ๋ฅ: Jest๋ ๊ฐ๋ ฅํ ๋ด์ฅ ๋ชจํน ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ํจ์, ๋ชจ๋ ๋ฐ ์์กด์ฑ์ ์ฝ๊ฒ ๋ชจํนํ ์ ์์ต๋๋ค.
- Sinon.JS: Sinon.JS๋ JavaScript ์ฝ๋๋ฅผ ํ ์คํธํ๊ธฐ ์ํ ์คํ์ด(spy), ์คํ (stub), ๋ชฉ(mock)์ ์ ๊ณตํ๋ ๋ ๋ฆฝํ ๋ชจํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- TestDouble: TestDouble์ ๋ชฉ์ ์ ์ํ๊ธฐ ์ํ ๋ช ํํ๊ณ ๊ฐ๋ ์ฑ ๋์ ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ ๋ฐ ์ค์ ์ ๋ ๋ชจํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์์: Sinon.JS
const sinon = require('sinon');
const myModule = require('./myModule');
describe('myFunction', () => {
it('should call the dependency once', () => {
const myDependency = {
doSomething: () => {},
};
const spy = sinon.spy(myDependency, 'doSomething');
myModule.myFunction(myDependency);
expect(spy.calledOnce).to.be.true;
});
});
4. ํ ์คํธ ๋ฌ๋
ํ ์คํธ ๋ฌ๋๋ ํ ์คํธ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ์ ๋ํ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค. ์ธ๊ธฐ ์๋ JavaScript ํ ์คํธ ๋ฌ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Jest: Jest๋ ์์ฒด์ ์ผ๋ก ํ ์คํธ ๋ฌ๋ ์ญํ ์ ํฉ๋๋ค.
- Mocha: Mocha๋ ๋ณ๋์ ๋จ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ฉฐ ๋ค์ํ ๋ฆฌํฌํฐ์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Karma: Karma๋ ์ค์ ๋ธ๋ผ์ฐ์ ์์ ์ฝ๋๋ฅผ ํ ์คํธํ๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋ ํ ์คํธ ๋ฌ๋์ ๋๋ค.
5. ์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ (CI/CD)
CI/CD๋ ํ๋์ ์ธ ํ ์คํธ ์ธํ๋ผ์ ์ค์ํ ๋ถ๋ถ์ ๋๋ค. ์ฝ๋ ๋ณ๊ฒฝ์ด ์์ ๋๋ง๋ค ํ ์คํธ๋ฅผ ์คํํ๋ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ฌ ์ฝ๋๋ฒ ์ด์ค๊ฐ ์์ ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ธ๊ธฐ ์๋ CI/CD ํ๋ซํผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- GitHub Actions: GitHub์ ์ง์ ํตํฉ๋ Actions๋ ํ ์คํธ ๋ฐ ๋ฐฐํฌ ์ํฌํ๋ก๋ฅผ ์๋ํํ๊ธฐ ์ํ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค.
- Jenkins: Jenkins๋ ๊ด๋ฒ์ํ ํ๋ฌ๊ทธ์ธ๊ณผ ํตํฉ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์คํ ์์ค CI/CD ์๋ฒ์ ๋๋ค.
- CircleCI: CircleCI๋ ๊ฐ์ํ๋๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ CI/CD ํ๋ซํผ์ ๋๋ค.
- Travis CI: Travis CI๋ ์คํ ์์ค ํ๋ก์ ํธ์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ ๋ค๋ฅธ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ CI/CD ํ๋ซํผ์ ๋๋ค.
- GitLab CI/CD: GitLab์ ํ๋ซํผ ๋ด์ CI/CD ๊ธฐ๋ฅ์ ์ง์ ํฌํจํ๊ณ ์์ต๋๋ค.
์์: GitHub Actions
๋ค์์ ๋ชจ๋ ํธ์(push) ๋ฐ ํ ๋ฆฌํ์คํธ(pull request)์์ Jest ํ ์คํธ๋ฅผ ์คํํ๋ ๊ฐ๋จํ GitHub Actions ์ํฌํ๋ก์ ๋๋ค:
name: Node CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js 14.x
uses: actions/setup-node@v2
with:
node-version: 14.x
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
npm test
6. ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ๋ ํ ์คํธ๋ก ์ปค๋ฒ๋๋ ์ฝ๋๋ฒ ์ด์ค์ ๋น์จ์ ์ธก์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ์ ํ๊ฒ ํ ์คํธ๋์ง ์์ ์์ญ์ ์๋ณํ๊ณ ํ ์คํธ ๋ ธ๋ ฅ์ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ธ๊ธฐ ์๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Istanbul: Istanbul์ JavaScript์ฉ์ผ๋ก ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ์ ๋๋ค.
- NYC: NYC๋ Istanbul์ฉ ์ปค๋งจ๋ ๋ผ์ธ ์ธํฐํ์ด์ค์ ๋๋ค.
- Jest์ ๋ด์ฅ ์ปค๋ฒ๋ฆฌ์ง ๊ธฐ๋ฅ: Jest๋ ๋ด์ฅ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์์ต๋๋ค.
์์: Jest ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง
Jest์์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํ์ฑํํ๋ ค๋ฉด ํ ์คํธ ๋ช ๋ น์ด์ `--coverage` ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค:
npm test -- --coverage
์ด๋ ๊ฒ ํ๋ฉด `coverage` ๋๋ ํ ๋ฆฌ์ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๊ฐ ์์ฑ๋ฉ๋๋ค.
7. ์ ์ ๋ถ์ ๋๊ตฌ
์ ์ ๋ถ์ ๋๊ตฌ๋ ์ฝ๋๋ฅผ ์คํํ์ง ์๊ณ ๋ถ์ํ์ฌ ์ ์ฌ์ ์ธ ์ค๋ฅ, ์คํ์ผ ์๋ฐ ๋ฐ ๋ณด์ ์ทจ์ฝ์ ์ ์๋ณํฉ๋๋ค. ์ธ๊ธฐ ์๋ ์ ์ ๋ถ์ ๋๊ตฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ESLint: ESLint๋ ์ฝ๋ฉ ํ์ค์ ๊ฐ์ ํ๊ณ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋๋ ์ธ๊ธฐ ์๋ ๋ฆฐํฐ(linter)์ ๋๋ค.
- JSHint: JSHint๋ JavaScript์ฉ์ผ๋ก ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ ๋ค๋ฅธ ๋ฆฐํฐ์ ๋๋ค.
- TSLint: TSLint๋ TypeScript ์ฝ๋์ฉ์ผ๋ก ํน๋ณํ ์ค๊ณ๋ ๋ฆฐํฐ์ ๋๋ค (ํ์ฌ๋ ESLint ์ฌ์ฉ์ ์ํด ํ๊ธฐ๋จ).
- SonarQube: SonarQube๋ ์ฝ๋ ํ์ง์ ์ง์์ ์ผ๋ก ๊ฒ์ฌํ๊ธฐ ์ํ ํ๋ซํผ์ ๋๋ค.
์์: ESLint
ESLint๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ํ๋ก์ ํธ์ `.eslintrc.js` ํ์ผ์ ์์ฑํ์ธ์:
module.exports = {
"env": {
"browser": true,
"es2021": true,
"node": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 12,
"sourceType": "module"
},
"plugins": [
"react"
],
"rules": {
"semi": ["error", "always"],
"quotes": ["error", "single"]
}
};
JavaScript ํ ์คํธ์ ์ข ๋ฅ
ํฌ๊ด์ ์ธ ํ ์คํธ ์ ๋ต์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์ธก๋ฉด์ ์ด์ ์ ๋ง์ถ ๋ค์ํ ์ ํ์ ํ ์คํธ๊ฐ ํฌํจ๋ฉ๋๋ค.
1. ์ ๋ ํ ์คํธ
์ ๋ ํ ์คํธ๋ ํจ์๋ ํด๋์ค์ ๊ฐ์ ๊ฐ๋ณ ์ฝ๋ ๋จ์๋ฅผ ๊ฒฉ๋ฆฌํ์ฌ ํ ์คํธํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค. ๋ชฉํ๋ ๊ฐ ๋จ์๊ฐ ์์๋๋ก ๋์ํ๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค. ์ ๋ ํ ์คํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๋น ๋ฅด๊ณ ์์ฑํ๊ธฐ ์ฝ์ต๋๋ค.
2. ํตํฉ ํ ์คํธ
ํตํฉ ํ ์คํธ๋ ์๋ก ๋ค๋ฅธ ์ฝ๋ ๋จ์๊ฐ ํจ๊ป ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํฉ๋๋ค. ์ด ํ ์คํธ๋ ๋ชจ๋๊ณผ ์ปดํฌ๋ํธ ๊ฐ์ ์ํธ์์ฉ์ ์ค์ ์ ๋ก๋๋ค. ์ ๋ ํ ์คํธ๋ณด๋ค ๋ณต์กํ๋ฉฐ ์์กด์ฑ์ ์ค์ ํ๊ณ ์ธ๋ถ ์๋น์ค๋ฅผ ๋ชจํนํด์ผ ํ ์ ์์ต๋๋ค.
3. ์๋ํฌ์๋(E2E) ํ ์คํธ
์๋ํฌ์๋ ํ ์คํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ์ ์ค์ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์ฒ์๋ถํฐ ๋๊น์ง ์ ์ฒด ์ํฌํ๋ก๋ฅผ ํ ์คํธํฉ๋๋ค. ์ด ํ ์คํธ๋ ๊ฐ์ฅ ํฌ๊ด์ ์ด์ง๋ง ๊ฐ์ฅ ๋๋ฆฌ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ด๋ ต์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ค์ํ ์ฌ์ฉ์ ํ๋ฆ์ ํ์ธํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ๋ก๋์ ๊ณผ ์ ์ฌํ ํ๊ฒฝ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
4. ๊ธฐ๋ฅ ํ ์คํธ
๊ธฐ๋ฅ ํ ์คํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๊ธฐ๋ฅ์ด ์์๋๋ก ์๋ํ๋์ง ํ์ธํฉ๋๋ค. ์ฌ์ฉ์ ๊ด์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ํ ์คํธํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค. E2E ํ ์คํธ์ ์ ์ฌํ์ง๋ง ์์ ํ ์ํฌํ๋ก๋ณด๋ค๋ ํน์ ๊ธฐ๋ฅ์ ์ด์ ์ ๋ง์ถ ์ ์์ต๋๋ค.
5. ์ฑ๋ฅ ํ ์คํธ
์ฑ๋ฅ ํ ์คํธ๋ ๋ค์ํ ์กฐ๊ฑด์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํ๊ฐํฉ๋๋ค. ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ๋ถํ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋์ง ํ์ธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. JMeter, LoadView, Lighthouse์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฑ๋ฅ ํ ์คํธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
JavaScript ํ ์คํธ ์ธํ๋ผ ๊ตฌํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๊ฒฌ๊ณ ํ JavaScript ํ ์คํธ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๊ณ ์ ์งํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ ์คํธ๋ฅผ ์กฐ๊ธฐ์ ๊ทธ๋ฆฌ๊ณ ์์ฃผ ์์ฑํ์ธ์: ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD) ๋๋ ํ๋ ์ฃผ๋ ๊ฐ๋ฐ(BDD)์ ์ฑํํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์.
- ํ ์คํธ์ ์ง์คํ์ธ์: ๊ฐ ํ ์คํธ๋ ์ฝ๋์ ๋จ์ผ ์ธก๋ฉด์ ํ ์คํธํ๋ ๋ฐ ์ง์คํด์ผ ํฉ๋๋ค.
- ๋ช ํํ๊ณ ๊ฐ๋ ์ฑ ์๋ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์: ํ ์คํธ์ ๋จ์ธ์ ์ค๋ช ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์.
- ํ ์คํธ์์ ๋ณต์กํ ๋ก์ง์ ํผํ์ธ์: ํ ์คํธ๋ ๊ฐ๋จํ๊ณ ์ดํดํ๊ธฐ ์ฌ์์ผ ํฉ๋๋ค.
- ๋ชจํน์ ์ ์ ํ๊ฒ ์ฌ์ฉํ์ธ์: ์ธ๋ถ ์์กด์ฑ์ ๋ชจํนํ์ฌ ํ ์คํธ๋ฅผ ๊ฒฉ๋ฆฌํ์ธ์.
- ํ ์คํธ๋ฅผ ์๋์ผ๋ก ์คํํ์ธ์: ํ ์คํธ๋ฅผ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ์ธ์.
- ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ชจ๋ํฐ๋งํ์ธ์: ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ถ์ ํ์ฌ ๋ ๋ง์ ํ ์คํธ๊ฐ ํ์ํ ์์ญ์ ์๋ณํ์ธ์.
- ํ ์คํธ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ๋ฆฌํฉํฐ๋งํ์ธ์: ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ ํ ์คํธ๋ ์ต์ ์ํ๋ก ์ ์งํ์ธ์.
- ์ผ๊ด๋ ํ ์คํธ ์คํ์ผ์ ์ฌ์ฉํ์ธ์: ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ ํ ์คํธ ์คํ์ผ์ ์ฑํํ์ธ์.
- ํ ์คํธ ์ ๋ต์ ๋ฌธ์ํํ์ธ์: ํ ์คํธ ์ ๋ต๊ณผ ๊ฐ์ด๋๋ผ์ธ์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ธ์.
์ฌ๋ฐ๋ฅธ ๋๊ตฌ ์ ํํ๊ธฐ
ํ ์คํธ ๋๊ตฌ์ ์ ํ์ ํ๋ก์ ํธ์ ์๊ตฌ ์ฌํญ๊ณผ ํน์ ํ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๋๊ตฌ๋ฅผ ์ ํํ ๋ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ธ์:
- ํ๋ก์ ํธ ๊ท๋ชจ์ ๋ณต์ก์ฑ: ์๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ Jest์ ๊ฐ์ ๊ฐ๋จํ ํ ์คํธ ํ๋ ์์ํฌ๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค. ๋ ํฌ๊ณ ๋ณต์กํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ Mocha๋ Cypress์ ๊ฐ์ ๋ ์ ์ฐํ ํ๋ ์์ํฌ๊ฐ ๋ ๋์ ์ ํ์ผ ์ ์์ต๋๋ค.
- ํ์ ๊ฒฝํ: ํ์ด ์ต์ํ๊ฑฐ๋ ๋ฐฐ์ธ ์ํฅ์ด ์๋ ๋๊ตฌ๋ฅผ ์ ํํ์ธ์.
- ๊ธฐ์กด ๋๊ตฌ์์ ํตํฉ: ์ ํํ ๋๊ตฌ๊ฐ ๊ธฐ์กด ๊ฐ๋ฐ ์ํฌํ๋ก ๋ฐ CI/CD ํ์ดํ๋ผ์ธ๊ณผ ์ ํตํฉ๋๋์ง ํ์ธํ์ธ์.
- ์ปค๋ฎค๋ํฐ ์ง์: ๊ฐ๋ ฅํ ์ปค๋ฎค๋ํฐ์ ์ข์ ๋ฌธ์๋ฅผ ๊ฐ์ถ ๋๊ตฌ๋ฅผ ์ ํํ์ธ์.
- ๋น์ฉ: ํนํ ์์ฉ CI/CD ํ๋ซํผ์ ๊ฒฝ์ฐ ๋๊ตฌ ๋น์ฉ์ ๊ณ ๋ คํ์ธ์.
๊ตฌํ ์์: Jest์ GitHub Actions๋ก ํ ์คํธ ์ธํ๋ผ ๊ตฌ์ถํ๊ธฐ
Jest๋ฅผ ํ ์คํธ์ฉ์ผ๋ก, GitHub Actions๋ฅผ CI/CD์ฉ์ผ๋ก ์ฌ์ฉํ์ฌ JavaScript ํ ์คํธ ์ธํ๋ผ์ ์์ ํ ๊ตฌํ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
1๋จ๊ณ: ํ๋ก์ ํธ ์ค์
์๋ก์ด JavaScript ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค:
mkdir my-project
cd my-project
npm init -y
2๋จ๊ณ: Jest ์ค์น
npm install --save-dev jest
3๋จ๊ณ: ํ ์คํธ ํ์ผ ์์ฑ
`sum.js`๋ผ๋ ์ด๋ฆ์ ํ์ผ์ ์์ฑํฉ๋๋ค:
function sum(a, b) {
return a + b;
}
module.exports = sum;
`sum.test.js`๋ผ๋ ์ด๋ฆ์ ํ ์คํธ ํ์ผ์ ์์ฑํฉ๋๋ค:
const sum = require('./sum');
describe('sum', () => {
it('should add two numbers correctly', () => {
expect(sum(1, 2)).toBe(3);
});
});
4๋จ๊ณ: Jest ๊ตฌ์ฑ
ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด `package.json` ํ์ผ์ ๋ค์ ์ค์ ์ถ๊ฐํฉ๋๋ค:
"scripts": {
"test": "jest"
}
5๋จ๊ณ: ๋ก์ปฌ์์ ํ ์คํธ ์คํ
npm test
6๋จ๊ณ: GitHub Actions ๊ตฌ์ฑ
`.github/workflows/node.js.yml`๋ผ๋ ์ด๋ฆ์ ํ์ผ์ ์์ฑํฉ๋๋ค:
name: Node CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js 14.x
uses: actions/setup-node@v2
with:
node-version: 14.x
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
npm test
7๋จ๊ณ: ์ฝ๋ ์ปค๋ฐ ๋ฐ ํธ์
๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํ๊ณ GitHub์ ํธ์ํฉ๋๋ค. GitHub Actions๋ ๋ชจ๋ ํธ์ ๋ฐ ํ ๋ฆฌํ์คํธ์์ ์๋์ผ๋ก ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค์ฌํญ
๊ธ๋ก๋ฒ ํ์ด๋ ์ ํ์ ์ํ ํ ์คํธ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ๋ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ธ์:
- ํ์งํ ํ ์คํธ: ๋ ์ง ํ์, ํตํ ๊ธฐํธ, ์ธ์ด ๋ฒ์ญ๊ณผ ๊ฐ์ ํ์งํ ์ธก๋ฉด์ ํ ์คํธ๊ฐ ์ปค๋ฒํ๋์ง ํ์ธํ์ธ์.
- ์๊ฐ๋ ์ฒ๋ฆฌ: ๋ค๋ฅธ ์๊ฐ๋๋ฅผ ๋ค๋ฃจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ํ ํ ์คํธํ์ธ์.
- ๊ตญ์ ํ(i18n): ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ธ์ด์ ๋ฌธ์ ์งํฉ์ ์ง์ํ๋์ง ํ์ธํ์ธ์.
- ์ ๊ทผ์ฑ(a11y): ๋ค๋ฅธ ์ง์ญ์ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผํ ์ ์๋์ง ํ์ธํ์ธ์.
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ: ์ธ๊ณ ์ฌ๋ฌ ์ง์ญ์ ์ฌ์ฉ์๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํด ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ธ์.
๊ฒฐ๋ก
์๋ฒฝํ JavaScript ํ ์คํธ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์ฅ๊ธฐ์ ์ผ๋ก ๋ณด์์ ๋ฐ๋ ํฌ์์ ๋๋ค. ์ด ๊ฐ์ด๋์ ์ค๋ช ๋ ์ ๋ต๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ตฌํํจ์ผ๋ก์จ JavaScript ํ๋ก์ ํธ์ ํ์ง, ์ ๋ขฐ์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๋ณด์ฅํ ์ ์์ผ๋ฉฐ, ๊ถ๊ทน์ ์ผ๋ก ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ๋ ๋น ๋ฅธ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ก ์ด์ด์ง๋๋ค. ๊ฒฌ๊ณ ํ ํ ์คํธ ์ธํ๋ผ๋ ์ผํ์ฑ ๋ ธ๋ ฅ์ด ์๋๋ผ ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง, ์ ์ง ๊ด๋ฆฌ ๋ฐ ๊ฐ์ ์ด ํ์ํ ์ง์์ ์ธ ํ๋ก์ธ์ค์์ ๊ธฐ์ตํ์ธ์.