מקרה מחקר בנקנקסט: אוטומציה JUnit Mockito

BankNext’ם סביבת ייצור מהפכנית כוללת מעל 300 מיקרו-שירותים פעילים. מספר קבוצות שעובדות במקביל על ה-SVCים אלה מעלימות את הסיכון לשבור את הפונקציונליות. הוספת JUnits וכספי קוד באופן ידני לקוד קיים וחדש היא מייגעת ואיטית באופן כואב.

אתגרים עם JUnits ידניים

  1. פעולה זמנית רבה לכתוב JUnits מתאימים ושימושיים באופן ידני.
  2. חסר סטנדרטיזציה מכיוון שכל אחד משתמש בגישות שונות.
  3. נוצרים JUnits חסרים/לא נכונים בגלל חוסר זמן.
  4. סינכרון ידני של JUnits קיימים בשל שינויי קוד הוא לא מעשי.
  5. כתיבת JUnits באופן ידני עבור קוד ישן היא סיוט.
  6. העדיפות הנמוכה ביותר מוקצה ל-JUnits בשל תוחלות; לכן מתעלמים ממנו.
  7. איכות הקוד סופגת מאוד, והחוב הטכני מצביע.

פתרון: אוטומציה של JUnit-Mockito

  1. GitHub 
  2. האוטומציה קולטת את שם המחלקה ויוצרת JUnits תואמים ומתפקדים.
  3. ה-JUnits הנוצרים מכילים את האלייתיים הנדרשים של Mockito.
  4. מטפל ב-JUnits עבור RestControllers, Services, Handlers, מחלקות Kafka וכו'.
  5. כך, היא משיגה יותר מ-70% כיסוי קוד ברוב התרחישים.

יכולות האוטומציה

  1. עובד עבור שני SpringBoot 2.x ו-3.x יישומים מבוססי Maven.
  2. מעט מאוד מאמץ ההגדרה.
  3. לוקח את הנתיב המקומי של היישום שלך & קלט משתמש מאוד בסיסי.
  4. משתמש בכלים של השתלבות כדי לקבוע את פרטי מבנה היישום.
  5. מזהה בקלות את ה-Mockbeans הנדרשים.
  6. מייצר אוטומטית "כש-אז" מוקים Mockito.
  7. מייצר דוחות שכפול קוד Jacoco.

מבנה של JUnit חוקי

  1. חלקים חובה: 3
    1. קרא את שיטת המבחן המטרה
    2. העמד במוק כל האינטראקציות שהן חיצוניות למחלקה זו
    3. בדוק האם התפלגות הפלט האמיתית תואמת את האמור/לוודא הצפוי
  2. זהה והכריז על כל המחלקות החיצוניות כ-MockBeans
  3. העמד בסטוב את התגובות הצפויות מהאינטראקציות של מוקבין זה
  4. להלן הכללים הבסיסיים ל-JUnit משופט ומעבד
Shell

 

Junit-Mockito  Ground Rules

1- target mtd to be tested createCustomer is a void returnType   
2- external mtd invoked .delete     is a void returnType
3- when-then   :  doNothing whenInvoke .delete
4- assertion    :  verify .delete called 1 times  

1- target mtd to be tested createCustomer is a void returnType   
2- external mtd invoked .save          is a Customer returnType
3- when-then   :  when  save then return new Customer
4- assertion    :  verify .save called 1 times

1- target mtd to be tested createCustomer is a Customer returnType   
2- external mtd invoked .save          is a Customer returnType
3- when-then   :  when  save then return new Customer
4- assertion    :  assert result instanceof Customer / Customer is not null

1- target mtd to be tested createCustomer is a Customer returnType   
2- external mtd invoked .findAll          is a List returnType
3- when-then   :  when findAll then return new ArrayList
4- assertion    :  assert result instanceof List / List.size >0

הדגמת אוטומציה

צפה בהדגמה כאן.

Shell

 

cd C:\Vijay\Java              [your local machine path]
git clone https://github.com/vijayredkar/junit-mockito-automation.git

# מבנה הספרייה הסופי שלי
# C:\Vijay\Java\AutomationJunitMockito\appsetup
# C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\junit-automation 

cd C:\Vijay\Java\AutomationJunitMockito\appsetup
setup.bat

------- שלבי הדגמה ------
https://vijayredkar.medium.com/banknext-case-study-junit-mockito-automation-ac9f6b72cfcc
https://github.com/vijayredkar/junit-mockito-automation

C:\Vijay\Java\AutomationJunitMockito\appsetup

demo scenario -1
com.banknext.customer.mgt.service.CustomerServiceImplType1   
com.banknext.customer.mgt.controller.CustomerMgtControllerType1 

demo scenario -2
com.banknext.customer.mgt.service.CustomerServiceImplType2   
com.banknext.customer.mgt.controller.CustomerMgtControllerType2                 

demo scenario -3
com.banknext.customer.mgt.event.publisher.CustomerTxnPublisherType1             
com.banknext.customer.mgt.event.consumer.CustomerTxnConsumerType1               

demo scenario -4
https://github.com/bezkoder/spring-boot-h2-database-crud/tree/master
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects
#git clone https://github.com/bezkoder/spring-boot-h2-database-crud.git
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install

cd C:\Vijay\Java\AutomationJunitMockito\appsetup
run setup.bat

cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install
import in Eclipse
add POM dependencies
check current Jacoco code coverage
 

continue automation run 
check/adjust generated Junits
check current Jacoco code coverage
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud

check new Jacoco code coverage

run all tests 
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install
check again all Jacoco code coverage

C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud\src\main\java\com\bezkoder\spring\jpa\h2
com.bezkoder.spring.jpa.h2.controller.TutorialController
com.bezkoder.spring.jpa.h2.model.Tutorial
TutorialController

לפני ואחרי ריצת אוטומציה

מסקנה

  1. BankNext חוסך זמן ומאמץ עצומים עם יצירת JUnit אוטומטית.
  2. זה מתבטא ישירות בחסכון בעלויות הפרויקט.
  3. קיבולת הקוד גדלה במידה רבה.
  4. הצוות מסוגל להתמקד לגמרי בפעילויות הפיתוח האמיתיות.
  5. JUnits מוסיפים/מתחזקים באופן עקבי עם מעט מאוד מאמץ ידני.
  6. החוב הטכני מצטמצם באופן ניכר.
  7. מרחיב באופן ניכר את הבטחון ביישומים המופקדים לייצור.

Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1