π CI/CDμμ React Testing Library μν¬νλ‘μ° μ΄ν΄λ³΄κΈ°
ν μ€νΈ μλνλ₯Ό μ μ©ν CI/CD νμ΄νλΌμΈμ΄ μ΄λ»κ² λμκ°λμ§, React Testing Libraryμμ μ΄λ₯Ό μ΄λ»κ² νμ©νλμ§ μ λλ‘ νν€μ³λ³΄μ! π―
π CI/CDμμ μν¬νλ‘μ°λ?
CI/CDμμ μν¬νλ‘μ°(Workflow) λ ν μ€νΈ, λΉλ, λ°°ν¬ λ± μλνλ μμ μ νλ¦μ μλ―Έν΄μ.
βοΈ CI(Continuous Integration, μ§μμ ν΅ν©): μ½λ λ³κ²½ μ μλμΌλ‘ ν μ€νΈ λ° λΉλλ₯Ό μν
βοΈ CD(Continuous Delivery/Deployment, μ§μμ λ°°ν¬): CI λ¨κ³λ₯Ό ν΅κ³Όν μ½λλ₯Ό μ΄μ νκ²½μ λ°°ν¬
μ¦, μν¬νλ‘μ°λ₯Ό μ€μ νλ©΄, μ½λκ° λ³κ²½λ λλ§λ€ μλμΌλ‘ ν μ€νΈλ₯Ό μ€ννκ³ , λ¬Έμ κ° μλ€λ©΄ λ°°ν¬κΉμ§ μ§ννλ κ³Όμ μ΄ μλνλλ κ±°μμ! π
π± CI/CDμμ μν¬νλ‘μ°μ κΈ°λ³Έ ꡬ쑰
μν¬νλ‘μ°λ₯Ό μ€μ νλ κ°μ₯ λνμ μΈ λꡬλ GitHub Actionsμμ.
GitHub Actionsμμ CI/CD νμ΄νλΌμΈμ μ€μ νλ €λ©΄ .github/workflows/ci.yml κ°μ YAML νμΌμ μμ±νλ©΄ λΌμ.
βοΈ μν¬νλ‘μ°μ κΈ°λ³Έ ꡬ쑰
name: React CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
μ μ½λλ₯Ό 보면 ν μ€νΈ μλνλ₯Ό μν CI μν¬νλ‘μ°κ° μ€μ λμ΄ μμ΄μ.
νλμ© λ―μ΄λ³΄λ©΄μ μ΄ν΄ν΄λ³ΌκΉμ? π
π μ£Όμ κ΅¬μ± μμμ λ¬Έλ² μ΄ν΄λ³΄κΈ°
πΉ on: - μΈμ μ€νλ κ²μΈκ°?
μν¬νλ‘μ°κ° νΈλ¦¬κ±°(trigger) λλ 쑰건μ μ€μ ν΄μ.
βοΈ push: → νΉμ λΈλμΉμ μ½λκ° νΈμλ λ μ€ν
βοΈ pull_request: → PRμ΄ μμ±λ λ μ€ν
βοΈ schedule: → νΉμ μκ°λ§λ€ μ€ν
on:
push:
branches:
- main
pull_request:
branches:
- main
schedule:
- cron: "0 0 * * *" # λ§€μΌ μμ μ€ν
πΉ jobs: - μ΄λ€ μμ μ μνν κ²μΈκ°?
jobs:λ μν¬νλ‘μ°μμ μ€νν μ¬λ¬ κ°μ μμ μ μ μνλ λΆλΆμ΄μμ.
μ¬λ¬ κ°μ jobμ λ³λ ¬λ‘ μ€ννκ±°λ, μμ°¨μ μΌλ‘ μ€νν μλ μμ΄μ.
jobs:
test: # "test"λΌλ μμ
μ μ μ
runs-on: ubuntu-latest # μ€νν νκ²½ (OS)
steps:
- name: Checkout repository # GitHub μ μ₯μ μ½λλ₯Ό κ°μ Έμ€κΈ°
- name: Set up Node.js # Node.js μ€μ
- name: Install dependencies # μμ‘΄μ± μ€μΉ
- name: Run tests # ν
μ€νΈ μ€ν
πΉ steps: - Job λ΄λΆμμ μ€νλ λ¨κ³
κ° job μμλ μ¬λ¬ κ°μ stepsκ° λ€μ΄κ°μ.
βοΈ name: → κ° λ¨κ³μ μ΄λ¦μ μ μ
βοΈ run: → μ€νν λͺ λ Ήμ΄
βοΈ uses: → GitHub Actionsμμ μ 곡νλ νλ¬κ·ΈμΈ νμ©
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
π μ μμ μμλ npm installλ‘ ν¨ν€μ§λ₯Ό μ€μΉνκ³ , npm testλ‘ React Testing Library ν μ€νΈλ₯Ό μ€νν΄μ.
πΉ runs-on: - μ΄λμ μ€νν κ²μΈκ°?
ν μ€νΈλ₯Ό μ€νν νκ²½(μ΄μ체μ , OS) μ μ ννλ λΆλΆμ΄μμ.
runs-on: ubuntu-latest # μ΅μ Ubuntu νκ²½μμ μ€ν
• ubuntu-latest: μ΅μ μ°λΆν¬ λ²μ μμ μ€ν
• windows-latest: μ΅μ μλμ° νκ²½μμ μ€ν
• macos-latest: μ΅μ λ§₯OSμμ μ€ν
πΉ release: - λ°°ν¬κΉμ§ μλνν κ²½μ°
λ§μ½ CI/CDμμ ν μ€νΈλ₯Ό ν΅κ³Όν μ½λκ° μλ λ°°ν¬λλλ‘ νλ €λ©΄, release λ¨κ³λ₯Ό μΆκ°ν μ μμ΄μ.
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy application
run: npm run deploy
π μ΄λ κ² νλ©΄?
β main λΈλμΉμ μ½λκ° λ¨Έμ§λ λ μλμΌλ‘ ν μ€νΈ μ€ν
β ν μ€νΈκ° ν΅κ³Όλλ©΄ npm run deploy λͺ λ Ήμ΄λ‘ λ°°ν¬ μλν! π
π React Testing Library μν¬νλ‘μ° μ μ©νκΈ° π―
μ΄μ CI/CDμμ React Testing Libraryλ₯Ό νμ©νμ¬ ν μ€νΈ μ€ννλ λ°©λ²μ μ΄ν΄λ³΄μ!
1οΈβ£ React Testing Library μ€μ
νλ‘μ νΈμ React Testing Libraryλ₯Ό μ€μΉν΄μΌ ν΄μ.
npm install --save-dev @testing-library/react @testing-library/jest-dom jest
2οΈβ£ ν μ€νΈ μ½λ μμ± (μμ )
μλλ React Testing Libraryλ‘ μμ±λ κ°λ¨ν ν μ€νΈ μμ μμ.
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import App from "./App";
test("λ²νΌ ν΄λ¦ μ ν
μ€νΈ λ³κ²½", async () => {
render(<App />);
const button = screen.getByRole("button", { name: "ν΄λ¦νμΈμ" });
userEvent.click(button);
expect(screen.getByText("ν΄λ¦λ¨!")).toBeInTheDocument();
});
π userEvent.click(button)μΌλ‘ ν΄λ¦ μ΄λ²€νΈλ₯Ό λ°μμν€κ³ , νλ©΄μ΄ μ λ°μ΄νΈλμλμ§ νμΈνλ ν μ€νΈμμ.
3οΈβ£ CI/CDμμ React Testing Library μ€ννκΈ°
μ΄μ CI/CDμμ ν μ€νΈκ° μλ μ€νλλλ‘ μ€μ ν΄λ³Όκ²μ.
name: React CI with Testing Library
on:
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: npm install
- name: Run React Testing Library tests
run: npm test -- --coverage
β CI/CD μ€ν μ μλμΌλ‘ npm test -- --coverageλ₯Ό μ€ννμ¬ ν μ€νΈ μ½λ 컀λ²λ¦¬μ§κΉμ§ μΈ‘μ ν μ μμ΄μ.
π μ€λ₯ λ°μ μ μ΄λ»κ² ν΄κ²°ν κΉ?
CI/CDμμ ν μ€νΈκ° μ€ν¨νλ©΄ GitHub Actions λ‘κ·Έλ₯Ό νμΈν΄μΌ ν΄μ.
1οΈβ£ ν°λ―Έλμμ λ‘κ·Έ νμΈ
ν μ€νΈκ° μ€ν¨νλ©΄ GitHub Actionsμ Actions νμμ λ‘κ·Έλ₯Ό νμΈν μ μμ΄μ.
FAIL src/App.test.js
β λ²νΌ ν΄λ¦ μ ν
μ€νΈ λ³κ²½
Unable to find an element with the text: ν΄λ¦λ¨!
β‘οΈ ν΄κ²° λ°©λ²:
β screen.debug()λ₯Ό μΆκ°ν΄μ νμ¬ μν νμΈ
β waitFor()λ₯Ό μ¬μ©νμ¬ λΉλκΈ° ν μ€νΈ μ²λ¦¬
import { waitFor } from "@testing-library/react";
await waitFor(() => expect(screen.getByText("ν΄λ¦λ¨!")).toBeInTheDocument());
π― κ²°λ‘ : CI/CDμμ React Testing Library μλννκΈ°!
βοΈ μν¬νλ‘μ°λ CI/CDμμ μλνλ μμ μ νλ¦μ μλ―Έ
βοΈ GitHub Actionsλ‘ CI/CD μ€μ νκ³ , pushλ PRμ΄ λ°μνλ©΄ μλμΌλ‘ μ€ν
βοΈ on:, jobs:, steps:, runs-on: κ°μ μμλ‘ κ΅¬μ±
βοΈ React Testing Libraryλ₯Ό νμ©ν ν μ€νΈ μλν κ°λ₯
βοΈ ν μ€νΈκ° μ€ν¨νλ©΄ GitHub Actions λ‘κ·Έμμ λ¬Έμ νμΈ κ°λ₯
μ΄μ ν μ€νΈ μλνλ‘ λ²κ·Έ μλ νλ‘ νΈμλλ₯Ό λ§λ€μ΄ 보μ! π
π· μ μ€μ κ°λ°μκ° λμ΄λ΄ μλΉ! π·
'Dev-ops' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π Next.js μν¬νλ‘μ° μμ μ 볡 (0) | 2025.03.20 |
---|---|
π Testing Library κ³μ΄ μν¬νλ‘μ° μμ μ 볡 (0) | 2025.03.19 |
ποΈ IaC (Infrastructure as Code): μ½λλ‘ μΈνλΌλ₯Ό κ΄λ¦¬νλ μλ! (0) | 2025.03.15 |
π νλ‘ νΈμλ κ°λ°μλ₯Ό μν CI/CD μλ²½ κ°μ΄λ! (0) | 2025.03.14 |
λ컀 λ°μ€ν¬νμ΄ λ¬΄κ±°μΈ λ, Colima (0) | 2024.10.21 |