開発者全員が書ける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 test thường: table-driven test, t.Parallel(), client ConnectRPC sinh sẵn (kiểm kiểu lúc compile); chỉ cần gọi testenv.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 TRUNCATE rồ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ục GOCOVERDIR riêng (không tranh nhau khi song song), cuối cùng gộp bằng go tool covdata merge.
  • Trên CI chạy trong Kubernetes, không build image: go test -c biên dịch test thành binary, cùng binary server nén tar rồi chuyển vào Pod bằng kubectl 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