Skip to content

[Web] Test case design of ExceptionHandling

atsushi yoshikawa edited this page Jul 21, 2017 · 10 revisions

terasoluna-gfw-web/ExceptionHandling

org.terasoluna.gfw.common.exception、org.terasoluna.gfw.web.exceptionパッケージのテスト

例外ハンドリングテスト

テストケースクラス:

1. リクエスト単位、Controllerクラスがハンドリングする場合

項番 観点 試験項目 試験条件 確認内容
1.1
40X系
BusinessException

Serviceで発生したBusinessExceptionをControllerでtry catchを行い、
WARNLogが出力されていることの確認を行うテスト
  • ResultMessagesLoggingInterceptorをServiceクラスにAOPを設定する。
  • ServiceクラスでBusinessExceptionをスローする。(メッセージは固定値)
  • Controllerで例外をキャッチし、遷移先を指定する。
  • ログにWARNレベルのログが出力されていること。
  • 指定されたメッセージが出力されること。
  • 出力されたログフォーマットが、[errorcode] メッセージ の形式であること。
  • MessagesPanelTagでメッセージが出力されていること。 ※ 1
1.2
40X系
BusinessException

ResultMessagesLoggingInterceptorの拡張テスト
カスタムResultMessagesLoggingInterceptorを作成し、出力されるログのレベルを変更できること。
  • カスタムResultMessagesLoggingInterceptorでは、logResultMessagesNotificationExceptionをオーバライドし
  • Logger.infoでログの出力を行う。
  • ServiceクラスでBusinessExceptionをスローする。(メッセージはコード指定)
  • ログにINFOレベルのログが出力されていること。

※ 1 基本全ての試験で確認 ※ ログの確認は、DBに出力内容を登録し、アサーションする。


2. ユースケース単位、Controllerクラスでハンドリングする場合

項番 観点 試験項目 試験条件 確認内容
2.1
10X系
試験用の独自例外

HandlerExceptionResolverLoggingInterceptorのログが出力されることの確認のテスト
ステータスコードが100の場合、INFOログが出力されることのテスト
  • Serviceクラスで例外をスローする。(メッセージはコード定義、スローする例外は任意)
  • @ExceptionHandlerで上記例外を設定
  • @ResponseStatus(HttpStatus.CONTINUE)を指定
  • 例外ハンドリングメソッドで遷移先を指定
  • ログにINFOレベルのログが出力されていること。
  • 指定されたメッセージが出力されること。
2.2
20X系
試験用の独自例外

HandlerExceptionResolverLoggingInterceptorのログが出力されることの確認のテスト
ステータスコードが200の場合、INFOログが出力されることのテスト
  • Serviceクラスで例外をスローする。(メッセージはコード定義、スローする例外は任意)
  • @ExceptionHandlerで上記例外を設定
  • @ResponseStatus(HttpServletResponse.SC_OK)を指定
  • 例外ハンドリングメソッドで遷移先を指定
  • ログにINFOレベルのログが出力されていること。
  • 指定されたメッセージが出力されること。
2.3
30X系
試験用の独自例外

HandlerExceptionResolverLoggingInterceptorのログが出力されることの確認のテスト
ステータスコードが300の場合、INFOログが出力されることのテスト
  • Serviceクラスで例外をスローする。(メッセージはコード定義、スローする例外は任意)
  • @ExceptionHandlerで上記例外を設定
  • @ResponseStatus(HttpServletResponse.SC_MULTIPLE_CHOICES)を指定
  • 例外ハンドリングメソッドで遷移先を指定
  • ログにINFOレベルのログが出力されていること。
  • 指定されたメッセージが出力されること。
2.4
40X系
OptimisticLockingFailureException

HandlerExceptionResolverLoggingInterceptorのログが出力されることの確認のテスト
ステータスコードが409の場合、WARNログが出力されることのテスト
  • Serviceクラスで例外をスローする。(メッセージはコード定義、スローする例外はOptimisticLockingFailureException)
  • @ExceptionHandlerで上記例外を設定
  • @ResponseStatus(HttpServletResponse.SC_CONFLICT)を指定
  • 例外ハンドリングメソッドで遷移先を指定
  • ログにWARNレベルのログが出力されていること。
  • 指定されたメッセージが出力されること。
2.5
40X系
PessimisticLockingFailureException

HandlerExceptionResolverLoggingInterceptorのignoreExceptionsに指定された
例外の場合、ログが出力されないことの確認テスト
  • Serviceクラスで例外をスローする。(メッセージはコード定義、スローする例外はPessimisticLockingFailureException)
  • @ExceptionHandlerで上記例外をハンドリング
  • 例外ハンドリングメソッドで遷移先を指定
  • HandlerExceptionResolverLoggingInterceptorのignoreExceptionsに上記例外を指定
  • ログに出力されていないこと。

3. サーブレット単位でフレームワークがハンドリングする場合

項番 観点 試験項目 試験条件 確認内容
3.1
50X系
SystemException

SystemExceptionへのエラーコード指定に係らず、レスポンスコードによりログレベルが決定することの確認のテスト
SystemExceptionResolverを用いた例外ハンドリングのテスト(SystemExceptionのメッセージ指定)
  • ServiceクラスでSystemExceptionにメッセージコード("i.xx.xxx")、メッセージを指定し、スローする。
  • SystemExceptionResolverにdefaultErrorView、defaultStatusCode("500")が指定されていること
  • SystemExceptionResolverのdefaultErrorViewのシステムエラー画面に遷移すること
  • defaultStatusCodeがレスポンスコードとして返却されていること
  • SystemExceptionに設定したエラーコードをシステムエラー画面に引き継げていること(リクエストパラメータ)
  • SystemExceptionに設定したエラーコードをシステムエラー画面に引き継げていること(HTTPヘッダ)
  • ログにERRORレベルのログが出力されていること。
3.2
50X系
SystemException

SystemExceptionへのエラーコード指定に係らず、レスポンスコードによりログレベルが決定することの確認のテスト
SystemExceptionResolverを用いた例外ハンドリングのテスト(SystemExceptionのThrowableクラスを指定)
  • ServiceクラスでSystemExceptionにメッセージコード("w.xx.xxx")、Throwableクラスを指定し、スローする。
  • SystemExceptionResolverにdefaultErrorView、defaultStatusCode("500")が指定されていること
  • SystemExceptionResolverのdefaultErrorViewのシステムエラー画面に遷移すること
  • defaultStatusCodeがレスポンスコードとして返却されていること
  • SystemExceptionに設定したエラーコードをシステムエラー画面に引き継げていること
  • ログにERRORレベルのログが出力されていること。
3.3
50X系
SystemException

SystemExceptionへのエラーコード指定に係らず、レスポンスコードによりログレベルが決定することの確認のテスト
SystemExceptionResolverを用いた例外ハンドリングのテスト(SystemExceptionのメッセージ指定、Throwableクラスを指定)
  • ServiceクラスでSystemExceptionにメッセージコード("e.xx.xxx")、メッセージ、Throwableクラスを指定し、スローする。
  • SystemExceptionResolverにdefaultErrorView、defaultStatusCode("400")が指定されていること
  • SystemExceptionResolverのdefaultErrorViewのシステムエラー画面に遷移すること
  • defaultStatusCodeがレスポンスコードとして返却されていること
  • SystemExceptionに設定したエラーコードをシステムエラー画面に引き継げていること
  • ログにWARNレベルのログが出力されていること。
3.4
50X系
SystemException

SystemExceptionResolverを用いた例外ハンドリングで、リダイレクト後の例外メッセージの引き継ぎのテスト
  • ServiceクラスでSystemExceptionにメッセージコード、メッセージ、Throwableクラスを指定し、スローする。
  • SystemExceptionResolverにdefaultErrorView、defaultStatusCodeが指定されていること
  • SystemExceptionに設定したエラーコードをリダイレクト後のシステムエラー画面に引き継げていること
  • ログにERRORレベルのログが出力されていること。
3.5
50X系
ResultMessagesNotificationExceptionを実装した独自Exception

ResultMessagesNotificationExceptionの実装クラスで、ResultMessagesを指定した場合の、
エラー画面への引継ぎのテスト
SystemExceptionResolverを用いた例外ハンドリングのテスト
  • ServiceクラスでResultMessagesNotificationExceptionを実装したクラスをスローする
  • SystemExceptionResolverにdefaultErrorView、defaultStatusCodeが指定されていること
  • SystemExceptionResolverのdefaultErrorViewのシステムエラー画面に遷移すること
  • defaultStatusCodeがレスポンスコードとして返却されていること
  • 独自例外クラスに指定した、ResultMessagesをシステムエラー画面に引き継げていること
  • ログにWARNレベルのログが出力されていること。
3.6
50X系
ResultMessagesNotificationExceptionを実装した独自Exception

SystemExceptionResolverの拡張テスト resultMessagesAttributeにnullを指定する場合のテスト
  • ServiceクラスでResultMessagesNotificationExceptionを実装したクラスをスローする
  • SystemExceptionResolverにdefaultErrorView、defaultStatusCodeが指定されていること
  • resultMessagesAttribute属性にnullを指定する
  • SystemExceptionResolverのdefaultErrorViewのシステムエラー画面に遷移すること
  • defaultStatusCodeがレスポンスコードとして返却されていること
  • 独自例外クラスに指定した、ResultMessagesをシステムエラー画面に引き継げていないこと
  • ログにWARNレベルのログが出力されていること。
3.7
40X系
ResourceNotFoundException

ResourceNotFoundExceptionがスローされた場合の例外ハンドリングのテスト
SystemExceptionResolverの拡張テストexceptionMappingsの設定、exceptionCodeResolverの設定確認
  • ServiceクラスでResourceNotFoundExceptionをスローする
  • SystemExceptionResolverのexceptionMappingsに keyに上記例外 + value="common/error/resourceNotFoundError" を指定する
  • SystemExceptionResolverのstatusCodesに key="common/error/resourceNotFoundError" + value="404" を指定する
  • exceptionCodeResolverのexceptionMappingsにResourceNotFoundException + value="w.xx.0001" を指定する
  • exceptionMappingsで指定したresourceNotFoundErrorに遷移すること
  • レスポンスコード 404が返却されていること
  • エラーコードをresourceNotFoundError画面に引き継げていること
  • ログにWARNレベルのログが出力されていること。
  • ログが重複していないこと。(Service層のAOPとアプリケーション層のAOPで重複して出力していない)
3.8
50X系
DataAccessException

SystemExceptionResolverの拡張テスト defaultStatusCode、defaultErrorViewの設定確認
  • ServiceクラスでQueryTimeoutExceptionをスローする
  • SystemExceptionResolverのexceptionMappingsに keyに上記例外を指定しない
  • exceptionCodeResolverのdefaultExceptionCodeに "e.xx.9999" を指定する
  • defaultErrorView、defaultStatusCodeを指定する。
  • exceptionMappingsで指定したdefaultErrorViewの値に遷移すること
  • レスポンスコード にdefaultStatusCodeの値が返却されていること
  • エラーコードをデフォルトエラー画面に引き継げていること
  • ログにERRORレベルのログが出力されていること。
3.9
50X系
SystemException

SystemExceptionResolverの拡張テスト exceptionCodeAttribute、exceptionCodeHeaderの設定確認
  • ServiceクラスでSystemExceptionにメッセージコード、メッセージを指定し、スローする
  • SystemExceptionResolverにdefaultErrorView、defaultStatusCodeが指定されていること
  • exceptionCodeAttribute="errorCode"、exceptionCodeHeader="X-Error-Code" に設定する
  • SystemExceptionResolverのdefaultErrorViewのシステムエラー画面に遷移すること
  • defaultStatusCodeがレスポンスコードとして返却されていること
  • SystemExceptionに設定したエラーコードをシステムエラー画面に引き継げていること(リクエストパラメータ)
  • SystemExceptionに設定したエラーコードをシステムエラー画面に引き継げていること(HTTPヘッダ)
  • ログにERRORレベルのログが出力されていること。
3.10
40X系
InvalidTransactionTokenException

共通ライブラリの、TransactionTokenの例外ハンドリングテスト
SystemExceptionResolverを用いた例外ハンドリングのテスト
  • TransactionTokenの例外を発生させる
  • SystemExceptionResolverのexceptionMappingsに InvalidTransactionTokenException + value="common/error/tokenError" を指定する
  • SystemExceptionResolverのstatusCodesに key="common/error/tokenErrorr" + value="409" を指定する
  • exceptionCodeResolverのexceptionMappingsにInvalidTransactionTokenException + value="i.xx.0010" を指定する
  • exceptionMappingsで指定したresourceNotFoundErrorに遷移すること
  • レスポンスコード 409が返却されていること
  • エラーコードをtokenError画面に引き継げていること
  • ログにWARNレベルのログが出力されていること。

4. Webアプリケーション単位でサーブレットコンテナがハンドリングする場合

項番 観点 試験項目 試験条件 確認内容
4.1
50X系
JspTagException

ServletContainerによる例外ハンドリング
View層でエラーが発生した際に<error-page>に指定したパスに遷移するテスト
  • TagLibraryでJspTagExceptionをスローする
  • web.xmlの<error-page>のexception-typeに、javax.servlet.ServletExceptionを指定、locationに/WEB-INF/views/common/error/servletError.jspを指定する
  • error-pageに指定した、画面に遷移すること
  • ログにERRORレベルのログが出力されていること
4.2
50X系
ServletException(java.lang.Errorのサブクラス)

致命的エラー発生時のServletContainerによる例外ハンドリング
ServiceクラスでAssertionErrorが発生した際に<error-page>に指定したパスに遷移するテスト
  • ServiceでAssertionErrorを発生させる
  • spring-mvc.xmlのSystemExceptionResolverのpropertyに name="excludedExceptions"、value="org.springframework.web.util.NestedServletException"を指定する
  • web.xmlの<error-page>のexception-typeに、javax.servlet.ServletExceptionを指定、locationに/WEB-INF/views/common/error/servletError.jspを指定する
  • SystemExceptionResolverでハンドリングされないこと
  • error-pageに指定した、画面に遷移すること
  • ログにERRORレベルのログが出力されていること
4.3
50X系
IndexOutOfBoundsException

ServletContainerによる例外ハンドリング
ExceptionLevelResolverとの連携確認のテスト
  • FilterでIndexOutOfBoundsExceptionをスローする
  • web.xmlの<error-page>のexception-typeに、java.lang.Exceptionを指定、locationに/WEB-INF/views/common/error/unhandledSystemError.htmlを指定する
  • exceptionCodeResolverのexceptionMappingsにIndexOutOfBoundsException value="w.xx.0011" を指定する
  • error-pageに指定した、画面に遷移すること
  • ログにERRORレベルのログが出力されていること
4.4
50X系
IOException

ServletContainerによる例外ハンドリング
Filterでエラーが発生した際に<error-page>に指定したパスに遷移するテスト
  • TagLibraryでIOExceptionをスローする
  • web.xmlの<error-page>のexception-typeに、java.lang.Exceptionを指定、locationに/WEB-INF/views/common/error/unhandledSystemError.htmlを指定する
  • error-pageに指定した、画面に遷移すること
  • ログにERRORレベルのログが出力されていること

5. ExceptionLoggerバリエーションテスト

項番 観点 試験項目 試験条件 確認内容
5.1
40X系
試験用の独自例外

カスタムExceptionLevelResolverでのPrefixによるログレベルの出力テスト(ExceptionLoggingFilter)
  • ExceptionLevelResolverを実装したカスタムクラスを作成(n=INFO、a=WARN、d=Error)
  • Taglib内で例外をスローする。(メッセージはコード定義(n.cc.0000)、スローする例外は任意)
  • ExceptionLoggingFilterを、例外コードでログレベルを判定するように拡張する。
  • ログにINFOレベルのログが出力されていること。
5.2
40X系
試験用の独自例外

カスタムExceptionLevelResolverでのPrefixによるログレベルの出力テスト(ExceptionLoggingFilter)
  • ExceptionLevelResolverを実装したカスタムクラスを作成(n=INFO、a=WARN、d=Error)
  • Taglib内で例外をスローする。(メッセージはコード定義(a.cc.0000)、スローする例外は任意)
  • ExceptionLoggingFilterを、例外コードでログレベルを判定するように拡張する。
  • ログにWARNレベルのログが出力されていること。
5.3
40X系
試験用の独自例外

カスタムExceptionLevelResolverでのPrefixによるログレベルの出力テスト(ExceptionLoggingFilter)
  • ExceptionLevelResolverを実装したカスタムクラスを作成(n=INFO、a=WARN、d=Error)
  • Taglib内で例外をスローする。(メッセージはコード定義(d.cc.0000)、スローする例外は任意)
  • ExceptionLoggingFilterを、例外コードでログレベルを判定するように拡張する。
  • ログにERRORレベルのログが出力されていること。
5.4
40X系
試験用の独自例外

defaultCode、defaultMessageの差し替えのテスト(HandlerExceptionResolverLoggingInterceptor)
  • ExceptionLoggerのプロパティにdefaultCode="e.00.9999"、defaultMessage="DEFAULT ERROR"を指定する
  • Serviceクラスで独自例外をスローする。
  • ログのメッセージに、[e.00.9999] DEFAULT ERROR が出力されていること
  • ログにERRORレベルのログが出力されていること。
5.5
40X系
試験用の独自例外

trimLogMessageの無効化、logMessageFormatの差し替えのテスト(HandlerExceptionResolverLoggingInterceptor)
  • ExceptionLoggerのプロパティにtrimLogMessage=false、logMessageFormat="[{0}][{1}]" を指定する
  • Serviceクラスで独自例外をスローする。(メッセージはコード定義(e.xx.9999)、メッセージは"5_5 Error "(末尾に半角スペースを付与)、スローする例外は任意。)対象の例外ハンドリング時に、レスポンスコード"300"を設定する。
  • ログのメッセージに、[e.xx.9999][5_5 Error ] が出力されていること
  • ログにINFOレベルのログが出力されていること。
5.6
40X系
試験用の独自例外

カスタムExceptionCodeResolverでのエラーコードの紐付けが可能であることのテスト(HandlerExceptionResolverLoggingInterceptor)
  • 例外 + メッセージでエラーコードを解決する、カスタムExceptionCodeResolverを実装し、
  • ExceptionCodeResolverにカスタムExceptionCodeResolverを指定する。
  • exceptionCodeResolverのexceptionMappingsに "上記例外+メッセージ" value="w.xx.0001" を指定する
  • ログのメッセージに、[w.xx.0001] 5_6 Error が出力されていること
  • ログにERRORレベルのログが出力されていること。

6. SharedServiceで例外発生した場合

項番 観点 試験項目 試験条件 確認内容
6.1
40X系
BusinessException

Serviceの中でSharedServiceを呼び出して、SharedService内でBusinessExceptionをthrowして、 Serviceがそのままthrowした場合、ログが1回だけ出力されていることを確認するテスト
  • ServiceクラスからSharedServiceクラスを呼び出す
  • Serviceクラスで例外をスローする。(メッセージはコード定義)
  • ログにWARNレベルのログが出力されていること。
6.2
40X系
BusinessException

Serviceの中でSharedServiceを呼び出して、SharedService内でBusinessExceptionをthrowして、 Serviceがcatchした場合、ログが出力されていないことを確認するテスト
  • ServiceクラスからSharedServiceクラスを呼び出す
  • Serviceクラスで例外をキャッチする。(メッセージはコード定義)
  • ログにログが出力されていないこと。