バンクネクスト事例研究:Jユニット・モッキト・オートメーション

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. RestControllers、Services、Handlers、KafkaクラスなどのJUnitsを処理します。
  5. したがって、ほとんどのシナリオで70%以上のコードカバレッジを達成します。

自動化機能

  1. SpringBoot 2.xおよび3.xのMavenベースのアプリケーションに対応しています。
  2. ほぼゼロの設定作業。
  3. アプリケーションのローカルパスと非常に基本的なユーザー入力を取り込みます。
  4. Reflection utilsを利用してアプリケーションの構造詳細を推測します。
  5. 必要なMockbeansをスムーズに識別します。
  6. 自動的に“When-Then” Mockitoモックを生成します。
  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. JUnitは一貫して追加/維持され、ほぼ手作業なしで行われます。
  6. 技術的負債は大幅に削減されます。
  7. 本番環境にデプロイされるアプリケーションへの自信を大いに高めます。

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