BankNext’ם סביבת ייצור מהפכנית כוללת מעל 300 מיקרו-שירותים פעילים. מספר קבוצות שעובדות במקביל על ה-SVCים אלה מעלימות את הסיכון לשבור את הפונקציונליות. הוספת JUnits וכספי קוד באופן ידני לקוד קיים וחדש היא מייגעת ואיטית באופן כואב.
אתגרים עם JUnits ידניים
- פעולה זמנית רבה לכתוב JUnits מתאימים ושימושיים באופן ידני.
- חסר סטנדרטיזציה מכיוון שכל אחד משתמש בגישות שונות.
- נוצרים JUnits חסרים/לא נכונים בגלל חוסר זמן.
- סינכרון ידני של JUnits קיימים בשל שינויי קוד הוא לא מעשי.
- כתיבת JUnits באופן ידני עבור קוד ישן היא סיוט.
- העדיפות הנמוכה ביותר מוקצה ל-JUnits בשל תוחלות; לכן מתעלמים ממנו.
- איכות הקוד סופגת מאוד, והחוב הטכני מצביע.
פתרון: אוטומציה של JUnit-Mockito
- GitHub
- האוטומציה קולטת את שם המחלקה ויוצרת JUnits תואמים ומתפקדים.
- ה-JUnits הנוצרים מכילים את האלייתיים הנדרשים של Mockito.
- מטפל ב-JUnits עבור RestControllers, Services, Handlers, מחלקות Kafka וכו'.
- כך, היא משיגה יותר מ-70% כיסוי קוד ברוב התרחישים.
יכולות האוטומציה
- עובד עבור שני SpringBoot 2.x ו-3.x יישומים מבוססי Maven.
- מעט מאוד מאמץ ההגדרה.
- לוקח את הנתיב המקומי של היישום שלך & קלט משתמש מאוד בסיסי.
- משתמש בכלים של השתלבות כדי לקבוע את פרטי מבנה היישום.
- מזהה בקלות את ה-Mockbeans הנדרשים.
- מייצר אוטומטית "כש-אז" מוקים Mockito.
- מייצר דוחות שכפול קוד Jacoco.
מבנה של JUnit חוקי
- חלקים חובה: 3
- קרא את שיטת המבחן המטרה
- העמד במוק כל האינטראקציות שהן חיצוניות למחלקה זו
- בדוק האם התפלגות הפלט האמיתית תואמת את האמור/לוודא הצפוי
- זהה והכריז על כל המחלקות החיצוניות כ-MockBeans
- העמד בסטוב את התגובות הצפויות מהאינטראקציות של מוקבין זה
- להלן הכללים הבסיסיים ל-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
לפני ואחרי ריצת אוטומציה
מסקנה
- BankNext חוסך זמן ומאמץ עצומים עם יצירת JUnit אוטומטית.
- זה מתבטא ישירות בחסכון בעלויות הפרויקט.
- קיבולת הקוד גדלה במידה רבה.
- הצוות מסוגל להתמקד לגמרי בפעילויות הפיתוח האמיתיות.
- JUnits מוסיפים/מתחזקים באופן עקבי עם מעט מאוד מאמץ ידני.
- החוב הטכני מצטמצם באופן ניכר.
- מרחיב באופן ניכר את הבטחון ביישומים המופקדים לייצור.
Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1