Viet unit test dang gia: test gi, bo qua gi
Ban co 500 unit test, do phu 90%, nhung bug van lot ra production va moi lan sua code la hang chuc test do do. Van de khong phai it test, ma la test sai cho. Bai nay giup ban phan biet test dang viet va test lang phi: test hanh vi thay vi cai dat, chon dung cho de test, va tranh nhung cai bay khien test gion.
Unit test de lam gi
Unit test co hai gia tri that: bat loi hoi quy khi ban sua code, va lam tai lieu song ve cach mot don vi code duoc ky vong hoat dong. Neu mot test khong phuc vu duoc mot trong hai muc dich do, no chi la ganh nang bao tri.
Do phu (coverage) khong phai muc tieu. No la chi so phu. 90% coverage voi test chi kiem tra “ham chay khong loi” con te hon 60% coverage voi test kiem tra dung hanh vi quan trong.
Test hanh vi, dung test cai dat
Day la lan ranh quan trong nhat. Test hanh vi hoi: “voi dau vao nay, ket qua co dung khong?”. Test cai dat hoi: “ham co goi dung phuong thuc noi bo do khong?”.
Vi du, mot ham tinh gia don hang. Test hanh vi: dua gio hang co 2 mon va ma giam gia, kiem tra tong tien tra ve dung. Test cai dat: kiem tra ham co goi applyDiscount() truoc calculateTax(). Cai thu hai gion: khi ban refactor logic ben trong ma ket qua van dung, test cai dat do vo — mac du code hoan toan on.
Nguyen tac: test giao dien cong khai va ket qua quan sat duoc, khong test chi tiet rieng tu ben trong. Khi do, ban co the tai cau truc thoai mai ma test van bao ve ban.
Chon cai gi dang test
Khong phai moi dong deu dang mot test. Uu tien theo rui ro:
| Nen test ky | Thuong khong can |
| Logic nghiep vu phuc tap (tinh gia, phan quyen, quy tac hop le) | Getter/setter tam thuong |
| Cac truong hop bien: rong, null, so am, gioi han | Code chi goi thang thu vien ben ngoai |
| Cho tung sai truoc day (bug da sua) | Cau hinh, hang so |
| Chuyen doi du lieu, parse, tinh toan | Wrapper mong khong co logic |
Meo thuc te: moi khi sua mot bug, viet truoc mot test tai hien bug do. No vua chung minh ban da sua dung, vua ngan bug quay lai.
Vi du thuc te
Mot ham tinh phi van chuyen: mien phi neu don tren 500k, nguoc lai tinh 30k. Test “cho co” chi kiem tra don 600k thi phi bang 0. Nhung bug that su nam o bien: don dung 500k thi tinh sao? Yeu cau la “tren 500k”, vay 500k chan phai la 30k — nhung code lai viet >= nen tra ve 0.
Test hanh vi tot phai co ca ba ca: 499k (co phi), 500k (bien — de lo bug), 600k (mien phi). Chinh ca 500k moi la cai dang viet nhat, va cung la cai bi bo qua nhieu nhat.
Loi thuong gap va cach sua
Test gion vi mock qua nhieu
Mock moi thu bien test thanh ban sao cua cai dat: doi code mot chut la phai sua ca dong mock. Chi mock ranh gioi that su (goi mang, DB, thoi gian, ngau nhien). Logic thuan tuy thi test truc tiep, khong mock.
Mot test kiem tra qua nhieu thu
Khi no do, ban khong biet cai gi sai. Moi test nen kiem tra mot hanh vi. Ten test mo ta ro dieu kien va ky vong.
Test phu thuoc thu tu chay hoac trang thai chung
Test dung bien tinh (static) chung se do ngau nhien khi chay song song. Moi test phai doc lap, tu chuan bi va don dep du lieu cua no.
Test dung thoi gian/ngau nhien that
DateTime.Now hay random truc tiep khien test khi do khi khong. Tiem (inject) dong ho va nguon ngau nhien de kiem soat trong test.
Checklist test dang gia
- Test hanh vi quan sat duoc, khong test chi tiet ben trong.
- Da phu cac ca bien: rong, null, gioi han, so am.
- Moi test kiem tra mot thu, ten test noi ro dieu kien + ky vong.
- Chi mock ranh gioi ngoai (mang, DB, thoi gian, ngau nhien).
- Moi test doc lap, khong phu thuoc thu tu hay trang thai chung.
- Moi bug da sua deu co mot test tai hien di kem.
- Coverage la chi so phu, khong phai muc tieu.
Ket luan
Test tot cho ban tu tin sua code — do moi la gia tri that, khong phai con so coverage. Buoc tiep theo: mo bo test hien tai, chon 5 test bat ky va hoi — neu minh refactor logic ben trong ma giu nguyen ket qua, test nay co do khong? Neu co, do la test cai dat can viet lai theo huong hanh vi.
Cau hoi thuong gap
Coverage bao nhieu la du?
Khong co con so vang. Quan trong hon la test dung cho: logic nghiep vu va cac ca bien can gan het, con code tam thuong thi khong. Doi voi con so tuyet doi cao ma bo qua chat luong test.
Nen viet test truoc hay sau code?
Viet truoc (TDD) giup ban thiet ke giao dien tot hon va bao dam test that su chay dung. Viet sau cung on neu ban thuc su phu cac ca bien. Chon cach phu hop, mien la test kiem tra hanh vi that.
Unit test khac integration test the nao?
Unit test kiem tra mot don vi co lap, nhanh, nhieu. Integration test kiem tra nhieu thanh phan phoi hop (vi du code + DB that), cham hon, it hon. Ca hai can nhau: unit bat loi logic, integration bat loi ghep noi.
Test bi do lien tuc khi sua code, nen lam gi?
Neu test do vi ket qua sai — tot, no dang lam viec. Neu test do du ket qua van dung, do la dau hieu test bam vao cai dat. Viet lai chung theo huong hanh vi thay vi tat di.
Tham khao
- Working Effectively with Legacy Code — Michael Feathers (dinh nghia thuc te ve unit test tot).
- Test Driven Development: By Example — Kent Beck.