êžë¡ë² ê°ë°ì륌 ìíŽ JavaScript í ì€í ì ëí í¬êŽì ìž ê°ìŽëë¡ ì¹ ì í늬ìŒìŽì ì ê²¬ê³ íšì í볎íê³ , íµí© í ì€ížì ìë í¬ ìë ìëí륌 ë¹êµíŽ ë³Žìžì.
JavaScript í ì€í ë§ì€í°íêž°: íµí© í ì€íž vs. ìë í¬ ìë ìëí
ì¹ ê°ë°ì ìëì ìž í겜ìì JavaScript ì í늬ìŒìŽì ì ì 뢰ì±ê³Œ íì§ì 볎ì¥íë ê²ì ë§€ì° ì€ìí©ëë€. íë¡ì ížê° ë³µì¡íŽì§ê³ êžë¡ë² ë²ìê° íëëšì ë°ëŒ íšê³Œì ìž í ì€í ì ëµì ì±ííë ê²ì ëšìí ëªšë² ì¬ë¡ê° ìëëŒ ê·Œë³žì ìž íì ì¬íìŽ ëììµëë€. ë€ìí í ì€í ë°©ë²ë¡ ì€ìì íµí© í ì€í 곌 ìë í¬ ìë(E2E) ìëíë íë ¥ì ìž ìíížìšìŽë¥Œ 구ì¶íêž° ìí ì€ìí êž°ë¥ìŒë¡ ëëë¬ì§ëë€. ë ê°ì§ 몚ë ì í늬ìŒìŽì êž°ë¥ì ê²ìŠíë ê²ì 목íë¡ íì§ë§, ìë¡ ë€ë¥ž ìì€ìì ìëíê³ ëë ·í 묞ì 륌 íŽê²°í©ëë€. ìŽ í¬êŽì ìž ê°ìŽëë ìŽ ë ê°ì§ ì ê·Œ ë°©ìì ëª íí ì€ëª íê³ , ì°šìŽì ì ì¡°ëª íë©°, ì§ì í êžë¡ë² ì¬ì©ì륌 ìíŽ ê°ë° ìí¬íë¡ì° ëŽìì ì ëµì ìŒë¡ 구ííë ë° ëìì ì€ ê²ì ëë€.
í ì€í íŒëŒë¯žë ìŽíŽíêž°: íµí© ë° E2E륌 ìí 컚í ì€íž
íµí© ë° E2E í ì€í ì ëíŽ ììží ìì볎Ʞ ì ì ë늬 ì¬ì©ëë í ì€í íŒëŒë¯žë ëŽìì íë ìì ì€ì íë ê²ìŽ ëììŽ ë©ëë€. ìŽ ê°ë 몚ëžì ìíížìšìŽ íë¡ì ížìì ë€ìí ì íì í ì€ížì ìŽìì ìž ë¶í¬ë¥Œ 볎ì¬ì€ëë€. íŒëŒë¯žëì ë§š ìëìë ì ë í ì€ížê° ììŒë©°, ìŽë ìììŽ ë§ê³ ë¹ ë¥Žë©° ê°ë³ êµ¬ì± ìì ëë êž°ë¥ì 격늬íì¬ í ì€ížíë ë° ì€ì ì ë¡ëë€. ìë¡ ì¬ëŒê°ë©Ž íµí© í ì€ížê° ì€ê° ê³ìžµì íì±íì¬ ì¬ë¬ êµ¬ì± ìì ê°ì ìíž ìì©ì íìží©ëë€. ë§š ììë ìë í¬ ìë í ì€ížê° ììŒë©°, ìŽë ìê° ì ê³ , ë늬며, ì 첎 ì í늬ìŒìŽì ì€íìì ì€ì ì¬ì©ì ìë늬ì€ë¥Œ ì뮬ë ìŽì í©ëë€.
í ì€í íŒëŒë¯žëë íµí© í ì€ížë³Žë€ ë ë§ì ì ë í ì€ížë¥Œ ìì±íê³ , E2E í ì€ížë³Žë€ ë ë§ì íµí© í ì€ížë¥Œ ìì±íë ê²ì ê°ì¡°í©ëë€. ìŽë ì£Œë¡ ê° í ì€ížì ìë, ë¹ì© ë° ì·šìœì± ë묞ì ëë€. ì ë í ì€ížë ë¹ ë¥Žê² ì€íëê³ ì ì§ êŽëŠ¬ê° ì ë Žíì§ë§, E2E í ì€ížë ëëŠ¬ê³ , ë¹ì©ìŽ ë§ìŽ ë€ê³ , UI ë³ê²œ ì¬íìŒë¡ ìžíŽ ê¹šì§êž° ìœìµëë€.
JavaScriptìì íµí© í ì€í ìŽë 묎ììžê°ì?
JavaScriptì íµí© í ì€í ì ì í늬ìŒìŽì ì ìë¡ ë€ë¥ž 몚ë, ìë¹ì€ ëë êµ¬ì± ìì ê°ì ìíž ìì© ë° íµì ì í ì€ížíë ë° ì€ì ì ë¡ëë€. 격늬ë ì ëì í ì€ížíë ëì , íµí© í ì€ížë ìŽë¬í ì ëìŽ ê²°í©ë ë ììëë¡ íšê» ìëíëì§ íìží©ëë€. ê° ëžëŠìŽ ìšì íì§ íìžíë ê²ìŽ ìëëŒ, ê°ë³ ë ê³ ëžëŠìŽ ì°ê²°ëìŽ ë í° êµ¬ì¡°ë¥Œ íì±íë ë°©ìì í ì€ížíë ê²ìŒë¡ ìê°í ì ììµëë€.
íµí© í ì€í ì 죌ì í¹ì§:
- ë²ì: ë ê° ìŽìì êµ¬ì± ìì, 몚ë ëë ìë¹ì€ ê°ì ìíž ìì©ì í ì€íží©ëë€.
- ìŽì : íµí©ë ë¶ë¶ ê°ì ë°ìŽí° íëŠ, íµì íë¡í ìœ ë° ìží°íìŽì€ë¥Œ ê²ìŠí©ëë€.
- ìë: ìŒë°ì ìŒë¡ E2E í ì€ížë³Žë€ ë¹ ë¥Žì§ë§ ì ë í ì€ížë³Žë€ ë늜ëë€.
- ë¹ì©: ì€ì ë° ì ì§ êŽëЬì ì ë¹í ë¹ì©ìŽ ëëë€.
- íŒëë°±: íµí© 묞ì ê° ìë ìì¹ì ëí 구첎ì ìž íŒëë°±ì ì ê³µí©ëë€.
- í겜: ì¢ ì¢ ë¶ë¶ì ìŒë¡ ëë ìì í êž°ë¥íë í겜(ì: ì€í ì€ìž ìë¹ì€, ë°ìŽí°ë² ìŽì€ ì°ê²°)ìŽ íìí©ëë€.
íµí© í ì€í ìŽ ì€ìí ìŽì ë 묎ììžê°ì?
ì í늬ìŒìŽì ìŽ ë°ì íšì ë°ëŒ ìœëì ìë¡ ë€ë¥ž ë¶ë¶ ê°ì ì¢ ìì±ìŽ ëì± ë³µì¡íŽì§ëë€. íµí© í ì€ížë ë€ì곌 ê°ì ìŽë¬í ìíž ìì©ìì ë°ìíë ë²ê·žë¥Œ ì¡ë ë° íìì ì ëë€.
- 몚ë ê°ì ì ë¬ë ì못ë ë°ìŽí°.
- API ë¶ìŒì¹ ëë ìë¹ì€ ê° íµì ì€ë¥.
- ë°ìŽí°ë² ìŽì€ ìíž ìì© ëë ìžë¶ ìë¹ì€ ížì¶ êŽë š 묞ì .
- ì못 구ì±ë êµ¬ì± ìì ì°ê²°.
JavaScript íµí© í ì€í ì ìŒë°ì ìž ìë늬ì€:
- íë°ížìë ë° ë°±ìë íµì : íë°ížìë êµ¬ì± ììê° ë°±ìëì API ìì²ì ì¬ë°ë¥Žê² ìííê³ ìëµì ì²ëЬíëì§ í ì€íží©ëë€.
- ìë¹ì€ ê° íµì : ë§ìŽí¬ë¡ìë¹ì€ê° ìë¡ íšê³Œì ìŒë¡ íµì í ì ìëì§ íìží©ëë€.
- êµ¬ì± ìì ìíž ìì©: React ëë Vueì ê°ì íë ììí¬ìì ë¶ëªšì ìì êµ¬ì± ììê° ìŽë»ê² ìíž ìì©íëì§, ëë ìë¡ ë€ë¥ž êµ¬ì± ììê° ìŽë»ê² ìí ë³ê²œì ížëŠ¬ê±°íëì§ í ì€íží©ëë€.
- 몚ë ì¢ ìì±: ì í늬ìŒìŽì ëŽì ìë¡ ë€ë¥ž 몚ë(ì: ìžìŠ ëªšë, ì¬ì©ì íë¡í 몚ë)ìŽ ì¡°íë¡ê² ìëíëì§ íìží©ëë€.
- ë°ìŽí°ë² ìŽì€ ìì : ë°ìŽí°ë² ìŽì€ì ìíž ìì©íë CRUD(ìì±, ìœêž°, ì ë°ìŽíž, ìì ) ìì ì í ì€íží©ëë€.
JavaScript íµí© í ì€í ì ìí ë구 ë° íë ììí¬:
ëª ê°ì§ ë늬 ì¬ì©ëë JavaScript í ì€í íë ììí¬ê° íµí© í ì€í ì ì©ìŽíê² í©ëë€.
- Jest: Metaìì ì ê³µíë ë늬 ì¬ì©ëë êž°ë¥ìŽ íë¶í í ì€í íë ììí¬ë¡, í¹í Reactì íšê» ì ë ë° íµí© í ì€íž 몚ëì ì죌 ì¬ì©ë©ëë€. ëŽì¥ë ìŽì€ì ëŒìŽëžë¬ëЬ ë° ëªší¹ êž°ë¥ì ë§€ì° íšê³Œì ì ëë€.
- Mocha: íµí© í ì€í ì ìíŽ Chaiì ê°ì ìŽì€ì ëŒìŽëžë¬ëЬì íšê» ì¬ì©í ì ìë ì ì°í JavaScript í ì€íž íë ììí¬ì ëë€. ê°ëší 구묞곌 íì¥ì±ìŽ ë°ìŽë ê²ìŒë¡ ìë €ì ž ììµëë€.
- Chai: Mocha ëë êž°í í ì€í íë ììí¬ì íšê» ì¬ì©íì¬ ìœëì ëí ìŽì€ì ì ìíí ì ìë ìŽì€ì ëŒìŽëžë¬ëЬì ëë€.
- Supertest: ì£Œë¡ Node.js HTTP ìë²ë¥Œ í ì€ížíë ë° ì¬ì©ëë©°, Supertest륌 ì¬ì©í멎 ìë²ì HTTP ìì²ì 볎ëŽê³ ìëµì ëíŽ ìŽì€ì ì ìíí ì ììµëë€. ë°±ìë íµí© í ì€ížì ë§€ì° ì í©í©ëë€.
- Testing Library(React Testing Library, Vue Testing Library ë±): ìŽë¬í ëŒìŽëžë¬ëЬë ì¬ì©ìê° êµ¬ì± ììì ìíž ìì©íë ë°©ììŒë¡ êµ¬ì± ìì륌 í ì€ížíëë¡ ê¶ì¥íë©°, UI êµ¬ì± ììì êŽë š ë¡ì§ì íµí© í ì€í ì ì ì©í ì ììµëë€.
ìì: íë°ížìë êµ¬ì± ììì API ížì¶ íµí©
APIìì ì¬ì©ì ë°ìŽí°ë¥Œ ê°ì žì€ë ê°ëší React êµ¬ì± ìì륌 ìê°íŽ ë³Žê² ìµëë€. íµí© í ì€ížë êµ¬ì± ììê° ì¬ë°ë¥Žê² ë ëë§ëëì§ íìží ë¿ë§ ìëëŒ API륌 ì±ê³µì ìŒë¡ ížì¶íê³ ìëµì ì²ëЬíë©° ë°ìŽí°ë¥Œ íìíëì§ íìží©ëë€.
// src/components/UserProfile.js
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchUser = async () => {
try {
const response = await axios.get(`/api/users/${userId}`);
setUser(response.data);
} catch (err) {
setError('Failed to fetch user data');
} finally {
setLoading(false);
}
};
fetchUser();
}, [userId]);
if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error}</div>;
return (
<div>
<h2>{user.name}</h2>
<p>Email: {user.email}</p>
</div>
);
}
export default UserProfile;
Jest ë° React Testing Library륌 ì¬ì©íë ìŽ êµ¬ì± ììì ëí íµí© í ì€ížë ë€ì곌 ê°ìµëë€.
// src/components/UserProfile.test.js
import React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import axios from 'axios';
import UserProfile from './UserProfile';
// Mock axios to avoid actual API calls during tests
jest.mock('axios');
describe('UserProfile Component Integration Test', () => {
it('should fetch and display user data', async () => {
const mockUser = { id: 1, name: 'Alice Smith', email: 'alice@example.com' };
const userId = '1';
// Mock the axios.get call
axios.get.mockResolvedValue({ data: mockUser });
render(<UserProfile userId={userId} />);
// Check for loading state
expect(screen.getByText('Loading...')).toBeInTheDocument();
// Wait for the API call to resolve and update the UI
await waitFor(() => {
expect(axios.get).toHaveBeenCalledTimes(1);
expect(axios.get).toHaveBeenCalledWith(`/api/users/${userId}`);
expect(screen.getByText('Alice Smith')).toBeInTheDocument();
expect(screen.getByText('alice@example.com')).toBeInTheDocument();
});
});
it('should display an error message if API call fails', async () => {
const userId = '2';
const errorMessage = 'Network Error';
// Mock axios.get to reject with an error
axios.get.mockRejectedValue(new Error(errorMessage));
render(<UserProfile userId={userId} />);
await waitFor(() => {
expect(axios.get).toHaveBeenCalledTimes(1);
expect(screen.getByText('Failed to fetch user data')).toBeInTheDocument();
});
});
});
ìŽ í ì€ížë êµ¬ì± ììê° `axios` ëŒìŽëžë¬ëЬ(API ížì¶ ì뮬ë ìŽì )ì ì¬ë°ë¥Žê² ìíž ìì©íê³ ë°ìŽí°ë¥Œ ì ì íê² ë ëë§íëì§ íìží©ëë€. ìžë¶ ì¢ ìì±(API ì뮬ë ìŽì )곌 íšê» êµ¬ì± ììì ëìì í ì€ížíêž° ë묞ì íµí© í ì€ížì ëë€.
ìë í¬ ìë(E2E) ìëí í ì€í ìŽë 묎ììžê°ì?
ìë í¬ ìë(E2E) ìëí í ì€í ì ì¬ì©ì ìží°íìŽì€, ë°±ìë ë¡ì§, ë°ìŽí°ë² ìŽì€ ë° ìžë¶ ìë¹ì€ë¥Œ í¬íšíì¬ ì 첎 ì í늬ìŒìŽì íëŠì í¬êŽíë ì€ì ì¬ì©ì ìë늬ì€ë¥Œ ì뮬ë ìŽì í©ëë€. 목íë ì 첎 ìì€í ì ëìì ê²ìŠíê³ ëªšë ë¶ë¶ìŽ ììëë ì¬ì©ì 겜íì ì ê³µíêž° ìíŽ ìííê² íšê» ìëíëì§ íìžíë ê²ì ëë€.
E2E ìëí í ì€í ì 죌ì í¹ì§:
- ë²ì: ì¬ì©ìê° ê²œííë ê²ì²ëŒ ì 첎 ì í늬ìŒìŽì íëŠì í ì€íží©ëë€.
- ìŽì : ì 첎 ë¹ìŠëì€ íë¡ìžì€ ë° ì¬ì©ì ì¬ì ì ê²ìŠí©ëë€.
- ìë: ëžëŒì°ì ìíž ìì© ë° ë€ížìí¬ ì§ì° ìê°ìŒë¡ ìžíŽ ìŒë°ì ìŒë¡ ê°ì¥ ë늰 ì íì ìëíë í ì€ížì ëë€.
- ë¹ì©: ì€ì , ì ì§ êŽëЬ ë° ì€íì ê°ì¥ ë¹ì©ìŽ ë§ìŽ ëëë€.
- íŒëë°±: ëì íì ì ì ê³µíì§ë§ ì€íšì 귌볞 ììžì ëíŽ ë 구첎ì ìŒ ì ììµëë€.
- í겜: ìì í ë°°í¬ëê³ êž°ë¥ì ìž ì í늬ìŒìŽì íê²œìŽ íìíë©°, ì¢ ì¢ íë¡ëì ì 믞ë¬ë§í©ëë€.
E2E ìëí í ì€í ìŽ ì€ìí ìŽì ë 묎ììžê°ì?
E2E í ì€ížë ë€ì곌 ê°ì 겜ì°ì íìì ì ëë€.
- ë¹ìŠëì€ íµì¬ íëŠ ê²ìŠ: ë±ë¡, ë¡ê·žìž, 구맀 ëë ìì ì ì¶ê³Œ ê°ì íµì¬ ì¬ì©ì ì¬ì ìŽ ì¬ë°ë¥Žê² ìëíëì§ íìží©ëë€.
- ìì€í 묞ì ê°ì§: ì¬ë¬ êµ¬ì± ììì ìë¹ì€ê° ë³µì¡í ì€ì ìë늬ì€ìì ìíž ìì©í ëë§ ëíë ì ìë ë²ê·žë¥Œ ë°ê²¬í©ëë€.
- ì¬ì©ì ì 뢰 구ì¶: ìµì¢ ì¬ì©ìê° ììëë¡ ì í늬ìŒìŽì ìŽ ìëíë€ë ìµê³ ìì€ì íì ì ì ê³µí©ëë€.
- êµì°š ëžëŒì°ì /ì¥ì¹ ížíì± ê²ìŠ: ë§ì E2E ëêµ¬ê° ìë¡ ë€ë¥ž ëžëŒì°ì ë° ì뮬ë ìŽì ë ì¥ì¹ìì í ì€ížë¥Œ ì§ìí©ëë€.
JavaScript E2E ìëíì ìŒë°ì ìž ìë늬ì€:
- ì¬ì©ì ë±ë¡ ë° ë¡ê·žìž: ê°ì ììì ìì±íë ê²ë¶í° íìž ìŽë©ìŒì ìì íê³ ë¡ê·žìžíë ì 첎 íë¡ìžì€ë¥Œ í ì€íží©ëë€.
- ì ì ìê±°ë 구맀 íëŠ: ì¬ì©ìê° ì íì ì°Ÿìë³Žê³ , ì¥ë°êµ¬ëì í목ì ì¶ê°íê³ , ê²°ì 륌 ì§ííê³ , ê²°ì 륌 ìë£íë ê²ì ì뮬ë ìŽì í©ëë€.
- ë°ìŽí° ì ì¶ ë° ê²ì: ë€ìí ë°±ìë ìë¹ì€ì ìíž ìì©íê³ ë°ìŽí°ë¥Œ ë€ë¥ž ê³³ì ì¬ë°ë¥Žê² íìíë ë€ëšê³ ìì ì ì¶ì í ì€íží©ëë€.
- íì¬ íµí©: ê²°ì ê²ìŽížìšìŽ, ìì 믞ëìŽ ë¡ê·žìž ëë ìŽë©ìŒ ìë¹ì€ì ê°ì ìžë¶ ìë¹ì€ë¥Œ í¬íšíë ìí¬íë¡ì°ë¥Œ í ì€íží©ëë€.
JavaScript E2E ìëí륌 ìí ë구 ë° íë ììí¬:
JavaScript ìíê³ë E2E ìëí륌 ìí ê°ë ¥í ë구륌 ì ê³µí©ëë€.
- Cypress: ëžëŒì°ì ìì ì§ì ì€íëë ìµì ì¬ìžì JavaScript í ì€í íë ììí¬ì ëë€. ìê° ì¬í ëë²ê¹ , ìë ëêž° ë° ì€ìê° ì¬ë¡ë©ê³Œ ê°ì êž°ë¥ì ì ê³µíì¬ E2E í ì€í ì ëì± ì ê·Œ ê°ë¥íê³ íšìšì ìŒë¡ ë§ëëë€.
- Playwright: Microsoftìì ê°ë°í Playwrightë ëšìŒ APIë¡ Chromium, Firefox ë° WebKitìì ìëí륌 ì§ìíë ê°ë ¥í íë ììí¬ì ëë€. ìë, ìì ì± ë° êŽë²ìí êž°ë¥ìŒë¡ ì ëª í©ëë€.
- Selenium WebDriver: ìë°í ë§í멎 JavaScript ë€ìŽí°ëžë ìëì§ë§(ì¬ë¬ ìžìŽë¥Œ ì§ìíš), Seleniumì ëžëŒì°ì ìëí륌 ìí ì€ë ì ê³ íì€ì ëë€. E2E í ì€ížë¥Œ ìì±íêž° ìíŽ ì¢ ì¢ JavaScript ë°ìžë©ê³Œ íšê» ì¬ì©ë©ëë€.
- Puppeteer: DevTools íë¡í ìœì íµíŽ Chrome ëë Chromiumì ì ìŽíêž° ìí ìì ìì€ API륌 ì ê³µíë Node.js ëŒìŽëžë¬ëЬì ëë€. í ì€í ì í¬íší ëžëŒì°ì ìëí ìì ì ì í©í©ëë€.
ìì: ì¬ì©ì ë¡ê·žìžì ìí E2E í ì€íž
Cypress륌 ì¬ì©íì¬ ì¬ì©ìê° ì í늬ìŒìŽì ì ë¡ê·žìžíë ê²ì ì뮬ë ìŽì íë E2E í ì€ížë¥Œ ìë¡ ë€ìŽ ë³Žê² ìµëë€.
// cypress/integration/login.spec.js
describe('User Authentication Flow', () => {
beforeEach(() => {
// Visit the login page before each test
cy.visit('/login');
});
it('should allow a user to log in with valid credentials', () => {
// Fill in the username and password fields
cy.get('input[name="username"]').type('testuser');
cy.get('input[name="password"]').type('password123');
// Click the login button
cy.get('button[type="submit"]').click();
// Assert that the user is redirected to the dashboard and sees their name
cy.url().should('include', '/dashboard');
cy.contains('Welcome, testuser').should('be.visible');
});
it('should display an error message for invalid credentials', () => {
// Fill in invalid credentials
cy.get('input[name="username"]').type('wronguser');
cy.get('input[name="password"]').type('wrongpassword');
// Click the login button
cy.get('button[type="submit"]').click();
// Assert that an error message is displayed
cy.contains('Invalid username or password').should('be.visible');
});
});
ìŽ E2E í ì€ížë ëžëŒì°ì ì ì§ì ìíž ìì©íê³ , íìŽì§ë¡ ìŽëíê³ , ììì ìì±íê³ , ë²íŒì íŽëŠíê³ , 결곌 UI ë° URLì ëíŽ ìŽì€ì ì ìíí©ëë€. ë¡ê·žìžì ìí ì 첎 ì¬ì©ì ì¬ì ì ë€ë£šë¯ë¡, ì í늬ìŒìŽì ì íµì¬ êž°ë¥ì ëí ê°ë ¥í ê²ìŠì ìíí©ëë€.
íµí© í ì€í vs. ìë í¬ ìë ìëí: ììží ë¹êµ
íµí© ë° E2E í ì€í ì 몚ë íì§ ë³ŽìŠì ë§€ì° ì€ìíì§ë§, íšê³Œì ìž í ì€íž ì ëµì ìíŽìë ì°šìŽì ì ìŽíŽíë ê²ìŽ ì€ìí©ëë€. ë€ìì ë¶ìì ëë€.
| êž°ë¥ | íµí© í ì€í | ìë í¬ ìë ìëí í ì€í |
|---|---|---|
| ë²ì | 몚ë/ìë¹ì€ ê°ì ìíž ìì©. | UIìì ë°±ìë ìŽìê¹ì§ ì 첎 ì í늬ìŒìŽì íëŠ. |
| 목í | êµ¬ì± ìì íµì ë° ìží°íìŽì€ë¥Œ íìží©ëë€. | ìë í¬ ìë ë¹ìŠëì€ íë¡ìžì€ ë° ì¬ì©ì ì¬ì ì ê²ìŠí©ëë€. |
| ìë | E2Eë³Žë€ ë¹ ë¥Žê³ , ì ëë³Žë€ ë늜ëë€. | ëžëŒì°ì ìíž ìì©, ë€ížìí¬ ë° ì 첎 ìì€í ë¶íë¡ ìžíŽ ê°ì¥ ë늜ëë€. |
| ì 뢰ì±/ì·šìœì± | ì ë¹í ì·šìœíš; ìží°íìŽì€ ë³ê²œì 믌ê°í©ëë€. | ë§€ì° ì·šìœíš; UI ë³ê²œ, ë€ížìí¬ ë¬žì , í겜 ìì ì±ì 믌ê°í©ëë€. |
| íŒëë°± ìžë¶ì± | í¹ì ; êµ¬ì± ìì ê°ì 묞ì 륌 ì íí ì°Ÿìë ëë€. | êŽë²ìíš; ìì€í ì ì€íšë¥Œ ëíëŽì§ë§, 귌볞 ììžì ì¶ê° ì¡°ì¬ê° íìí ì ììµëë€. |
| ì ì§ êŽëЬ ë¹ì© | ì ë¹íš. | ëì. |
| ì¢ ìì± | 몚ì ìžë¶ ìë¹ì€ ëë ë¶ë¶ì ìŒë¡ ì€ì ë í겜ì í¬íší ì ììµëë€. | ìì í ë°°í¬ëê³ ìì ì ìž íê²œìŽ íìíë©°, ì¢ ì¢ íë¡ëì ì 몚방í©ëë€. |
| ìì | React êµ¬ì± ììê° API ìëµì ì¬ë°ë¥Žê² ížì¶íê³ ì²ëЬíëì§ í ì€íží©ëë€. | ì 첎 ì¬ì©ì ë±ë¡, ë¡ê·žìž ë° íë¡í ì ë°ìŽíž íëŠì í ì€íží©ëë€. |
| ë구 | Jest, Mocha, Chai, Supertest, React Testing Library. | Cypress, Playwright, Selenium WebDriver, Puppeteer. |
ìŽë€ ì ëµì ìžì ì¬ì©íŽìŒ íëì?
íµí© ë° E2E í ì€í ì€ìì ì ííë ê², ëë ë ì ííê²ë ê·žë€ ê°ì ê· íì íë¡ì ížì ì구 ì¬í, í ì 묞 ì§ì ë° ê°ë° ìëª ì£Œêž°ì ë°ëŒ ë¬ëŒì§ëë€.
ë€ì곌 ê°ì ê²œì° íµí© í ì€í ì°ì ìì ì§ì :
- ë³µì¡í ìíž ìì©ì íìžíŽìŒ íë 겜ì°: ìì€í ì ìë¡ ë€ë¥ž ë¶ë¶(ì: API ìëí¬ìžíž, ë°ìŽí°ë² ìŽì€ ìë¹ì€, íë°ížìë 몚ë)ìŽ íšê» ìëíŽìŒ í ë.
- í¹ì 몚ëì ëí ë ë¹ ë¥ž íŒëë°±ì ìíë 겜ì°: íµí© í ì€ížë ì 첎 ì í늬ìŒìŽì ì ììí íì ììŽ ìë¹ì€ê° íµì íë ë°©ìì 묞ì 륌 ì ìíê² ìë³í ì ììµëë€.
- ë§ìŽí¬ë¡ìë¹ì€ë¥Œ ê°ë°íë 겜ì°: íµí© í ì€ížë ê°ë³ ìë¹ì€ê° ìë¡ íšê³Œì ìŒë¡ íµì í ì ìëì§ íìžíë ë° ì€ìí©ëë€.
- ë²ê·žë¥Œ ì¡°êž°ì ì¡ê³ ì¶ì 겜ì°: íµí© í ì€ížë ì ë í ì€ížì E2E í ì€íž ê°ì 격찚륌 íŽìíì¬ ìì€í ì 첎ì ë³µì¡í 묞ì ê° ëêž° ì ì 묞ì 륌 ì¡ìë ëë€.
ë€ì곌 ê°ì ê²œì° ìë í¬ ìë ìëí ì°ì ìì ì§ì :
- ì€ìí ì¬ì©ì ì¬ì ì ê²ìŠíŽìŒ íë 겜ì°: ì¬ì©ì 겜í ë° ë¹ìŠëì€ ëª©íì ì§ì ì ìž ìí¥ì 믞ì¹ë íµì¬ êž°ë¥(ì: ê²°ì , ììœ)ì 겜ì°.
- ë°°í¬ë ì í늬ìŒìŽì ì ëí ìµë íì ìŽ íìí 겜ì°: E2E í ì€ížë ì€ì ì¬ì©ì ìíž ìì©ê³Œ ê°ì¥ ì ì¬í ì뮬ë ìŽì ì ëë€.
- 죌ì 늎늬ì€ë¥Œ ì€ë¹íë 겜ì°: 몚ë ìì€í ìŽ íë¡ëì 곌 ì ì¬í í겜ìì íšê» ì¬ë°ë¥Žê² ìëíëì§ íìží©ëë€.
- êµì°š ëžëŒì°ì /ì¥ì¹ ížíì±ì 볎ì¥íŽìŒ íë 겜ì°: ë§ì E2E ëêµ¬ê° ìë¡ ë€ë¥ž í겜ìì í ì€ížë¥Œ íì©í©ëë€.
êžë¡ë² JavaScript í ì€í ì ëµì ìí ëªšë² ì¬ë¡
êžë¡ë² ì¬ì©ì륌 ìí ê°ë ¥í í ì€í ì ëµì 구ííë €ë©Ž ë€ìí ìì륌 ì ì€íê² ê³ ë €íŽìŒ í©ëë€.
1. ê· í ì¡í í ì€í íŒëŒë¯žë ì±í:
E2E í ì€ížìë§ ì졎íì§ ë§ìžì. ì ë í ì€ížë¥Œ ê°ë ¥íê² êž°ë°ìŒë¡ íê³ , í¬êŽì ìž íµí© í ì€ížë¥Œ ë°ë¥Žë©°, E2E í ì€íž ìžížì ì§ì€íë ì 구조íë í ì€íž ì€ìížë ìë, ë¹ì© ë° íì ì ìµìì ê· íì ì ê³µí©ëë€. ìŽ ì ê·Œ ë°©ìì íë¡ì ížì ì§ëЬì ë¶í¬ì êŽê³ììŽ ë³Žížì ìŒë¡ ì ì©í ì ììµëë€.
2. êµì íë í ì€í í겜 ì¬ì©:
E2E í ì€ížì ê²œì° ìë¡ ë€ë¥ž ì§ëЬì ìì¹, ë€ížìí¬ ìë ë° ë¡ì»¬ëŒìŽì ìŽì (ìžìŽ, íµí)ì ì뮬ë ìŽì íë í겜ìì ì€ííë ê²ì ê³ ë €íìžì. BrowserStack ëë Sauce Labsì ê°ì ë구ë êŽë²ìí ì¥ì¹, ëžëŒì°ì ë° ì§ëЬì ì§ììì í ì€ížë¥Œ ì€íí ì ìë íŽëŒì°ë êž°ë° í ì€í íë«íŒì ì ê³µí©ëë€. ìŽë ì ìžê³ ì¬ì©ì륌 ìíŽ ì í늬ìŒìŽì ìŽ ìŽë»ê² ìëíëì§ ìŽíŽíë ë° ë§€ì° ì€ìí©ëë€.
3. ìžë¶ ìë¹ì€ ì ì íê² ëªší¹:
ì§ì ê°ì©ì± ëë ì±ë¥ ì°šìŽê° ìì ì ìë íì¬ ìë¹ì€(ê²°ì ê²ìŽížìšìŽ, ìì ë¡ê·žìž ë±)ì íµí©í ë, íµí© í ì€ížìì ê°ë ¥í ëªší¹ êž°ë²ì ì¬ì©íìžì. ìŽë¥Œ íµíŽ ì í늬ìŒìŽì ë¡ì§ì ë¶ëЬíê³ ì€ì ê°ì©ì±ì ì졎íê±°ë ë¹ì©ì ë€ìŽì§ ìê³ ìŽë¬í ìë¹ì€ìì ìíž ìì©ì í ì€íží ì ììµëë€. E2E í ì€ížì 겜ì°, ìŽë¬í ìë¹ì€ì ì€í ìŽì§ í겜ì ì¬ì©íê±°ë ì€ìê° íµí©ì ì ì€íê² êŽëЬíŽìŒ í ì ììµëë€.
4. ë¡ì»¬ëŒìŽì ìŽì ë° êµì í(i18n/l10n) í ì€í ê³ ë €:
ì í늬ìŒìŽì ìŽ ìë¡ ë€ë¥ž ìžìŽ, ë ì§ íì, ì«ì íì ë° íµí륌 ì¬ë°ë¥Žê² ì²ëЬíëì§ íìžíìžì. ìŽë E2E í ì€í ì ìŒë¶ê° ë ì ìì§ë§(ì: ìë¡ ë€ë¥ž ìžìŽë¡ UI ìì íìž), í¹ì íµí© í ì€ížë i18n/l10n ëŒìŽëžë¬ëŠ¬ê° ì¬ë°ë¥Žê² ë¡ëëê³ ë²ì ëë íìì ì ì©íëì§ íìží ìë ììµëë€.
5. CI/CD íìŽíëŒìž ëŽìì ê°ë¥í 몚ë í목 ìëí:
ì ë, íµí© ë° E2E í ì€ížë¥Œ CI/CD(Continuous Integration/Continuous Deployment) íìŽíëŒìžì íµí©íìžì. ìŽë ê² í멎 ìœë륌 컀ë°íê±°ë ë¹ëí ëë§ë€ í ì€ížê° ìëìŒë¡ ì€íëìŽ ì ìí íŒëë°±ì ì ê³µí©ëë€. êžë¡ë² íì 겜ì°, ìŽ ìëíë íŒëë°± 룚íë ë€ìí ìê°ëìì ìœë íì§ê³Œ ì¡°ì ì ì ì§íë ë° íìì ì ëë€.
6. E2E í ì€ížë¥Œ ì€ìí ì¬ì©ì íëŠì ì§ì€:
ë¹ì©ê³Œ ì·šìœì±ì ê³ ë €í ë, E2E í ì€ížë ê°ì¥ ì€ìí ì¬ì©ì ì¬ì ì ìíŽ ììœëìŽìŒ í©ëë€. ì륌 ë€ìŽ, êžë¡ë² ì ì ìê±°ë ì¬ìŽížìë ê²°ì íë¡ìžì€, ì¬ì©ì ê³ì ìì± ë° íì ì í ê²ìì ëí ê°ë ¥í E2E í ì€ížê° ììŽìŒ í©ëë€. ìŽê²ìŽ ì ìžê³ ê³ ê° ë§ì¡±ë ë° ë¹ìŠëì€ ììµì ì§ì ì ìž ìí¥ì 믞ì¹ë íëŠì ëë€.
7. íŽëŒì°ë êž°ë° í ì€í íë«íŒ íì©:
E2E í ì€ížì 겜ì°, AWS Device Farm, BrowserStack ëë Sauce Labsì ê°ì íŽëŒì°ë íë«íŒì íì©íë ê²ìŽ ì¢ìµëë€. ìŽë¬í íë«íŒì ë€ìí ëžëŒì°ì , ìŽì 첎ì ë° ì ìžê³ì ë°°í¬ë ì€ì ì¥ì¹ìì ìëíë E2E í ì€ížë¥Œ ë³ë ¬ë¡ ì€ííêž° ìí íì¥ ê°ë¥í ìžíëŒë¥Œ ì ê³µí©ëë€. ìŽë í ì€íž ì€í ìë륌 í¬ê² ëìŽê³ ë€ìí ì¬ì©ì í겜ì ëí 컀ë²ëЬì§ë¥Œ ì ê³µí©ëë€.
8. êŽì°° ê°ë¥ì± ë° ëªšëí°ë§ 구í:
ë¶ì° í겜ìì E2E í ì€ížê° ì€íší멎, 묞ì 륌 ì§ëšíë ê²ìŽ ìŽë €ìž ì ììµëë€. CI/CD íìŽíëŒìž, í ì€í íë«íŒ ë° ì í늬ìŒìŽì ìì²Žê° ê°ë ¥í ë¡ê¹ , ì€ë¥ ë³Žê³ ë° ëªšëí°ë§ ë구륌 ê°ì¶ëë¡ íìžì. ìŽë¥Œ íµíŽ ìœëì ë²ê·ž, ìžë¶ ìë¹ì€ êŽë š 묞ì ëë í¹ì ì§ìì ìí¥ì 믞ì¹ë ë€ížìí¬ ë¬žì ë± ì€íšì 귌볞 ììžì ì ìíê² ìë³í ì ììµëë€.
9. í ì€íž ì ëµ ë¬žìí ë° ê³µì :
ë¶ì°ë íì 겜ì°, í ì€í ì ëµ, í ì€íž 컀ë²ëŠ¬ì§ ë° ëªšë² ì¬ë¡ì ëí ëª íí 묞ìë ë§€ì° ì€ìí©ëë€. 몚ë í 구ì±ì(ìì¹ì êŽê³ììŽ)ìŽ ê° í ì€íž ì íì 목ì , íšê³Œì ìž í ì€ížë¥Œ ìì±íë ë°©ë² ë° í ì€íž 결곌륌 íŽìíë ë°©ë²ì ìŽíŽíëë¡ íìžì. ìŽë ìŒêŽì± ë° ìíížìšìŽ íì§ì ëí ê³µì ìì ê¶ì ìŽì§í©ëë€.
ê²°ë¡ : ì€ë§íž í ì€í ìŒë¡ êžë¡ë² ì 뢰 구ì¶
JavaScript í ì€í ì ë§ì€í°íë ê²ì ì§ìì ìž ê³Œì ìŽë©°, íµí© í ì€í 곌 ìë í¬ ìë ìëíì ê³ ì í ìí ì ìŽíŽíë ê²ì êžë¡ë² ì¬ì©ì륌 ìí ê³ íì§ì ì 뢰í ì ìë ì¹ ì í늬ìŒìŽì ì 구ì¶íë ë° ì€ìí ëšê³ì ëë€. íµí© í ì€ížë ìì€í ì ìë¡ ë€ë¥ž ë¶ë¶ìŽ ì¬ë°ë¥Žê² íµì íë€ë ìžë¶ì ìž íì ì ì ê³µíë ë°ë©Ž, E2E ìëíë ì¬ì©ìê° ìŽëì ìë ìêŽììŽ ì 첎 ì í늬ìŒìŽì ìŽ ìëí ëë¡ ìëíë€ë íì ì ì ê³µí©ëë€.
ê· í ì¡í í ì€í íŒëŒë¯žë륌 ì±ííê³ , ì ì í ë구ì íŽëŒì°ë íë«íŒì íì©íê³ , êµì ì ìž ê³ ë € ì¬íì ìŒëì ëê³ ì€ìí ì¬ì©ì íëŠì ì§ì€íšìŒë¡ìš ì í늬ìŒìŽì ì ê²¬ê³ ì±ì í¬ê² í¥ììí€ê³ , ë¹ì©ìŽ ë§ìŽ ëë íë¡ëì ë²ê·žë¥Œ ì€ìŽê³ , ì ìžê³ì ìŒë¡ ì°ìí ì¬ì©ì 겜íì ì ê³µí ì ììµëë€. í¬êŽì ìž í ì€í ì ëµì í¬ìíìžì. ê·žë¬ë©Ž ì í늬ìŒìŽì ìŽ êµì 묎ëìì ëì± íë ¥ì ìŽê³ ì ì§ êŽëЬ ê°ë¥íë©° ì±ê³µí ê²ì ëë€.