Ako se koristi pravilno, AI je odličan u enumeraciji dijela testiranja — brainstormi granične slučajeve i brzo piše boilerplate. Ali morate provjeriti da su tvrdnje smislene, jer će AI rado pisati testove koji prolaze bez dokazivanja čega god.
Ako se koristi pravilno, AI je odličan u enumeraciji dijela testiranja — brainstormi granične slučajeve i brzo piše boilerplate. Ali morate provjeriti da su tvrdnje smislene, jer će AI rado pisati testove koji prolaze bez dokazivanja čega god.
// Function under test, with its contract:
// applyDiscount(price, percent) -> price reduced by percent.
// Contract: percent must be 0..100; throws RangeError otherwise. price >= 0.
function applyDiscount(price, percent) {
if (percent < 0 || percent > 100) throw new RangeError('percent out of range');
return price - (price * percent) / 100;
}
// AI-suggested test cases (Jest) — note the edge and error paths, not just happy path:
test('applies a normal discount', () => {
expect(applyDiscount(100, 20)).toBe(80); // happy path
});
test('0% leaves price unchanged', () => {
expect(applyDiscount(100, 0)).toBe(100); // boundary: lower edge
});
test('100% makes it free', () => {
expect(applyDiscount(100, 100)).toBe(0); // boundary: upper edge
});
test('rejects percent above 100', () => {
expect(() => applyDiscount(100, 150)).toThrow(RangeError); // error path
});
AI je predložila granične slučajeve (0 i 100) i put greške koji možda zaboravite. Vaš posao je potvrditi da je toBe(80) ispravna očekivana vrijednost, ne samo ono što funkcija vraća.
Teški dio testiranja nije tipkanje test(...) blokova — to je razmišljanje o slučajevima koje biste inače propustili, i AI je stvarno dobar u toj širini. Ali nema pojma što vaš kod trebao biti osim ako ga ne povežete, tako da bez nadzora teži pisanju testova koji zrcale implementaciju (prolaze, ali bi prošli čak i ako je funkcija bila pogrešna). Tretiranje AI-a kao generatora graničnih slučajeva dok vi posjedujete tvrdnje daje vam široku pokrivenost i stvarnu ispravnost — brzinu od AI-a, prosudbu od vas.