תהליך ה-CI/CD שלי עבר במשך 3 חודשים — ואז קראתי את הלוגים
סימני וי ירוקים מרגישים טוב. כל pull request עבר. כל deploy עבד.
ואז משתמש דיווח על פיצ'ר שבור. הוא היה שבור כבר שבועות.
פתחתי את לוגי ה-pipeline. ה-builds שעברו שיקרו לנו.
התהליך שלנו נראה מושלם:
- Linting
- Unit tests
- Integration tests
- Build
- Deploy
לכל שלב היו אחוזי הצלחה של 100% במשך חודשים.
כשלחוץ על כפתור ה-export לא קרה כלום. לא הופיעה שגיאה. עקבתי את זה אחורה עד לשינוי מלפני 11 שבועות. ה-pipeline עבר. ה-code review אושר. הפיצ'ר היה שבור מההתחלה.
הבעיה לא הייתה הקוד שלנו. היא הייתה קוד הבדיקות שלנו.
בדיקות האינטגרציה שלנו השתמשו ב-mocks לכל דבר. עשינו mock לכל שירות ה-export. הבדיקה בדקה את ה-mock במקום את הקוד האמיתי. ה-mock תמיד החזיר סטטוס הצלחה.
נפלנו למלכודת ה-over-mocking:
- Unit tests: עשינו mock להכל כדי לבודד את היחידה. זה בסדר.
- Integration tests: עשינו mock להכל בשביל המהירות. זו טעות.
- E2E tests: פספסו את ה-flow הספציפי הזה.
בדיקות האינטגרציה שלנו היו פשוט בדיקות יחידה יקרות. הן אישרו שה-mocks שלנו עובדים. הן לא אישרו שהקוד שלנו עובד.
ביצעתי שלושה שינויים כדי לתקן את זה:
הגבלת ה-mocks לבדיקות יחידה בלבד. בדיקות אינטגרציה חייבות לפגוש מסדי נתונים, APIs ומערכות קבצים אמיתיים. אם בדיקה היא איטית, אל תסתיר אותה עם mock. השתמש במהירות הזו כאות לאופטימיזציה.
הוספת contract tests. אלו מבטיחות שה-mocks שלך תואמים להתנהגות השירות האמיתי. אם mock מחזיר נתונים ששירות אמיתי לא היה מחזיר, ה-contract test ייכשל.
מעקב אחר coverage אמיתי. הפסקנו להסתכל על אחוזי מעבר פשוטים. הסתכלנו על מה הבדיקות באמת הריצו. מספרי ה-coverage שלנו צנחו מ-94% ל-67%. זה היה המדד הכי כנה שהיה לנו.
pipeline ירוק לא אומר שהקוד שלך עובד. זה אומר שהבדיקות שלך עברו. אלו דברים שונים.
הבאגים הכי מסוכנים הם אלו שה-pipeline שלך אומר שהם תקינים.
תשאלו את עצמכם את השאלות האלו:
- האם הבדיקות שלי תופסות באגים או רק מאשרות mocks?
- האם בדיקות האינטגרציה שלי באמת מבצעות אינטגרציה?
- אם אני מסיר את כל ה-mocks, כמה בדיקות עדיין עוברות?
- האם אני מודד coverage או ביטחון?
pipeline שלעולם לא נכשל אינו אמין. הוא פשוט לא נבדק.
מקור: https://dev.to/kollittle/my-cicd-pipeline-passed-for-3-months-then-i-read-the-logs-4mbj
