دراسة حالة BankNext: إعداد تلقائي باستخدام JUnit وMockito

BankNextلديها بيئة إنتاجكبيرة تتألف من أكثر من300 ميكرو خدمة مباشرة. العديد من الفرق التي تعمل بشكل متزامن علىهذه الخدمات المتكاملة (SVCs)يزيد من خطركسر الوظائف. إضافة 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. يعمللكل من SpringBoot2.x و3.x التطبيقات المبنية على Maven.
  2. جهد الإعداد البالغ صفر تقريبًا.
  3. يأخذ مسار التطبيق المحلي ومدخلات المستخدم الأساسية للغاية.
  4. يستخدم واجهة برمجة التطبيقات لاستنباط تفاصيل بنية التطبيق.
  5. يحدد بسلاسة الـ Mockbeans المطلوبة.
  6. يولد تلقائيًا “عندما-ثم” Mockito mocks.
  7. يولد تقارير تغطية الكود Jacoco.

بنية مخطط JUnit قانوني

  1. أجزاء إلزامية: 3
    1. استدعاء طريقة الاختبار المستهدفة
    2. موك التفاعلات الخارجية لهذه الصنف
    3. التحقق من أن الناتج الفعلي يطابق التأكيد/التحقق المتوقع
  2. تحديد وإعلان جميع الصنف الخارجية باعتبارها MockBeans
  3. تعويض الاستجابات المتوقعة من تفاعلات MockBean هذه
  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