טבלאות נתוני מלפפון

1. הקדמה

מלפפון היא מסגרת פיתוח התנהגותית מונעת התנהגות (BDD) המאפשרת למפתחים ליצור תרחישי בדיקה מבוססי טקסט באמצעות שפת הגורקין. במקרים רבים, תרחישים אלה מחייבים נתונים מדומים כדי לממש תכונה, שיכולה להיות מסורבלת להזרקה - במיוחד עם ערכים מורכבים או מרובים.

במדריך זה נבדוק כיצד להשתמש בטבלאות נתוני מלפפון כדי לכלול נתונים מדומים בצורה קריאה.

2. תחביר תרחיש

כאשר אנו מגדירים תרחישים של מלפפון, לעתים קרובות אנו מזריקים נתוני בדיקה המשמשים את שאר התרחיש:

תרחיש: מספר ספרים נכון שאינו אפס שנמצא על ידי הסופר בהתחשב בכך שיש לי את הספר בחנות בשם השטן בעיר הלבנה מאת אריק לארסון כשאני מחפש ספרים מאת הסופר אריק לארסון ואז אני מוצא ספר אחד

2.1. טבלאות נתונים

בעוד שנתונים מוטבעים מספיקים עבור ספר יחיד, התרחיש שלנו יכול להיות עמוס כשמוסיפים מספר ספרים. כדי להתמודד עם זה, אנו יוצרים טבלת נתונים בתרחיש שלנו:

תרחיש: מספר ספרים נכון שאינו אפס שנמצא על ידי המחבר בהתחשב בכך שיש לי את הספרים הבאים בחנות | השטן בעיר הלבנה | אריק לארסון | | האריה, המכשפה וארון הבגדים | סי.אס לואיס | | בגן החיות | אריק לארסון | כשאני מחפש ספרים מאת הסופר אריק לארסון ואז אני מוצא 2 ספרים

אנו מגדירים את טבלת הנתונים שלנו כחלק משלנו נָתוּן סעיף מאת כניסה לשולחן מתחת לטקסט של נָתוּן סָעִיף. באמצעות טבלת נתונים זו אנו יכולים להוסיף מספר שרירותי של ספרים - כולל ספר בודד בלבד - לחנות שלנו על ידי הוספה או הסרה של שורות.

בנוסף, ניתן להשתמש בטבלאות נתונים עם כל סעיף - לא רק נָתוּן סעיפים.

2.2. כולל כותרות

ניכר שהעמודה הראשונה מייצגת את כותרת הספר, והעמודה השנייה מייצגת את מחבר הספר. המשמעות של כל טור לא תמיד ברורה כל כך.

כאשר יש צורך בבירור, אנו יכולים לכלול כותרת על ידי הוספת שורה ראשונה חדשה:

תרחיש: מספר ספרים נכון שאינו אפס שנמצא על ידי המחבר בהתחשב בכך שיש לי את הספרים הבאים בחנות | כותרת | מחבר | | השטן בעיר הלבנה | אריק לארסון | | האריה, המכשפה וארון הבגדים | סי.אס לואיס | | בגן החיות | אריק לארסון | כשאני מחפש ספרים מאת הסופר אריק לארסון ואז אני מוצא 2 ספרים

בעוד שהכותרת נראית רק עוד שורה בטבלה, לשורה הראשונה הזו יש משמעות מיוחדת כאשר אנו מנתחים את הטבלה שלנו לרשימת מפות בחלק הבא.

3. הגדרות שלב

לאחר יצירת התרחיש שלנו, אנו מיישמים את ה- נָתוּן הגדרת צעד. במקרה של שלב המכיל טבלת נתונים, אנו מיישמים את השיטות שלנו בעזרת א טבלת נתונים טַעֲנָה:

@Given ("ביטוי כלשהו") פומבי בטל somePhrase (טבלת טבלת הנתונים) {// ...}

ה טבלת נתונים האובייקט מכיל את הנתונים הטבלאיים מטבלת הנתונים שהגדרנו בתרחיש שלנו, כמו גם שיטות להפיכת נתונים אלה למידע שמיש. באופן כללי, ישנן שלוש דרכים לשנות טבלת נתונים במלפפון: (1) רשימה של רשימות, (2) רשימה של מפות ו- (3) שנאי טבלה.

כדי להדגים כל טכניקה, נשתמש בפשטות סֵפֶר מחלקת תחום:

ספר בכיתה ציבורית {כותרת מחרוזת פרטית; סופר מחרוזת פרטי; // קונסטרוקציות סטנדרטיות, קבוצות וקובעים ...}

בנוסף, ניצור חֲנוּת סְפָרִים כיתה שמצליחה סֵפֶר חפצים:

חנות ספרים בכיתה ציבורית {ספרים פרטיים ברשימה = ArrayList חדש (); תוסף ספר ריק (public book) {books.add (ספר); } ריק ריק addAllBooks (ספרי אוסף) {this.books.addAll (ספרים); } רשימת ספרים ציבורית ByAuthor (מחבר מחרוזת) {return books.stream () .filter (book -> Objects.equals (author, book.getAuthor ())) .collect (Collectors.toList ()); }}

עבור כל אחד מהתרחישים הבאים, נתחיל בהגדרת שלב בסיסית:

BookStoreRunSteps {חנות BookStore פרטית; רשימה פרטית נמצאה ספרים; @ לפני setUp הריק הציבורי () {חנות = חנות ספרים חדשה (); foundBooks = ArrayList חדש (); } // מתי והגדרות ...}

3.1. רשימת רשימות

השיטה הבסיסית ביותר לטיפול בנתונים טבלאיים היא המרת ה- טבלת נתונים ויכוח לרשימת רשימות. אנו יכולים ליצור טבלה ללא כותרת כדי להדגים:

תרחיש: מספר ספרים שאינו אפס נכון שנמצא על ידי מחבר לפי רשימה בהתחשב שיש לי את הספרים הבאים בחנות לפי רשימה | השטן בעיר הלבנה | אריק לארסון | | האריה, המכשפה וארון הבגדים | סי.אס לואיס | | בגן החיות | אריק לארסון | כשאני מחפש ספרים מאת הסופר אריק לארסון ואז אני מוצא 2 ספרים

מלפפון ממיר את הטבלה לעיל ל- a רשימת רשימות על ידי התייחסות לכל שורה כרשימה של ערכי העמודות. לפיכך, מלפפון מנתח כל שורה לרשימה המכילה את כותרת הספר כאלמנט הראשון והמחבר כשני:

[["השטן בעיר הלבנה", "אריק לארסון"], ["האריה, המכשפה וארון הבגדים", "ס.ס. לואיס"], ["בגן החיות", "אריק לארסון"]]

אנו משתמשים ב- asLists שיטה - אספקת א מחרוזת.מעמד טיעון - להמיר את טבלת נתונים טיעון לא רשימה. זֶה מעמד הוויכוח מודיע ל asLists שיטה איזה סוג נתונים אנו מצפים שכל אלמנט יהיה. במקרה שלנו, אנחנו רוצים שהכותרת והמחבר יהיו חוּט ערכים. לפיכך, אנו מספקים מחרוזת.מעמד:

@Given ("^ יש לי את הספרים הבאים בחנות לפי רשימה $") חלל ציבורי haveBooksInTheStoreByList (טבלת נתונים) {רשימה שורות = table.asLists (String.class); עבור (רשימת עמודות: שורות) {store.addBook (ספר חדש (column.get (0), column.get (1))); }}

לאחר מכן אנו חוזרים על כל אלמנט ברשימת המשנה ויוצרים מקביל סֵפֶר לְהִתְנַגֵד. לבסוף, אנו מוסיפים כל אחד שנוצר סֵפֶר להתנגד לשלנו חֲנוּת סְפָרִים לְהִתְנַגֵד.

אם ניתחנו נתונים המכילים כותרת, היינו מדלגים על השורה הראשונה מכיוון שמלפפון אינו מבדיל בין כותרות לנתוני שורות עבור רשימת רשימות.

3.2. רשימת מפות

בעוד שרשימת רשימות מספקת מנגנון בסיסי לחילוץ אלמנטים מטבלת נתונים, יישום השלבים יכול להיות סתום. מלפפון מספק רשימה של מנגנון מפות כחלופה קריאה יותר.

במקרה הזה, עלינו לספק כותרת לשולחן שלנו:

תרחיש: מספר ספרים נכון שאינו אפס שנמצא על ידי מחבר לפי מפה בהתחשב בכך שיש לי את הספרים הבאים בחנות לפי מפה | כותרת | מחבר | | השטן בעיר הלבנה | אריק לארסון | | האריה, המכשפה וארון הבגדים | סי.אס לואיס | | בגן החיות | אריק לארסון | כשאני מחפש ספרים מאת הסופר אריק לארסון ואז אני מוצא 2 ספרים

בדומה לרשימת מנגנון הרשימות, מלפפון יוצר רשימה המכילה כל שורה אך במקום זאת ממפה את כותרת העמודה לכל ערך עמודה. מלפפון חוזר על התהליך הזה עבור כל שורה שלאחר מכן:

[{"title": "השטן בעיר הלבנה", "מחבר": "אריק לארסון"}, {"title": "האריה, המכשפה וארון הבגדים", "מחבר": "CS לואיס"} , {"title": "בגן החיות", "מחבר": "אריק לארסון"}]

אנו משתמשים ב- asMaps שיטה - אספקת שניים מחרוזת.מעמד טיעונים - להמיר את טבלת נתונים טיעון לא רשימה. הארגומנט הראשון מציין את סוג הנתונים של המפתח (כותרת) והשני מציין את סוג הנתונים של כל ערך עמודה. לפיכך, אנו מספקים שניים מחרוזת.מעמד טיעונים כי הכותרות (מפתח) והכותרת והמחבר (הערכים) הם כולם חוּטס.

ואז אנו חוזרים על כל אחד מהם מַפָּה התנגד לחלץ כל ערך עמודה באמצעות כותרת העמודה כמפתח:

@Given ("^ יש לי את הספרים הבאים בחנות לפי מפה $") חלל ציבורי haveBooksInTheStoreByMap (טבלת נתונים) {רשימה שורות = table.asMaps (String.class, String.class); עבור (מפה עמודות: שורות) {store.addBook (ספר חדש (column.get ("כותרת"), column.get ("מחבר"))); }}

3.3. שנאי שולחנות

המנגנון הסופי (והעשיר ביותר) להמרת טבלאות נתונים לאובייקטים שניתן להשתמש בהם הוא יצירת a TableTransformer. א TableTransformer הוא אובייקט המורה למלפפון כיצד להמיר טבלת נתונים התנגד לאובייקט התחום הרצוי:

בואו נראה תרחיש לדוגמא:

תרחיש: מספר ספרים נכון שאינו אפס שנמצא על ידי מחבר עם שנאי בהינתן שיש לי את הספרים הבאים בחנות עם שנאי | כותרת | מחבר | | השטן בעיר הלבנה | אריק לארסון | | האריה, המכשפה וארון הבגדים | סי.אס לואיס | | בגן החיות | אריק לארסון | כשאני מחפש ספרים מאת הסופר אריק לארסון ואז אני מוצא 2 ספרים

בעוד שרשימת מפות, עם נתוני העמודות המקשדים שלה, מדויקת יותר מרשימת רשימות, אנו עדיין עמוסים בהגדרת הצעדים שלנו עם לוגיקת המרה. במקום זאת, עלינו להגדיר את הצעד שלנו עם אובייקט התחום הרצוי (במקרה זה, א ספר קטלוג) כטענה:

@Given ("^ יש לי את הספרים הבאים בחנות עם שנאי $") public void haveBooksInTheStoreByTransformer (קטלוג BookCatalog) {store.addAllBooks (catalog.getBooks ()); }

כדי לעשות זאת, עלינו ליצור יישום מותאם אישית של ה- TypeRegistryConfigurer מִמְשָׁק.

יישום זה חייב לבצע שני דברים:

  1. ליצור חדש TableTransformer יישום.
  2. רשום יישום חדש זה באמצעות configureTypeRegistry שיטה.

כדי ללכוד את טבלת נתונים לאובייקט תחום שמיש, ניצור ספר קטלוג מעמד:

קטלוג ספרים כיתתי ציבורי {ספרים רשימים פרטיים = ArrayList חדש (); תוסף ספר ריק (public book) {books.add (ספר); } // גטר סטנדרטי ...}

כדי לבצע את השינוי, בוא ניישם את TypeRegistryConfigurer מִמְשָׁק:

מחלקה ציבורית BookStoreRegistryConfigurer מיישמת את TypeRegistryConfigurer {@Override Local Locale Locale () {return Locale.ENGLISH; } @Override ריק חלל configureTypeRegistry (TypeRegistry typeRegistry) {typeRegistry.defineDataTableType (DataTableType חדש (BookCatalog.class, BookTableTransformer חדש ())); } // ...

ואז ליישם את TableTransformer ממשק עבור שלנו ספר קטלוג מעמד:

 מחלקה סטטית פרטית BookTableTransformer מיישם TableTransformer {@Override Public BookCatalog transform (טבלת DataTable) זורק Throwable {קטלוג BookCatalog = BookCatalog חדש (); table.cells () .stream () .skip (1) // דלג על שורת כותרת .מפה (שדות -> ספר חדש (fields.get (0), fields.get (1))) .forEach (קטלוג :: addBook ); קטלוג החזרה; }}}

שים לב שאנחנו משנים נתונים באנגלית מהטבלה, ולכן אנו מחזירים את האזור האנגלי מהמקום שלנו אזור () שיטה. כאשר אנו מנתחים נתונים באזור אחר, עלינו לעשות זאת שנה את סוג ההחזרה של אזור () שיטה למקום המתאים.

מכיוון שכללנו כותרת טבלת נתונים בתרחיש שלנו, עלינו לדלג על השורה הראשונה כשמסתובבים מעל תאי הטבלה (מכאן דלג (1) שִׂיחָה). היינו מסירים את דלג (1) התקשר אם השולחן שלנו לא כלל כותרת.

כברירת מחדל, ה- קוד דבק המשויך לבדיקה משערך להיות באותה חבילה כמו מחלקת הרצים. לכן, אין צורך בתצורה נוספת אם אנו כוללים את ה- BookStoreRegistryConfigurer באותה חבילה כמו כיתת הרצים שלנו. אם נוסיף את התצורה בחבילה אחרת, עלינו לכלול במפורש את החבילה ב- @CucumberOptionsדֶבֶק שדה למעמד הרצים.

4. מסקנה

במאמר זה בדקנו כיצד להגדיר תרחיש גרקין עם נתונים טבלאיים באמצעות טבלת נתונים. בנוסף, בדקנו שלוש דרכים ליישום הגדרת שלב הצורכת טבלת נתונים של מלפפון.

בעוד שרשימת רשימות ורשימת מפות מספיקות לטבלאות בסיסיות, שנאי טבלאות מספק מנגנון עשיר בהרבה המסוגל להתמודד עם נתונים מורכבים יותר.

קוד המקור השלם של מאמר זה ניתן למצוא באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found