Xin chào, đồng nghiệp lập trình viên! 👋 Chúng ta hãy nói về kẻ phá hoại thầm lặng của mọi đường ống monorepo: các bài kiểm tra không ổn định . Bạn biết những bài kiểm tra đó chứ — các bài kiểm tra vượt qua 90% thời gian nhưng lại thất bại ngẫu nhiên, khiến bạn phải nheo mắt nhìn nhật ký vào lúc 2 giờ sáng, lẩm bẩm, "Nhưng nó đã hoạt động trên máy của tôi!"
Trong một monorepo, các bài kiểm tra không ổn định không chỉ gây khó chịu mà còn là những quả lựu đạn trên toàn bộ cơ sở mã . Một bài kiểm tra không ổn định có thể chặn triển khai cho tất cả các dự án. Nhưng đừng lo! Hãy biến những kẻ thù không ổn định đó thành những điều kỳ quặc vô hại với các đường ống cách ly và các bản hack đã được thử nghiệm trong chiến đấu.
Điều gì khiến xét nghiệm không chính xác trở nên nguy hiểm ở Monorepos?
Các bài kiểm tra không ổn định sẽ thất bại một cách khó lường do:
- Tình trạng chạy đua (ví dụ: vấn đề thời gian trong mã bất đồng bộ).
- Trạng thái chia sẻ (kiểm tra dẫm chân nhau).
- Phụ thuộc bên ngoài (API, cơ sở dữ liệu gặp sự cố).
Trong monorepos, những thất bại này lan rộng khắp các dự án, khiến các quy trình bị dừng lại. 😱
Chiến lược 1: Đường ống kiểm dịch 🚨
Đừng để các bài kiểm tra không ổn định làm hỏng đường ống CI/CD chính của bạn. Hãy cô lập chúng!
Bước 1: Xác định thủ phạm
Sử dụng các công cụ như Jest Circus , pytest-flake-finder hoặc các tập lệnh tùy chỉnh để phát hiện các bài kiểm tra không ổn định bằng cách chạy lại chúng N lần:
# Example: Rerun failing tests 3 times to confirm flakiness npm test -- --ci --runInBand --detectOpenHandles --testFailureRetry=3
Bước 2: Di chuyển chúng đến nơi cách ly
Tạo một đường ống/công việc riêng biệt chỉ dành cho các bài kiểm tra không ổn định:
# GitHub Actions Example jobs: main-tests: runs-on: ubuntu-latest steps: - run: npm test -- --excludeFlaky quarantine: needs: main-tests runs-on: ubuntu-latest steps: - run: npm test -- --onlyFlaky
Tại sao điều này hiệu quả :
- Đường ống chính vẫn nhanh và ổn định .
- Quarantine chạy các thử nghiệm không ổn định sau khi xây dựng chính để chúng không chặn việc triển khai.
- Bạn có thể theo dõi các bài kiểm tra không ổn định mà không làm chậm tiến độ.
Chiến lược 2: Mẹo ổn định để trung hòa sự lỏng lẻo 🛡️
Hack 1: Thử lại cẩn thận
Chỉ thử lại các thử nghiệm không ổn định trong đường ống kiểm dịch :
# GitLab CI Example quarantine: retry: max: 2 # Retry failed tests up to 2 times script: - npm run test:flaky
Mẹo chuyên nghiệp : Tránh thử lại trong đường ống chính của bạn vì chúng sẽ che giấu các vấn đề thực sự!
Hack 2: Giết trạng thái chia sẻ
- Cô lập cơ sở dữ liệu : Sử dụng các container Docker với các phiên bản DB mới cho mỗi lần thử nghiệm.
- Ngẫu nhiên hóa thứ tự kiểm tra : Ngăn chặn các bài kiểm tra phụ thuộc vào trình tự thực hiện.
jest --shuffle # Randomize test order
Hack 3: Bộ đệm thời gian chờ
Thêm thời gian gia hạn cho các hoạt động chậm:
// Jest example test("slow API test", async () => { jest.setTimeout(15000); // 15s timeout instead of default 5s });
Chiến thắng thực tế: Startup X đã cứu vãn sự tỉnh táo của họ như thế nào
Một monorepo gồm 20 dự án đã thất bại 30% trong việc triển khai do các bài kiểm tra không ổn định. Họ:
- Đã chuyển 15 xét nghiệm không chính xác sang đường ống cách ly.
- Đã sửa lỗi 10/15 với khả năng xử lý thời gian chờ tốt hơn và cô lập DB.
- Giảm 80% tình trạng hỏng đường ống trong vòng 2 tuần.
Những cạm bẫy cần tránh
- Bỏ qua việc cách ly : Đừng để các xét nghiệm không chính xác chồng chất—hãy sửa chúng dần dần.
- Thử lại quá nhiều : Thử lại không bằng sửa lỗi. Sử dụng chúng một cách tiết kiệm.
- Không giám sát : Theo dõi tần suất kiểm tra không ổn định bằng bảng thông tin (ví dụ: Datadog , Grafana ).
Công cụ để chống lại Flake
- CircleCI Flaky Test Insights : Tự động phát hiện và đưa ra các bài kiểm tra không ổn định.
- Buildkite Test Analytics : Trực quan hóa các xu hướng thử nghiệm không ổn định.
- Script tùy chỉnh : Tự động phát hiện thử nghiệm không ổn định bằng các tác vụ cron.
Kế hoạch hành động của bạn
- Kiểm tra : Tìm các bài kiểm tra không ổn định với các lần chạy lại và nhật ký.
- Kiểm dịch : Di chuyển chúng đến một đường ống riêng biệt.
- Sửa lỗi : Giải quyết nguyên nhân gốc rễ (trạng thái chia sẻ, thời gian chờ, v.v.).
- Giám sát : Ngăn chặn các bài kiểm tra không ổn định mới xuất hiện.
Suy nghĩ cuối cùng : Các bài kiểm tra không ổn định giống như cỏ dại—hãy bỏ qua chúng và chúng sẽ chiếm lấy khu vườn của bạn. Nhưng với các đường ống kiểm dịch và các mẹo thông minh, bạn sẽ lấy lại được sự tỉnh táo của CI/CD.