質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

4回答

1636閲覧

独自例外クラスのMSTest

nobureon2

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2019/11/05 03:32

実現したいこと

MStestを利用して、例外処理(※)のテストコード実装方法を知りたいです。
今のところの案では、デバッグビルド時だけ有効となるテストコードをテスト対象のメソッドに埋め込むということを考えていますが、可能であれば、テストコードだけで実装したいと考えています。
アドバイスよろしくお願いいたします。
※Exceptionクラスを継承し、独自のエラーコードを上位に発砲。最終的には、ログに出力。

C#

1// テスト対象 2private static void MethodA() 3{ 4 try 5 { 6 // 現状の案は、ここにデバッグビルド時だけ実行する例外発生コードを書く 7 8 // 処理 9 } 10 catch (XXXXXException) 11 { 12 throw; 13 } 14 catch (Exception ex) 15 { 16 // 一意となるエラーコードを指定 17 // ここのテストコードを書きたい。 18 throw new XXXXXException(); 19 } 20 finally 21 { 22 } 23} 24

開発環境

.NET Framework 4.5.1
Visual Studio 2017 プロフェッショナル

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2019/11/05 03:43

例外が起こる操作をしたときに例外がちゃんと発生するかを見たいんですよね? 普通ならそれをそのままテストコードに書けばいいと思うんですができない理由は何でしょう?
nobureon2

2019/11/05 04:35

はい、そうですね。 アプリケーションエラーが発生しないよう、全てのメソッドをtry~catchで囲んでいます。 なので、テストコード側で例外を発生されるのが難しいです。
ozwk

2019/11/05 05:02

よく見たらテスト対象と書かれたメソッドがprivateなんですけど これを呼んでいるメソッドをテストしているんですか? で、その呼んでいる側で例外をcatchしてなにかして再スローはしてない感じですか?
nobureon2

2019/11/05 05:40

例であげたのはprivateですが、publicのものもあります。 privateのものは以下の方法でユニットテストをしています。 https://www.gesource.jp/weblog/?p=7742 呼び物はスローするだけですね。 スローした例外はトップハンドラでcatchして処理する(ログ出力等)かたちです。
guest

回答4

0

普通は例外を生成するためのモックを作ってテストすると思うけど、その対象のメソッドがモックで処理を差し替えられる事が前提になるので、IoC(Inversion of Control)とか勉強されると良いんじゃないでしょうか。

投稿2019/11/05 04:01

編集2019/11/05 20:18
gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobureon2

2019/11/05 05:46

そうですね。 上にも記載したのですが、全てのメソッドをtry~catchで囲んで例外処理を実装しているので、 処理にかかわらず、テストコード側で例外を発生させる方法があれば知りたいという意味です。
gentaro

2019/11/05 06:42

あー失礼。これがテスト対象のコードか。 まぁテストする方法は回答欄に書いたとおりなんで、調べてみてください。
gentaro

2019/11/05 06:45

簡単に言えば ・モックを使う ・IoCで制御を逆転する(依存性を外部から注入できるようにする) でお望みのテストは可能です。 ググればサンプル含めて色々わかるはずなので、一から十までは説明しません。(ここのサイトの趣旨にも合わないので)
guest

0

ベストアンサー

こんにちは。

全てのメソッドをtry~catchで囲んでいます。

と言っている以上は、全ての例外発生パスを自身が管理していることを意味するため、単に「そのメソッドを実行した際に例外が起きる状態を根本的に再現してテストする」以外の手は無いです。

ロジック側に「テストを行うためだけのコード」を追加するのは基本的に論外です。それは「テスト可能な設計」によって実現するべきものです。

gentaro さんが回答で suggest しているように、IoC を念頭に置いた設計にすることでテスト可能な構造にすることができます。

現状のように、意図的に例外を出すことが不可能と思えるロジックにおける例外パスは、そもそも「テスト不能」な状態にあると考えて下さい。

投稿2019/11/05 07:23

tamoto

総合スコア4110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

結果的にデバッグビルド時だけ有効となるテストコードをテスト対象のメソッドに埋め込むことで対応しました。tamotoさんの回答通り、テスト不能なコードであると結論に至ったのでベストアンサーとしました。

gentaroさん、Zuishinさんも回答いただきありがとうございました。
今後の参考にさせていただきます。

投稿2019/11/06 11:07

nobureon2

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/11/06 11:12

参考にするにはまずこのコードの意味がわからなくてはいけませんね。 テスト不能ではありません。
nobureon2

2019/11/07 00:37

MethodAのcatch (Exception ex)以下をMethodBでメソッド抽出することでテスト可能とするという意味だと思ったのですが、合っていますか?
Zuishin

2019/11/07 00:43 編集

例外オブジェクトは生成しただけではコードの進行を止めません。 throw する前にそれを検査すればいいだけの話です。 私の回答はそれを説明していますが、読み取れているように見えないので書きました。
nobureon2

2019/11/07 01:03

理解しました。 ただ、Exceptionで補足した例外を検査したいわけではなく、 Exception内でthrowするXXXXXExceptionのテストを実施したかったです。 自分の質問が分かりずらかったようですみません。
Zuishin

2019/11/07 01:05

だから、throw する例外を throw する前に検査できるという回答です。
guest

0

次のようにして MethodB をテストすれば良いのではないでしょうか。

C#

1private static XXXXXException MethodB(Exception ex) 2{ 3 if (例外が起こる条件) 4 { 5 return new XXXXException(); 6 } 7 else 8 { 9 return null; 10 } 11} 12 13// テスト対象 14private static void MethodA() 15{ 16 try 17 { 18 // 処理 19 } 20 catch (XXXXXException) 21 { 22 throw; 23 } 24 catch (Exception ex) 25 { 26 var xxxxxException = MethodB(ex); 27 if (xxxxxException != null) 28 { 29 throw xxxxxException; 30 } 31 } 32 finally 33 { 34 } 35}

投稿2019/11/05 21:26

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問