BankNextの大規模な運用環境には300を超えるライブマイクロサービスがあります。これらのSVCに同時に取り組む複数のスクワッドは、機能破損のリスクを高めます。既存および新規コードに手動でJUnitsとコードカバレッジを追加することは、骨が折れるほどの手間と遅さです。
手動でのJUnitsの課題
- 適切で有用なJUnitsを手動で書くための時間集中的な活動。
- 標準化が欠如しているため、それぞれが異なるアプローチを取る。
- 時間の不足により不十分または不正確なJUnitsが作成される。
- コードの変更による既存JUnitsの手動同期は非現実的。
- レガシーコードのJUnitsを手動で書くことは悪夢である。
- 納期によりJUnitsが最優先事項ではなく、スキップされる。
- コード品質は大きく損なわれ、技術的負債が積み上がる。
解決策: JUnit-Mockito自動化
- GitHub
- 自動化はクラス名を取り込み、法的で作業可能なJUnitsを作成します。
- これらの生成されたJUnitsには必要なMockitoモックが含まれています。
- RestControllers、Services、Handlers、KafkaクラスなどのJUnitsを処理します。
- したがって、ほとんどのシナリオで70%以上のコードカバレッジを達成します。
自動化機能
- SpringBoot 2.xおよび3.xのMavenベースのアプリケーションに対応しています。
- ほぼゼロの設定作業。
- アプリケーションのローカルパスと非常に基本的なユーザー入力を取り込みます。
- Reflection utilsを利用してアプリケーションの構造詳細を推測します。
- 必要なMockbeansをスムーズに識別します。
- 自動的に“When-Then” Mockitoモックを生成します。
- Jacocoコードカバレッジレポートを生成します。
法的なJUnitの構造
- 必須部分: 3
- 対象のテストメソッドを呼び出す
- このクラスの外部とのインタラクションをモックする
- 実際の出力が期待されるアサート/検証と一致することを確認する
- 外部クラスをすべてMockBeansとして識別し宣言する
- これらのMockBeanインタラクションからの予想される応答をスタブする
- 基本的な法的な動作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作成により膨大な時間と労力を節約しています。
- これは直接的にプロジェクト費用の節約につながります。
- コードカバレッジは大幅に増加します。
- チームは本当の開発活動に完全に集中できます。
- JUnitは一貫して追加/維持され、ほぼ手作業なしで行われます。
- 技術的負債は大幅に削減されます。
- 本番環境にデプロイされるアプリケーションへの自信を大いに高めます。
Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1