π Testing Library κ³μ΄ μν¬νλ‘μ° μμ μ 볡
Testing Libraryλ₯Ό νμ©ν CI/CD μ΅μ ν λ°©λ², μ½λ νμ§ λ³΄μ₯ μ λ΅, κ·Έλ¦¬κ³ Codecov μ°λκΉμ§!
π οΈ CI μκ° λ¨μΆ | λ¦°νΈ & νμ μ²΄ν¬ μλν | μ λ ν μ€νΈ κ²μ¦ | ν¬λ‘μ€ νλ«νΌ ν μ€νΈ
π Testing Library κ³μ΄ μν¬νλ‘μ°λ?
Testing Libraryλ DOM ν μ€νΈλ₯Ό μ€μ¬μΌλ‘ ν JavaScript ν μ€νΈ νλ μμν¬μμ.
β UI μ»΄ν¬λνΈλ₯Ό λ§μΉ μ¬μ©μκ° μ‘°μνλ κ²μ²λΌ ν μ€νΈ
β Jest, React Testing Library, DOM Testing Library λ±μ λꡬμ ν¨κ» μ¬μ©
β λ λλ§λ μμλ₯Ό μ§μ κ²μ¦νμ¬ μ½λμ μ λ’°λλ₯Ό λμ΄λ λ° νμ©
CI/CD νκ²½μμλ μ΄κ±Έ νμ©ν΄μ
βοΈ μλμΌλ‘ μ½λ νμ§μ κ²μ¦νκ³
βοΈ λ€μν νλ«νΌμμ UIκ° μ μ μλνλμ§ νμΈν μ μμ΄μ.
μ€λμ Testing Library κ³μ΄μ CI/CD μλν μ΅μ νμ ν¨κ»
β λ¦°νΈ & νμ 체ν¬
β μ λ ν μ€νΈ μλν
β ν¬λ‘μ€ νλ«νΌ κ²μ¦
β Codecov μ°λμΌλ‘ 컀λ²λ¦¬μ§ μΈ‘μ
κΉμ§ νλ°©μ ν΄κ²°ν΄λ³Όκ²μ! π
πΉ Testing Library κ³μ΄μ μν¬νλ‘μ° μ΅μ ν
1οΈβ£ CI μκ° λ¨μΆ: 리μμ€ μ΅μ ν π
CI/CDμμ ν μ€νΈ μλλ₯Ό λμ΄λ 건 μμ£Ό μ€μν΄μ.
ν μ€νΈκ° μ€λ 걸리면 κ°λ° μλκ° λ¨μ΄μ§κ³ , λ°°ν¬κΉμ§ μ§μ°λλκΉμ.
π CI μκ°μ μ€μ΄λ ν΅μ¬ μ λ΅!
βοΈ μΊμ νμ© (cache: npm)
βοΈ λ³λ ¬ μ€ν (matrix μ€μ )
βοΈ νμν λλ§ μ€ν (filtering by branch)
βοΈ μμ : μΊμ & λ³λ ¬ μ€νμΌλ‘ CI μλ μ΅μ ν
name: CI Optimization with Testing Library
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16, 18] # λ€μ€ Node.js λ²μ λ³λ ¬ μ€ν
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Cache dependencies # μΊμ νμ©μΌλ‘ npm install μλ ν₯μ
uses: actions/cache@v3
with:
path: ~/.npm
key: npm-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: npm-${{ runner.os }}-
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: npm ci
- name: Run Lint
run: npm run lint
- name: Run TypeScript Check
run: npm run type-check
- name: Run Tests
run: npm test -- --coverage
π μ΄λ κ² νλ©΄?
β cacheλ₯Ό νμ©ν΄μ npm install μλλ₯Ό λ¨μΆ
β μ¬λ¬ Node.js λ²μ μμ ν μ€νΈ λ³λ ¬ μ€ν (16 & 18)
β ν μ€νΈλ§ μ€ννλ κ² μλλΌ, λ¦°νΈ & νμ 체ν¬λ ν¬ν¨!
2οΈβ£ μ½λ νμ§ λ³΄μ₯: λ¦°νΈ & νμ μ²΄ν¬ & μ λ ν μ€νΈ μλν
CI/CDμμ μ½λ νμ§μ μ μ§νλ €λ©΄ μλ κ²μ¦ νλ‘μΈμ€κ° νμν΄μ.
β ESLint → μ½λ μ€νμΌ & λ²κ·Έ νμ§
β TypeScript μ²΄ν¬ → νμ μμ μ± λ³΄μ₯
β Jest & React Testing Library → μ»΄ν¬λνΈ λ¨μ ν μ€νΈ
βοΈ ν¨ν€μ§ μ€μΉ
npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
npm install --save-dev jest @testing-library/react @testing-library/jest-dom
βοΈ ESLint μ€μ (.eslintrc.js)
module.exports = {
parser: "@typescript-eslint/parser",
extends: ["plugin:@typescript-eslint/recommended", "plugin:react/recommended"],
rules: {
"react/prop-types": "off"
}
};
βοΈ TypeScript μ€μ (tsconfig.json)
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true
}
}
βοΈ μ λ ν μ€νΈ μμ
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import Button from "./Button";
test("λ²νΌ ν΄λ¦ μ ν
μ€νΈ λ³κ²½", async () => {
render(<Button />);
const button = screen.getByRole("button", { name: "ν΄λ¦νμΈμ" });
userEvent.click(button);
expect(screen.getByText("ν΄λ¦λ¨!")).toBeInTheDocument();
});
π μμ κ°μ μ λ ν μ€νΈλ₯Ό CIμμ μλμΌλ‘ μ€ννλλ‘ μ€μ νλ©΄,
β λ²κ·Έκ° μλ μ½λκ° main λΈλμΉλ‘ λ¨Έμ§λλ κ±Έ λ§μ μ μμ΄μ! π
3οΈβ£ ν¬λ‘μ€ νλ«νΌ κ²μ¦
ν μ€νΈκ° λ‘컬μμλ λλλ° λ°°ν¬νλ©΄ κΉ¨μ§λ κ²½μ°κ° λ§μ£ ?
π οΈ λ€μν OS & λΈλΌμ°μ μμ ν μ€νΈλ₯Ό μ€νν΄μΌ ν΄μ!
βοΈ λ€μν OSμμ μ€ννκΈ°
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
π μ΄λ κ² νλ©΄?
β 리λ μ€, μλμ°, λ§₯μμ λμμ ν μ€νΈ μ€ν
β OSμ λ°λΌ λ€λ₯΄κ² λμνλ μ½λλ κ²μ¦ κ°λ₯
4οΈβ£ Codecov μ°λμΌλ‘ 컀λ²λ¦¬μ§ μΈ‘μ
ν μ€νΈλ₯Ό μ€νν λ μ½λ 컀λ²λ¦¬μ§λ₯Ό μλμΌλ‘ μΈ‘μ νλ©΄
π ν μ€νΈκ° μΌλ§λ μ 컀λ²λκ³ μλμ§ λ°λ‘ νμΈν μ μμ΄μ!
βοΈ Codecov μ€μΉ
npm install --save-dev codecov
βοΈ CI/CDμ Codecov μΆκ°
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
βοΈ Jest μ€μ (jest.config.js)
module.exports = {
collectCoverage: true,
coverageDirectory: "coverage",
coverageReporters: ["json", "lcov", "text-summary"]
};
π μ΄λ κ² νλ©΄?
β ν μ€νΈ μ€ν ν Codecovμμ 컀λ²λ¦¬μ§ 리ν¬νΈ μλ μμ±!
β λΆμ‘±ν ν μ€νΈ μμμ λ°λ‘ νμ κ°λ₯ π
π― κ²°λ‘ : Testing Library κ³μ΄ μν¬νλ‘μ° μ΅μ ν!
βοΈ CI/CD μκ°μ λ¨μΆνλ €λ©΄?
β‘οΈ cache, matrix, λ³λ ¬ μ€ν νμ©
βοΈ μ½λ νμ§μ μ μ§νλ €λ©΄?
β‘οΈ ESLint, TypeScript, Jest μλν
βοΈ μ΄μ νκ²½μμ κΉ¨μ§λ κ±Έ λ°©μ§νλ €λ©΄?
β‘οΈ λ€μν OS & Node.js λ²μ μμ μ€ν
βοΈ ν μ€νΈ 컀λ²λ¦¬μ§λ₯Ό μΈ‘μ νλ €λ©΄?
β‘οΈ Codecov μ°λμΌλ‘ λΆμ‘±ν ν μ€νΈ μμ νμ
π‘ μ΄μ Testing Libraryλ₯Ό νμ©ν CI/CD μλνλ₯Ό λ§μ€ν°νκ³ ,
ννν νλ‘ νΈμλ ν μ€νΈ νκ²½μ ꡬμΆν΄λ³΄μ! π
π· μ μ€μ κ°λ°μκ° λμ΄λ΄ μλΉ! π·
'Dev-ops' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π CircleCI κ°λ λΆν° μ€μ κΉμ§ μλ²½ μ 리! (0) | 2025.03.21 |
---|---|
π Next.js μν¬νλ‘μ° μμ μ 볡 (0) | 2025.03.20 |
π CI/CDμμ React Testing Library μν¬νλ‘μ° μ΄ν΄λ³΄κΈ° (0) | 2025.03.17 |
ποΈ IaC (Infrastructure as Code): μ½λλ‘ μΈνλΌλ₯Ό κ΄λ¦¬νλ μλ! (0) | 2025.03.15 |
π νλ‘ νΈμλ κ°λ°μλ₯Ό μν CI/CD μλ²½ κ°μ΄λ! (0) | 2025.03.14 |