Table of Contents
מדוע בדיקות יחידה הן קריטיות עבור APIs ו- SDKs
בהנדסת תוכנה מודרנית, APIs ו- SDKs לפעול כעמוד השדרה של מערכות מבוזרות ושילובים של צד שלישי. באג בנקודת קצה אחת או הפונקציה SDK יכול לעגל את ה-SEC על פני עשרות שירותים תלויים, גרימת זמן, שחיתות נתונים, או פרצות אבטחה.תתת בדיקות יחידה - הרמה הטרופית ביותר של בדיקות אוטומטיות - לאמת כי כל פונקציה, שיטה, או נקודות קצה בצורה נכונה בידוד.
בדיקות יחידות מבוססות היטב לעשות יותר מאשר לתפוס באגים.הם משמשים כתיעוד חי, מתן דוגמאות של איך כל רכיב API נועד לעבוד.הם נותנים למפתחים את הביטחון כדי לספק, לשדרג, להוסיף תכונות ללא חשש לשבור חוזים קיימים.בקיצור, בדיקות יחידה הופכת API או SDK מקופסא שחורה שברירית לבלוק בנייה חזק, שומרוני.
עקרונות הליבה של בדיקות יחידה עבור APIs ו- SDKs
לפני צלילה לשיטות ספציפיות, זה עוזר להקים בסיס.העקרונות הבאים להנחות כל אסטרטגיה יעילה לבדיקת יחידות עבור ממשקים אשר צרכו על ידי מפתחים אחרים.
מבחן ב-Isolation, אך חשוב על אינטגרציה
בדיקות יחידה חייבות לפעול ללא תלות חיצונית - אין מסד נתונים חי, אין שיחות רשת, גישה למערכת קבצים.עבור APIs ו- SDKs, זה אומר ללעג ללקוחות HTTP, מנהלי מסד נתונים ושירותים של צד שלישי.עם זאת, בידוד אינו מתכוון להתעלם מהסביבה האמיתית.
לטפל במבחנים שלך כקוד
בדיקות יחידה צריכות את אותו חומר כמו קוד הייצור.הם צריכים להיות ממובנים היטב, לעקוב אחר מוסכמות שם, ולהיבחן במהלך ביקורות קוד. חבילת מבחן בכתב גרועה הופכת לנטל תחזוקה שמאט את ההתפתחות.
התנהגות טובה יותר על יישום
בדוק מה הקוד עושה, לא איך זה עושה את זה.לדוגמה, כאשר בודק שיטה שהופכת את נתוני בקשת ה- API, לבדוק את צורת הפלט והערכים - אל תטען כי פונקציה מסוימת של עוזר נקראה פנימית.פרקטיקה זו מונעת בדיקות מפירוק כאשר אתה מספק מחדש את פרטי היישום הפנימי.
שיטות עבודה טובות לכתיבה של יחידות: In-Depth
עם העקרונות בראש, הנה שיטות מעשיות הטובות ביותר מותאמות במיוחד עבור ממשקי API הנדסיים ו- SDKs.
1 לכתוב אחת אסרציה ליחידת התנהגות
נפילה נפוצה היא אריזה מספר טענות לתפקוד מבחן יחיד.בעוד כמה מסגרות מאפשרות זאת, כל בדיקה צריכה לאמת את ה-APLT:0one התנהגות הגיונית המחשהFLT:1 (אם אתה צריך לבדוק את קוד הסטטוס, ראש ספציפי, ואת גוף התגובה של נקודת קצה API, פיצול אלה למבחנים נפרדים (או לפחות פונקציות בדיקה נפרדות).
לדוגמה: עבור שיטת SDK אשר משחזרת משתמש על ידי מזהה, לכתוב בדיקות נפרדות עבור: מזהה תקף מחזיר 200 עם מטען נכון, מזהה לא חוקי מחזיר 404, ו- ID חסר מחזיר 400. לכל מבחן יש שם יחיד, קריא כמו FLT:0.
2.התלויים החיצוניים עם אחריות
(הופנה מהדף ה-API ו- SDK. השתמש בספריות כמו FLT:0) ענישה (mockeurFLT:1) (Python), FLT:2MockitophFLT 3: 3 (Java), או (FLT:4jest.fn) אם לא תפעילו בדיקות פנימיות (JavaSct) אלא להימנע מעומס יתר על פני לעג בלבד.
(FLT:0) התאמות ריאליות עבור תגובות לעג.ראהFLT:1 במקום להחזיר ג'ון ג'ון נפוח, דגימת עומס כי מראות תגובות ייצור בפועל (עם נתונים רגישים אנונימיים) זה מבטיח את ה parsing וטעויות טיפול לוגיקה נבדק עם קלט מציאותי.
כיסוי כל טעות ואירועי צוק
APIs ו- SDKs חייבים להתמודד לא רק הצלחה, אלא גם מגוון רחב של כישלונות: זמן רשת, JSON, שגיאות אימות, קצב הגבלת קצב, וקודים בלתי צפויים של HTTP.עבור כל שיטה ציבורית או נקודת קצה, לכתוב מבחן לכל תרחיש שגיאה אפשרי המתועד במפרט ה- API שלך.
- פרמטרים ריקים או אפס קלט
- תשלום גדול מאוד (מבחן חובה)
- דמויות מיוחדות במחרוזת (SQLזרקה ניסיונות, unicode)
- בקשות מקבילות שעלולות לגרום לתנאי גזע
עבור SDKs, גם בדיקת לוגיקה, מנגנונים חוזרים והתנהגות backoff. חבילת בדיקה חזקה סימולציה החוצה חכמים זמניים ולוודא כי ה- SDK שלך מחזר את המספר הנכון של פעמים לפני נכשל בחינון.
4.הבטחו שמבחנים הם עצמאיים לחלוטין
(ה) , כאשר מבחן אחד מסתמך על המדינה שנותרה על ידי אחר - הם מקור עיקרי של קיסנות (בבדיקות API/SDK), זה מופיע לעתים קרובות כאשר בדיקות חולקות שרת לעג או תצורה סטטית.שימוש ב-FLT:0test FixturesFLT:1 (למשל, CLT 1 / FLT2 ב- Python,LT2 / FLT / FLT)
עצמאות מבחן פירושה גם שמבחנים יכולים לפעול בכל סדר.תגדירו את צינורות CI שלכם כדי לבצע בדיקה אקראית, המזמן את הזמן לתפוס תלות נסתרת.
5. הוצאה אוטומטית עם Robust CIאינטגרציה
בדיקות יחידה הן בעלות ערך רב ביותר כאשר הן פועלות על כל מבצע.לשלב את רץ המבחן שלך עם מערכת CI /CD שלך. השתמש כתבים מבחן המייצרים פלט בפורמט JUnit XML עבור שילוב קל עם לוחות נתונים.קבוע סף לכיסוי קוד - אבל לא לטפל כיסוי כמטרה בפני עצמו. במקום זאת, השתמש בדיווחים כיסוי כדי לזהות ענפים לא נבדקים בקוד שגיאות או לעתים רחוקות עבור API, כיסוי פנים (תוכנות), עבור יישומים פנימיים, עבור יישומים (תוכנות), וכיסויים) הוא אמצעי תמיכה (תוכנות אבטחה (תוכנות) עבור מסלולים חשובים יותר מאשר מסלולים של פונקציות (בעיות) עבור פונקציות אבטחה).
לשקול היטב את השימוש ב-FLT:0 (הבדיקות של בריאות) ב- CI: להפעיל תת-קבוצה של בדיקות יחידות קריטיות לפני החבילה המלאה.אם הבדיקות "הנתיב השמח" נכשלות, מוקדם לספק משוב מהיר למפתחים.
אסטרטגיות מתקדמות ל-API & SDK Unit Testing
מעבר ליסוד, ישנן טכניקות שמצריכות את הבדיקות שלך ממספיקות למצוינות.
בדיקות חוזים עם Unit Tests
במערכת אקולוגית מיקרו-שירותים, APIs לעתים קרובות יש חוזים מוגדרים מראש (OpenAPI, GraphQL schema, gRPC Proto קבצים) (שילוב אימות החוזה לתוך בדיקות היחידה שלך.לדוגמה, להשתמש בכלי כמו FLT:0 OpenAPI GeneratorFLT:1 כדי ליצור גמגמים המאמתים תגובות נגד מפרט זה, ולאחר מכן לכתוב בדיקות כי קובע את ההתאמות התגובה לתפוס את התופסים את השינויים לפני שהם יכולים להשיג שינויים.
בדיקת איכות מבחן
בדיקת המוטציות מציגה פגמים קטנים (המוטנטים) בקוד שלך ובדיקות אם הבדיקות שלך מזהה אותם.כלי כמו FLT:0 MutmutofLT:1 (Python) או FLT:2StrykerigibFLT 3 (JavaScript) יכולים לחשוף חולשות בבדיקות הבדיקה שלך.
בדיקות מקוצרות ל-Coratorial Coverage
(הפסקות של API רבות מקבלות פרמטרים מרובים של קלט אשר אינטראקציה.במקום לכתוב מקרים של מבחן ידני עבור כל שילוב, השתמש בבדיקות פרמטריות (FLT 7 של Ptest, JUnit's FLT:8, Jest's's (FLT 9) זה מאפשר לך לבחון עשרות של מוטציות קלט עם קוד מינימלי תוך ביצוע כיסוי שקוף עבור שיטת SDK ששולח אימייל, כדי לאמת את הפרמטרים, פורמטים, פרמטרים בתבניות דואר אלקטרוני פגום, וכתוב, פרמטרים ריקים, פרמטרים, פרמטרים, פרמטרים ריקים, פרמטרים, וגרסאות טקסט פרמטרים, פרמטרים, פרמטרים.
לעתים קרובות אזורים צפופים ב- API / SDK Unit Tests
אפילו קבוצות מנוסים יכולות להחמיץ היבטים חשובים.כאן כמה שמגיעות תשומת לב מיוחדת.
בדיקה וריאציות סביבתיות
APIs ו- SDKs לעתים קרובות להסתמך על משתנים סביבתיים או קבצי תצורה (למשל, מפתחי API, כתובות בסיס, ערכי זמן) לכתוב בדיקות יחידה המאמתות את הקוד שלך קורא נכון ומאמת את התצורה הזו.מקרים של מבחן צריך לכלול משתנים חסרים, ערכים ריקים, כתובות ממותרות, ו-Out-of-range timeouts.זה חשוב במיוחד עבור SDKs כי יהיה מותקן בסביבות לא ידועות.
בדיקת התנהגות סינכרונית ו-Timeouts
רבים מודרניים APIs להשתמש במבצעים סינכרוניים: Webhooks, ארוך-פוללינג, או תגובות הזרמה. Unit Testing דפוסים אלה דורש לעג זהיר של לולאות אירוע וזמניים. השתמש בכלים של 'אסיננסיו' ב- Python, 'FakeTimer' ב- C#, או 'jestuseFakeTimers () ב- JavaScript כדי לדמות את הזמן ואת התנאים של ה- SDK.
בדיקה אחרונה ב-Idempotency and Retry Logic
APIs התומכים במפתחות idempotency זקוקים לתשומת לב מיוחדת.תתת יחידה שדמיינה את אותה בקשה פעמיים עם אותו מפתח idempotency, וטוען כי הקריאה השנייה מחזירה את אותה התוצאה כמו הראשון, מבלי לבצע את הפעולה שוב. בדומה, לבדוק מנגנונים retry: ללעג שגיאה 503 transient, ולאחר מכן לאמת כי ה- SDK שלך חוזר בקצב אקספונמיטיבי ובסופו של דבר מצליח.
מלכודות להימנע
לדעת מה לא לעשות זה חשוב כמו לדעת את השיטות הטובות ביותר.
- (FLT:0)Afree Testing the Framework.FLT:1, אל תכתבו בדיקות עבור התנהגות ספריית HTTP בסיסית או פונקציונליות ORM. להתמקד בהגיון המותאמים אישית שלכם.
- (ב) אם לעג הוא בעל זוג חזק מדי ליישום (למשל, לצפות למחרוזת של שאילתת SQL מסוימת), המבחן ישבור בכל פעם שתספק את בונה השאילתה.
- (FLT:0)Afree Giant "integration-in-disguise" בדיקות יחידה 1 אם הבדיקה יחידה שלך ספין מסד נתונים פנימי, עושה שיחות HTTP אמיתיות, או תלוי בשרת פועל, זה לא מבחן יחידה.
- (FLT:0) קיצור של קוד מבחן שכפול (FLT:1) מיצוי לוגיקה של התקנה משותפת לתפקודים או שיעורי בסיס.עקרון DRY חל גם על בדיקות.
בניית ממשק API ידידותי / SDK Design
הארכיטקטורה של הפרויקט שלך משפיעה ישירות על כמה קל לבדוק.עיצוב ה- API וה- SDK שלך עם הסתברות מראש.
- (FLT:0) הזרקת התלות של האובססיה (FLT:1), במקום לקוחות HTTP קשיחים או חיבורי מסד נתונים, להעביר אותם (או לספק ברירת מחדל תצורה).
- (FLT:0) לוגיקה עסקית מ-I/OIRFLT) 1 1 Isolate טרנספורמציות נתונים טהורות לפונקציות שאינן נוגעות ברשת.
- (FLT:0) דרישות מבחן שימושיות.FIRLT:1) Ship את ה- SDK שלך עם עוזרי מבחן - בשרתים לעג, פונקציות במפעל, או יישום מזויף של ממשקי ליבה.המשתמשים שלך ישימו לך תודה, וחבילת הבדיקה שלך תהיה נקייה יותר.
- (FLT:0) ציפיות מבחן עריכת דין (FLT:103) ב- API שלך, לציין את ההתנהגות המדויקת של מקרים שגיאה, מגבלות קצב וקודי סטטוס.זה כפול כסימון עבור חבילת הבדיקה שלך.
דוגמה: יחידת בדיקה של שיטת SDK End-to-End
כדי להמחיש, לשקול שיטת SDK של Python (FLT:10), אשר עושה בקשה POST ל-FLT:11 כאן הוא קבוצה פשוטה של בדיקות יחידה לאחר התרגולים לעיל:
(ב) [15] ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
(ב) ויקרא:2 (ב) בפרשת ויקרא:2 ויקרא:2 ויקרא ט') באין צורך באיסור על סמך הוראתו של [[המאה ה-1]], [[1924]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]]
(ב) [העיקרון]: [ה] [ה] [ה]] [ה] [ה]] [ה]][ה]][ה]]][ה]][ה]]][ה]]]][ה]] [ה][ה]]] [הלקוח] ה-HTTP] ל[ה[[ה[[המאה ה-20], ו[[ה[[המאה ה-20]].
כל מבחן הוא עצמאי, מלגלג רק על גבול HTTP חיצוני, ומאמת התנהגות מסוימת אחת.
מסקנה
בדיקות יחידה עבור ממשקי API הנדסיים ו- SDKs אינן אופציונליות - זה חלק בלתי נפרד מאספקת מוצר אמין שמפתחים אחרים בוטחים בו.על ידי כתיבת בדיקות מבודדות, ממוקדות ומקיף, אתה מגן על הצרכנים מפני רגרסציות ועצמך מפגישות מאוחרות של הלילה.שלב את התרגילים המתוארים לעיל עם צינור חזק וארכיטקטורה ידידותית לבדיקה, ואתה תפיק קוד זה הוא חזק ותענוג לשמור על הנאה.
(ב) לקריאה נוספת, ייעוץ (FLT:0 Martin Fowler on UnittestFLT) ו- The FLT:2Python Unittest Documents FLT 3 עבור מושגים בסיסיים.עבור אסטרטגיות בדיקה ספציפיות של API, ⁇ 4:4 מדריך הניסויים של ה-Postman:5 מציע נקודת מבט מעשית על חוזים ושילוב אשר משלימים את החבילה שלך.