開発者全員が書けるE2Eテスト ─ 普通のgo testで実現するテスト基盤 (E2E tests every developer can write, with plain go test)
Bài tóm tắt Mercari 2025 3. Quy mô lớn Độ khó: Trung bình
Mercari · 2025 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc
Một bài trong series Global App (ngoài sheet). Bối cảnh: Mercari 2025. Tác giả thuộc đội SRE & Enabling của Cross Border.
Bối cảnh
- E2E test của API backend lúc đầu do đội QA giữ (viết bằng Jest): API đổi thì test cập nhật sau, thêm test chậm nên coverage giảm, developer không hiểu test nên khó debug. Thêm các vấn đề quen thuộc: dựng môi trường phức tạp, chạy song song thì tranh tài nguyên, phải học framework/DSL riêng.
Thay đổi chính
- E2E test viết bằng
go testthường: table-driven test,t.Parallel(), client ConnectRPC sinh sẵn (kiểm kiểu lúc compile); chỉ cần gọitestenv.Run()để nhận URL server. Thành viên QA không quen Go viết test với trợ giúp của AI; test Jest cũ được chuyển sang bằng AI rồi người review. - Server dựng theo từng test, không chạy trên môi trường dev dùng chung: môi trường chung không cho kiểm ngay thay đổi đang sửa. Framework giữ một pool server: hàm truyền vào
testenv.Run()kết thúc thì server tự trả về pool. - Một container AlloyDB Omni, mỗi test một logical database: framework tạo DB, chạy migration, dọn bằng
TRUNCATErồi trả về pool. Chỉ khởi động một container mà dữ liệu vẫn tách khi chạy song song. - Coverage của server process: build server bằng
go build -cover, mỗi server một thư mụcGOCOVERDIRriêng (không tranh nhau khi song song), cuối cùng gộp bằnggo tool covdata merge. - Trên CI chạy trong Kubernetes, không build image:
go test -cbiên dịch test thành binary, cùng binary server nén tar rồi chuyển vào Pod bằngkubectl exec, chạy thẳng trong Pod; khoảng 1 phút rưỡi từ build tới lúc test bắt đầu. Dùng Kubernetes vì mỗi luồng song song cần một server riêng, tài nguyên tăng tuyến tính theo độ song song. - Đang làm: dùng AI chọn chỉ các test liên quan tới phần thay đổi.
Vì sao
- Mục tiêu là mọi developer viết API đều sửa được E2E test; công nghệ hằng ngày (Go, IDE, debugger) là cách hạ chi phí học về 0.
Bài học cho SWE
- E2E test nằm ngoài ngôn ngữ và quy trình của developer thì bị bỏ lại phía sau thay đổi API.
- Cô lập dữ liệu bằng logical database trong một instance + pool tái dùng rẻ hơn mỗi test một container.
- Bỏ bước build/push/pull image khi chỉ cần chạy một binary: chuyển file thẳng vào Pod.
Liên quan
- Kiểm thử độ tin cậy (chaos, fault injection, mô phỏng tất định) · CI và build ở quy mô lớn
- Cùng series: Mercari 2025 · Mercari 2025
- Nơi chạy kiểm chứng tích hợp: DoorDash 2022 · Trendyol 2020
#E2E test#go test#ConnectRPC#AlloyDB Omni#logical database#resource pool#TRUNCATE#go build -cover#GOCOVERDIR#go test -c#kubectl exec#Kubernetes#Jest
Được nhắc tới trong
Công ty (1)