私の過去のキャリアでは、一部の人々がテストコードを書いていないことがよくあり、彼らが書いていないと主張した理由は、複数の異なるモジュールをカバーするテストケースを簡単に書くことができないということでした。まあ、私は彼らのほとんどが、よりマスターしやすい技術的手段を欠いているか、それを理解する時間がないと思います。結局のところ、職場での進捗などのさまざまなプレッシャーが常にあります。テスト方法がわからないため、統合テストを無視することがよく、もたらされた問題は、ソフトウェア、ますます多くのバグ、より多くの失望した顧客を獲得しています。だから、統合テストの謎を明らかにするために、いくつかの個人的な経験を共有したいと思います。
スプリングベースのプロジェクトのテストをより適切に統合する方法<BR />ツールを使用:Spring、Junit、Mockito
一部の銀行Webサービスなど、一部の外部サービスを統合するこのような春のプロジェクトがあると想像してください。次に、このプロジェクトのテストケースを作成し、継続的な統合システムでこれらのテストを完了するときに発生した問題は、基本的に同じです。
1.各テストにはトランザクションがあり、各トランザクションには金銭的費用が必要であり、最終的には顧客が負担します。
2。テスト中に発行された過度の要求は、悪意のあるリクエストと見なされる場合があります。これにより、テストの失敗の結果、銀行の口座がブロックされる可能性があります。
3.非生産環境を使用してテストを実行する場合、テスト結果はあまり信頼できません。同様に、結果はテストが失敗したことです。
通常、単一のクラスをテストすると、コール用の外部サービスを仮想化できるため、問題は簡単に解決できます。しかし、巨大なビジネスプロセス全体をテストするときは、複数のコンポーネントをテストする必要があることを意味し、現時点では、これらのコンポーネントを管理のためにスプリングコンテナに組み込む必要があります。幸いなことに、Springには非常に優れたテストフレームワークが含まれており、生産環境構成ファイルから豆をテスト環境に注入できますが、外部サービスと呼ばれるものでは、自分で模擬実装を書く必要があります。普通の人々の最初の反応は、テストのセットアップ段階で春までに注入された豆を再注入(修正)することですが、この方法は慎重に考慮する必要があります。
警告:このように、テストコードはコンテナ自身の動作を破壊するため、実際の環境でのテストの結果と同じであるという保証はありません。
実際、最初に模擬クラスを実装してから、必要な豆に再注入する代わりに、Springを最初から模擬クラスを注入するのに役立ちます。コードでそれを示しましょう。
サンプルプロジェクトには、Bankserviceというクラスが含まれており、外部サービスへの呼び出しを表し、Bankserviceを呼び出すuserbalanceserviceと呼ばれるクラスが含まれています。 userbalanceserviceは、文字列からダブルタイプへのバランスの変換を完了するために、非常にシンプルに実装されています。
bankservice.javaのソースコード:
パブリックインターフェイスBankservice {String getBalanceByEmail(String Email);} bankserviceimpl.javaのソースコード:
パブリッククラスBankserviceImplはBankservice {@Override public string getBalanceByEmail(string email){new unsupportedoperationException( "操作が外部例外のために失敗しました"); }} userbalanceservice.javaのソースコード:
Interface userbalanceservice {double getAccountbalance(string email);} userbalancesserviceimpl.javaのソースコード:
パブリッククラスのuserbalanceserviceimpl explention userbalanceservice {@autowired private bankservice bankservice; @Override public double getAccountbalance(string email){return double.valueof(bankservice.getbalanceByemail(email)); }}次に、SpringのXML構成ファイルがあり、必要なBean宣言を追加します。
ApplicationContext.xmlのソースコード:
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id = "bankservice
これがテストクラスのソースコードですuserbalancesserviceimpltest.java:
@runwith(springjunit4classrunner.class)@contextconfiguration(locations = "classpath:/springtest/springockito/applicationcontext.xml")public class usersimplofiletest {@autowired private userbalanceservice usererservice; @Autowired Private Bankservice Bankservice; @test public void sexturnmockedbalance(){double balance = userbalanceservice.getaccountbalance( "[email protected]"); Assertequals(balance、double.valueof(123.45d)); }}予想どおり、テスト方法は、サポートされていないエクセプション例外を報告しています。現在の目的は、Bankserviceをシミュレーションの実装に置き換えることです。 Mockitoを直接使用して工場豆を生成しても構いませんが、より良いオプションがあり、Springockitoフレームワークを使用してください。継続する前に大まかなアイデアを得ることができます。
残りの質問は単純です。実際の豆の代わりにスプリングをシミュレートされた豆に注入する方法は、新しいXML構成ファイルを作成することを除いて、スプリング3.1の前に他の方法はありませんでした。しかし、SpringはBeanのプロファイル定義を導入して以来、よりエレガントなソリューションがありますが、このアプローチにはテスト用に特に追加のXML構成ファイルも必要です。以下は、テストに使用される構成ファイルtestApplicationContext.xmlのコードです。
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:mockito = "http://www.mockito.org/spring/mockito" xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.orgwork.org/schema/ http://www.mockito.org/spring/mockito https://bitbucket.org/kubek2k/springockito/tip/springockito/src/main/resources/spring/mockito.xsd "> <インポートresource = "classpath:/springtest/springockito/applicationcontext.xml"/> <beansプロファイル= "springtest"> <mockito:mock id = "bankservice"/> </beans> </beans>
対応する変更を行った後、テストクラスのuserbalancesserviceimplofiletest.javaのソースコード:
@runwith(springjunit4classrunner.class)@contextconfiguration(locations = "classpath:/springtest/springockito/testapplicationcontext.xml")@activeProfiles(profiles = {"springtest"})公開クラスユーザーユーザーユーザーユーザー{@avancestetethimethirimethirimetirimetirimetid @Autowired Private Bankservice Bankservice; @before public void setup()throws exception {mockito.when(bankservice.getbalanceByemail( "[email protected]"))。 } @test public void sexturnmockedbalance(){double balance = userbalanceservice.getaccountbalance( "[email protected]"); Assertequals(balance、double.valueof(123.45d)); }}セットアップ方法では、シミュレートされた動作を定義し、@Profileアノテーションをクラスに追加することに気付いた場合があります。この注釈は、SpringTestというプロファイルをアクティブにするため、Springockitoを使用してシミュレートされたBeanは、必要な場所に自動的に注入できます。 Springは、ApplicationContext.xmlで宣言されたバージョンではなく、Springockitoによってシミュレートされたバージョンを注入するため、このテストの実行結果が成功します。
引き続きテストを最適化します
この問題の解決策をさらに進めることができれば、この記事は欠陥がないようです。 Springockitoは別の名前を提供しています
Springockito Annotation Framework。これにより、テストクラスで注釈を使用して模擬クラスを注入できます。読み続ける前に、ウェブサイトに行って見てみる方が良いでしょう。 OK、これが修正されたテストコードです。
ユーザーバランスのソースコードサービスサービスサービスムプランノットテスト。Java:@runwith(springjunit4classrunner.class)@contextconfiguration(loader = springockitocontextloader.class、locations = "classpath:classpath:/springtest/springockito/applicatext.xmlプライベートユーザーバランスサービスユーザーバランスサービス。 @autowired @ReplaceWithMockプライベートバンクサービスバンクサービス。 @before public void setup()throws exception {mockito.when(bankservice.getbalanceByemail( "[email protected]"))。 } @test public void sexturnmockedbalance(){double balance = userbalanceservice.getaccountbalance( "[email protected]"); Assertequals(Balance、Valueof(123.45d)); }}ここに新しく導入されたXML構成ファイルはありませんが、正式な環境のApplicationContext.xmlが直接使用されていることに注意してください。 @ReplaceWithMock Annotationを使用して、型Bankserviceの豆をマークし、セットアップメソッドでモッククラスの動作を定義します。
ポストスクリプト
Springockito-Annotationsプロジェクトには大きな利点があります。つまり、依存関係のカバレッジに関するテストコードを構築するため、追加のXML構成ファイルを定義したり、テスト用の生産環境の構成ファイルを変更する必要はありません。 Springockito-Annotationsが使用されていない場合、追加のXML構成ファイルを定義する以外に選択肢はありません。したがって、統合テストでSpringockito-Annotationsを使用して、生産コードへのテストケースの影響を最小限に抑え、追加のXML構成ファイルを維持する負担を削除できるようにすることを強くお勧めします。
ポストスクリプト
春のプロジェクトの統合テストを作成するのは本当に簡単です。記事のコードは、私自身のgithubを指します。
翻訳リンク:http://www.codeceo.com/article/spring-test-is-easy.html
オリジナル英語:#1(春のフレームワーク)ができれば私をテストしてください
翻訳者:サンドボックスワン、コーディングネットワーク
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。