- RTLμ ν μ€νΈλ₯Ό μν κ°μ λμ μ 곡νλ€.
- λΈλΌμ°μ μμ΄ ν μ€νΈλ₯Ό μ§ννλ©΄ ν΄λ¦ μμμ κ°μ μμ μ ν λ κ°μ λμ΄ νμνλ€.
- κ·Έλ¦¬κ³ κ°μ λμ΄ μνλλλ‘ μλνλμ§ νμΈ κ°λ₯
- DOMκ³Ό μνΈ μμ©νκΈ° μν μ νΈλ¦¬ν°λ μ 곡νλ€. μλ₯Ό λ€μ΄, DOMμμ μμλ₯Ό μ°Ύμ μ μκ±°λ ν΄λ¦κ³Ό κ°μ μμμ μνΈ μμ©ν μ μλ€.
- λΈλΌμ°μ μμ΄λ ν μ€νΈ κ°λ₯νκ² νλ€.
- ν μ€νΈλ₯Ό μ°Ύκ³ μ€ννλ κ²κ³Ό ν μ€νΈ ν΅κ³Ό μ¬λΆλ₯Ό κ²°μ νλ μν μ νλ€.
ν μ€νΈ ν λλ
npm test
λΌλ λͺ λ Ήμ΄λ‘ νλ©΄ λλ€. npm testλ Jestμμ Watch λͺ¨λ μ€νμΌλ‘ μμνλ€.
μ¬κΈ°μ ν μ€νΈν κ²μ aλ₯Ό μ λ ₯νλ©΄ aμ κ΄ν ν μ€νΈ κ²°κ³Όκ° λμ¨λ€.
ν
μ€νΈ μ±κ³΅ ! νλ€λ λ»μ΄λ€. src/App.test.js
νμΌμ΄ ν
μ€νΈ νμΌμ΄λ€.
q
λ₯Ό μ
λ ₯νλ©΄ jestμ Watch λͺ¨λκ° μ’
λ£λλ€.
import { render, screen } from "@testing-library/react";
import App from "./App";
test("renders learn react link", () => {
render(<App />);
const linkElement = screen.getByText(/learn testing library/i);
expect(linkElement).toBeInTheDocument();
});
μ μ½λκ° npm test
λ₯Ό μ€ννμ λ μ€νλλ ν
μ€νΈλ€. μ μ½λλ₯Ό ν μ€ ν μ€ μ΄ν΄λ³΄μ!
- render : ν μ€νΈ ν¨μμμλ 첫 λ²μ§Έλ‘ μ΄ renderλΌλ λ©μλλ₯Ό μ€ννλ€. render λ©μλλ μΈμλ‘ μ 곡νλ JSXμ κ΄ν κ°μλμ μμ±νλ€. (= μ»΄ν¬λνΈ)
- screen.getByText : λ©μλλ₯Ό μ€ννλ©° νμλλ λͺ¨λ ν μ€νΈλ₯Ό κΈ°λ°μΌλ‘ DOMμμ μμλ₯Ό μ°Ύλλ€.
(/learn react/i)
: geyByTextμ μΈμλ μ κ· ννμμ΄λ€. App.js νμΌ μμ
μ΄λ κ² learn react
μ΄ λ¨μ΄κ° μμΌλ©΄ ν
μ€νΈλ μ€ν¨λλ€.
μ€ν¨λ λͺ¨μ΅
expect(linkElement).toBeInTheDocument();
: Jestμ λ¨μΈμ΄λ€. λ¨μΈμ ν μ€νΈ μ±κ³΅κ³Ό μ€ν¨μ μμΈμ΄λ€. 볡μ‘νλ©΄μλ μ€μνλ€.
ν μ€νΈμ ν΅κ³Ό μ¬λΆλ₯Ό κ²°μ νλ€. Jestμμ μ μ λ©μλμΈ expect λ©μλλ‘ μμνλ€. κ·Έλ¦¬κ³ μΈμκ° μλλ°, μΈμλ λ¨μΈμ΄ λ¨μΈνλ κ²μΌλ‘ μμΈ‘μ λ€μ΄λ§λμ§ νμΈνκΈ° μν΄ Jestμμ νμΈνλ€.
μ΄κ²μ CRAμ μ 곡λλ©° CRAμ ν¨κ» μ€μΉλλ€. setupTests.js νμΌμ μ¬μ©ν΄ κ° ν μ€νΈ μ μ jest-domμ κ°μ Έμ¨λ€. μ¦, λͺ¨λ ν μ€νΈμμ jest-dom 맀μ²λ₯Ό μ¬μ©ν μ μλ κ²μ΄λ€.
ν
μ€νΈ λ¬λκ° νμνλ€. ν
μ€νΈλ₯Ό μ°Ύκ³ μ€ννλ©° λ¨μΈν 무μΈκ°κ° νμ. -> μ΄λ Jestλ₯Ό μ¬μ©νλ€.
Jestκ° μ μΌν ν
μ€νΈ λ¬λλ μλλ€.
Mochaλ Jasmine(μ μ€λ―Ό)λ μμ§λ§, ν
μ€ν
λΌμ΄λΈλ¬λ¦¬μμ Jestλ₯Ό κΆμ₯νλ©° CRAμ ν¨κ» μ 곡λλ€.
κ·Έ μΈμλ ν¨μ¨μ μ΄κ³ μ¬μ©μ΄ μ½λ€. npm test
λ₯Ό νλ©΄ npm script
λ₯Ό μ€ννκ³ κ·Έ μ€ν¬λ¦½νΈκ° Jestλ₯Ό Watch λͺ¨λλ‘ μ€νλκ² νλ€.
pagekage.json
νμΌμ κ°λ©΄ script
κ° μλλ° testλ₯Ό μ€ννλ©΄ react-scripts test
λ₯Ό μ€ννλ κ²μ΄λ€.
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
π"test": "react-scripts test",
"eject": "react-scripts eject"
},
μ΄λ©΄μμλ Jestκ° Watch λͺ¨λλ‘ μ€ν μ€μ΄λ€.
Watch λͺ¨λλ?
Jestλ₯Ό μ€ννλ λ°©λ²μΌλ‘ λ§μ§λ§ μ»€λ° μ΄ν νμΌμ λͺ¨λ λ³κ²½ μ¬νμ νμΈν΄μ λ§μ§λ§ μ»€λ° μ΄ν λ³κ²½λ νμΌκ³Ό μ°κ΄λ ν
μ€νΈλ§ μ€ννλ€.
TDDλ μ½λ μμ± μ μ ν μ€νΈλ₯Ό μμ±νκ³ ν μ€νΈμ ν΅κ³Όνλλ‘ νλ€!
ννλ λ-κ·Έλ¦°
ν μ€νΈλΌκ³ νλ€. μ½λ μμ± μ μ ν μ€νΈμ μ€ν¨νλλ λ
ν μ€νΈλ₯Ό λ¨Όμ μ€ννκ³ μ½λ μμ± νμ ν΅κ³Όνλ ν μ€νΈλ‘κ·Έλ¦°
ν μ€νΈλ₯Ό νμΈνλ κ²μ΄λ€.
- λ³΄ν΅ ν μ€νΈλ₯Ό μμ±νκΈ° μ μ μ½κ°μ μ½λλ₯Ό μμ±νμ¬ ν μ€νΈμ μ€λ₯κ° λ°μνμ§ μλλ‘ νλ€.
- ν¨μλ₯Ό μμ±νκ±°λ ν¨μν 리μ‘νΈ μ»΄ν¬λνΈλ₯Ό μμ±νλ€.
- μμ±μ μλ¬΄λ° μ΄λ²€νΈλ₯Ό λ°μμν€μ§ μλ λΉ ν¨μλ₯Ό μμ±νλ€.
- ν μ€νΈλ₯Ό μμ±νλ©΄, ν¨μκ° μ무κ²λ νμ§μκΈ° λλ¬Έμ ν μ€νΈλ μ€ν¨ν κ²μ΄λ€.
- μ½λλ₯Ό μμ±ν΄μ ν μ€νΈμ ν΅κ³Όνλ€.
- ν μ€νΈμ μ€ν¨μ λΉ¨κ°μμΌλ‘ νμ, μ±κ³΅μ λ ΉμμΌλ‘ νμλλ€.
- ν μ€νΈλ₯Ό μμ±νλ κ²μ΄ νλ‘μΈμ€μ ν λΆλΆμΌλ‘ λλΌλ λ°©μμ μ°¨μ΄κ° μλ€.
- μ½λ© νλ‘μΈμ€μ μΌλΆμ΄λ€.
- ν¨μ¨μ μ΄λ€. μ ν리μΌμ΄μ μ μ€ννμ¬ μνλλλ‘ μλνλμ§ νμΈνλ©΄μ μννΈμ¨μ΄λ₯Ό μ λ°μ΄νΈ ν ν λ° μ΄λ μλμ μΈ μ λ°μ΄νΈμ΄λ€.
- μ½λ μμ± μ μ ν μ€νΈλ₯Ό μμ±νλ©΄ λ³κ²½ νμ μλμΌλ‘ λ€μ μ€νν μ μλ€.
- κ°λ°νλ©΄μ λͺ¨λ ν μ€νΈλ₯Ό μμ±ν΄ λλ©΄ λ³κ²½ μ¬νμ΄ μκΈΈ λλ§λ€ λͺ¨λ ν μ€νΈλ₯Ό λ€μ μ€νν΄μ μλ νκ· ν μ€νΈλ₯Ό ν μ μλ€.
- λ³κ²½ μ¬ν νμΈμ μν΄ μ ν리μΌμ΄μ μ μ΄κ³ μλμΌλ‘ ν μ€νΈν νμκ° μλ€.
μμ κ°μ μ΄μ λ€λ‘ ν μ€νΈ μ£Όλ κ°λ°μΈ TDDλ₯Ό μ νΈνλ κ²μ΄λ€.
- βοΈμ λ(Unit) ν μ€νΈβοΈλ‘ λ³΄ν΅ ν¨μλ λ³κ°μ 리μ‘νΈ μ»΄ν¬λνΈ μ½λμ ν μ λ νΉμ λ¨μ ν μ€νΈλ₯Ό νλ κ²μ΄λ€.
- βοΈν΅ν© ν
μ€νΈβοΈλ μ¬λ¬ μ λμ΄ ν¨κ» μλνλ λ°©μμ ν
μ€νΈν΄μ μ λ κ°μ μνΈ μμ©μ ν
μ€νΈνλ κ²μ΄λ€.
ex) μ»΄ν¬λνΈ κ°μ μνΈ μμ©μ ν μ€νΈνκ±°λ λ§μ΄ν¬λ‘ μλΉμ€ κ°μ μνΈ μμ©μ ν μ€νΈνλ€. - βοΈκΈ°λ₯ ν μ€νΈβοΈλ μννΈμ¨μ΄μ νΉμ κΈ°λ₯μ ν μ€νΈ νλ κ²μ΄λ€.
- functionμ μμ΄λ‘ ν¨μμμ μ λ ₯κ°μ μ·¨νκ³ μΆλ ₯κ°μ μ 곡νλ μννΈμ¨μ΄ λ¨μλ₯Ό μλ―Έν μ μκ³ λμμ μλ―Έν μλ μλλ° μ΄ κ²½μ°μλ λμκ³Ό κ΄λ ¨ν μλ―Έμ ν΄λΉλλ€. νΉμ μ½λ ν¨μκ° μλ μννΈμ¨μ΄μ μΌλ°μ μΈ λμμ μλ―Ένλ€. μ¬κΈ°μ λ§νλ μΌλ°μ μΈ λμμ΄λ λ°μ΄ν°λ₯Ό νΌμ μ λ ₯νκ³ μ μΆμ ν΄λ¦νλ©΄ μννΈμ¨μ΄κ° νΉμ λ°μ΄ν° μΈνΈλ‘ λ°λ₯΄κ² μλνλ κΈ°λ₯μ νμΈν΄μΌ νλ€.
μ¬λ¬ μ λμ΄ μλ ν΅ν© ν μ€νΈμΌ μλ μμ§λ§ μ λ ν μ€νΈμΈ κΈ°λ₯ ν μ€νΈμΌ μλ μλ€. μ λ ₯λμ μλͺ»λ λ°μ΄ν°λ₯Ό μ λ ₯νλ©΄ λΉ¨κ°κ² λ³νλμ§ λ³΄λ ν μ€νΈμΌ μλ ? μ λ ν μ€νΈμ κ°κΉμ§λ§ μ¬μ ν κΈ°λ₯ ν μ€νΈμ΄λ€. κΈ°λ₯ ν μ€νΈμ κ°λ μ μ½λκ° μλ λμμ ν μ€νΈνλ κ²μ΄λ€. λ§μ§λ§μ μΈμ ν μ€νΈ νΉμ E2E (End to End) ν μ€νΈλ‘ μ€μ λΈλΌμ°μ κ° νμνκ³ μ ν리μΌμ΄μ μ΄ μ°κ²°λ μλ²κ° νμνλ€. λ³΄ν΅ Cypressλ Seleniumκ³Ό κ°μ νΉλ³ν λκ΅¬κ° νμνλ€. λ€λ₯Έ λꡬλ€λ μμ§λ§ μ΄ λ κ°μ§κ° κ°μ₯ μΈκΈ°κ° λ§λ€. κ·Έλ¦¬κ³ μ΄ ν μ€νΈλ RTLμ μν΄ μ€κ³λ ν μ€νΈκ° μλλ€.
-
ν μ€νΈλ₯Ό μ΅λν 격리 μν¨λ€.
κ·Έλμ ν¨μλ μ»΄ν¬λνΈλ₯Ό ν μ€νΈν λ μμ‘΄μ±μ νμνλ€. μ¦, λ€λ₯Έ μμ‘΄μ±μ΄ μκ±°λ μ»΄ν¬λνΈκ° μμ‘΄νλ λ€λ₯Έ ν¨μκ° μλ€λ©΄ μ€μ λ²μ λμ ν μ€νΈ λ²μ μ μ¬μ©νλ€. λ°λΌμ, λ¬Έμ κ° λ°μνκ±°λ ν μ€νΈ μ€ν¨ μ μνκ³μ λ€λ₯Έ μ΄λ€ κ²μ΄ μλλΌ ν μ€νΈμ μ€ν¨νκ² λ§λλ νΉμ μ λμ΄ λ¬Έμ μΈ κ²μ΄λ€.
-
λ΄λΆ ν μ€νΈλ μ§ννλ€.
λ΄λΆ ν μ€νΈκ° νμν μ΄μ λ 격리 μνμμ μ»΄ν¬λνΈλ₯Ό ν μ€νΈνλ©΄ λλ‘λ μνμ μ°¨μ΄μ μ κ΄ν΄μλ§ ν μ€νΈνκ² λκΈ° λλ¬Έμ΄λ€. μ΄λ μ ν리μΌμ΄μ λ³κ²½ μ¬νμ νμΈνλ λ€λ₯Έ μ»΄ν¬λνΈκ° μκΈ° λλ¬Έμ΄λ€. κ·Έλμ 격리λ μ λμμ μ€ν¨λ₯Ό μ½κ³ μ ννκ² νμ ν μ μλ€. ν μ€νΈ μ½λμ ν μ λμ 격리λμ΄ μκΈ° λλ¬Έμ ν μ€νΈκ° μ€ν¨νλ©΄ μ΄λλ₯Ό νμΈν΄μΌ νλμ§ μ ννκ² μ μ μλ€.
-
μ¬μ©μκ° μννΈμ¨μ΄μ μνΈ μμ©νλ λ°©μκ³Όλ κ±°λ¦¬κ° λ©λ€.
ν μ€νΈλ₯Ό ν΅κ³Όν μμλ€λ λ». μννΈμ¨μ΄μ μνΈ μμ©νλ μ¬μ©μκ° μ€ν¨νκ±°λ λ°λλ‘ μ¬μ©μκ° μννΈμ¨μ΄μ μνΈ μμ©νλλ° λ¬Έμ κ° μμ΄λ ν μ€νΈμ μ€ν¨ν μ μλ€. μ¬μ©μκ° μννΈμ¨μ΄μ μνΈ μμ©νλ λ°©μκ³Όλ μ‘°κΈ λ λ°μ νκ² μ°κ²°λμ΄ μκΈ° λλ¬Έμ΄λ€.
-
ν μ€νΈλ₯Ό 리ν©ν λ§μΌλ‘ μ€ν¨ν κ°λ₯μ±λ μλ€.
리ν©ν λ§μ λμμ λ³κ²½νμ§ μκ³ μννΈμ¨μ΄ μμ± λ°©μμ λ³κ²½νλ κ²μΌλ‘ λ³΄ν΅ μ λν μ€νΈλ‘ μννΈμ¨μ΄κ° μ΄λ»κ² μμ±λλμ§ ν μ€νΈνλ€. λ΄λΆ ν μ€νΈνλ κ²μ. μμ± λ°©μμ λ³κ²½νλ©΄, λμμ΄ λ³κ²½λμ§ μμλ ν μ€νΈμ μ€ν¨ν μ μμμ μλ―Ένλ€. λ°λΌμ, μννΈμ¨μ΄κ° μ λλ‘ μλνλ©΄ ν μ€νΈλ ν΅κ³Όν΄μΌ νκΈ° λλ¬Έμ μ΄λ° μ μ λ¨μ μ΄ λλ€.
- μ λ ν μ€νΈμλ λ€λ₯Έ μ¬κ³ λ°©μμ κ°μ§κ³ μλ€. ν μ€νΈνλ νΉμ λμμ΄λ μ μ νλ‘μ°μ μ°κ΄λ λͺ¨λ λ¨μλ₯Ό ν¬ν¨νλ€.
- μ¬μ©μκ° μννΈμ¨μ΄μ μνΈ μμ©νλ λ°©μκ³Ό λ°μ νλ€. μ¦, ν μ€νΈμ ν΅κ³Όνλ©΄ μ¬μ©μμκ² λ¬Έμ κ° μκ³ μ€ν¨νλ©΄ λ¬Έμ κ° μμ.
- μ½λ μμ± λ°©μμ 리ν©ν λ§νλ©΄ λμμ΄ λμΌνκ² μ μ§λλ ν ν μ€νΈλ ν΅κ³Όνκ² λλ€.
- μ€ν¨ν ν μ€νΈλ₯Ό λλ²κΉ νκΈ° μ΄λ ΅λ€. μ½λκ° ν μ€νΈμ μ λ ν μ€νΈμ²λΌ λ°μ νκ² μ°κ²°λμ΄ μμ§ μμμ μ΄λ€ λΆλΆμ μ½λκ° μ€ν¨μ μμΈμΈμ§ μ°ΎκΈ°κ° μ΄λ ΅λ€.
- μ λ°μ μΌλ‘ RTLμ κΈ°λ₯ ν μ€νΈμ μ₯μ μ΄ λ¨μ μ 보μνλ€κ³ μκ°
- ν μ€ν λΌμ΄λΈλ¬λ¦¬λ μ¬μ©μμ μ ν리μΌμ΄μ μ¬μ© λ°©μ ν μ€νΈλ₯Ό κΆμ₯νλλ°, μ΄λ νλμ ν μ€νΈ νλ κ²μ΄λ€.
- λ§€μ° λͺ ννλ€. λ€μν μν κ°μ νμ μ΄ νμ -> κ°λ°μλ QA, μ¬μ ννΈλ λ±
- μλ‘ λ€λ₯Έ κ·Έλ£Ήμ΄ μνΈ μμ©νλ λ°©μμ κ΄ν νλ‘μΈμ€λ μ μλμ΄ μλ€.
μ°Έκ³ μλ£
https://testing-library.com/docs/queries/about/#priority
https://www.w3.org/TR/wai-aria/#role_definitions