.NET Tools

例外を思いのままに発生できる
「DevPartner Fault Simulator」レビュー

―― 面倒な異常ケース/例外処理のテストを強力サポート ――

株式会社ピーデー 川俣 晶
2006/06/10
Page1 Page2 Page3 Page4

プログラミングで厄介なもの、それは異常ケース

 筆者が.NET Frameworkベースで(主にC#による)プログラムを書き始めてから遭遇した思い出深いトラブルは2つある。

 その1つは、外部からの通信を処理する機能で発生した問題だった。通信を受け付けると、その通信を処理するスレッドを走らせる仕様だったのだが、どういうわけかスレッドの数が異常に増え、スレッド数の上限に達してそれ以上のリクエストを受け入れられない状態に陥ることがあったのだ。しかし、開発用の環境で問題を再現することができなかった。外部に公開された実運用サーバでのみ発生したのだ。

 そこで、.NET Frameworkのスレッドには名前を付けることができるという機能を生かし、スレッドが作成された日付時刻とその目的を記した名前をスレッドに付加する処理を追加した。そして、スレッドがあふれた実機上でMicrosoft CLRデバッガを起動し、問題のプロセスをアタッチしてスレッド一覧を調べてみた。その結果、問題の発生原因をかなり絞り込むことができ、その後の問題解決への大きな助けになった。

 しかし、このケースは、実運用サーバとはいえ、目の前で現象が起きる分だけマシといえる。本当に面倒なのは、そう簡単に起こらない、あるいは起こすことが困難な異常ケースへの対処である。もう1つの思い出深いトラブルはまさにそれに当たる。

 それは、ソフトが動作し続けることでログ・ファイルが肥大化し、ハードディスク容量が尽きるという問題だった。もちろんその対策は直ちに行ったのだが、その対策が正しく動作するという確認を行うのは非常に面倒なことだった。

 都合良く空き容量が尽きたハードディスクが手元にあるとは限らないし、巨大なファイルを書き込んで空き容量をゼロにしてしまうと、ほかのソフトの動作を阻害してしまう可能性もある。特に、OSが動作しているCドライブ1つきりで運用しているようなPCなら、そのCドライブの空き容量をゼロにするというのは、現実的に選択できない手段だろう。

 筆者の場合は、指定容量を残して残りを巨大ファイルで埋めてしまうツールを作成し、OSとは別のパーティションを対象としてテストを行って切り抜けたが、これは100%満足のいく対策とはいえない。必ず利用できる方法ではないし、ハードディスクの容量が尽きたという異常ケースには利用できるが、ほかの異常ケースには対処することができない。

 漠然と、このような問題に対処する手段はないだろうか……と思っていたところ、DevPartner Fault Simulator(以下Fault Simulator)というツールの存在を知った。このレビュー記事の執筆を即座に引き受けたのは「他人の問題ではない」という強い気持ちを感じたからである。

異常ケース再現シミュレータ「DevPartner Fault Simulator」

 Fault Simulatorの機能を一言でいえば、

異常ケースの再現シミュレータ

である。より具体的にいえば、.NET Frameworkの例外(.NET Frameworkフォールト)や、システム・レベルで発生する異常ケース(Fault Simulatorでは「環境フォールト」と呼ばれる)を、人為的に自由に発生させることができるツールである。

 しかも、それはテスト対象のプログラムの中でのみ発生させることができ、同時に実行中のほかのプログラムには影響しない。つまり、ハードディスクの空き容量を実際にゼロにせずに、テスト対象のプログラムに対してのみ空き容量がない状況を作り出せ、その状況でのプログラムの振る舞いをテストできるわけである。

 シミュレーション可能な例外は以下のとおり。.NET Frameworkフォールトとして.NET Frameworkクラス・ライブラリの主要名前空間に属するクラスのメソッドやプロパティなどの呼び出しにより発生する例外と、環境フォールトとしてCOM、ディスク入出力、メモリ、ネットワーク、レジストリのカテゴリをサポートする。

  • System
  • System.Collections
  • System.Collections.Specialized
  • System.Data
  • System.Data.Common
  • System.Data.SqlClient
  • System.IO
  • System.Net
  • System.Net.Sockets
  • System.Runtime.Remoting
  • System.Runtime.Remoting.Channels
  • System.Runtime.Remoting.Messaging
  • System.Runtime.Remoting.Proxies
  • System.Runtime.Remoting.Services
  • System.Text
シミュレーション可能な.NET Frameworkの例外が属する名前空間一覧
Fault Simulatorでは、ここに一覧した名前空間に属する例外を疑似的に発生させることができる。
 
COM(COM関数コールに対するコールの結果として生成される)
  • CLSIDを検出できない
  • DLLを検出できない
  • インターフェイスが登録されていない
  • ・ProgIDを検出できない
ディスク入出力(ファイルとディレクトリのアクセスに関連)
  • ファイルが壊れている
  • ディスクに十分な空き容量がない
  • DLLまたはアセンブリを検出できない
  • ファイルがロックされている
  • ディレクトリの読み取り権限がない
  • ファイルの読み取り権限がない
  • ディレクトリの書き込み権限がない
  • ファイルの書き込み権限がない
  • ディレクトリが見つからない
  • ファイルが見つからない
メモリ(メモリ管理の障害に関連)
  • ヒープ領域の割り当て制限
  • メモリ不足の通知
  • 仮想メモリの割り当て制限
ネットワーク(ネットワークの障害に関連)
  • 接続タイム・アウト
  • ネットワーク・オフライン
  • リモート・サーバがクラッシュ
  • サーバ使用不可
レジストリ(レジストリ・サービスを使用するメソッドまたは関数に関連)
  • 壊れたレジストリ値
  • 読み取り権限がない
  • 書き込み権限がない
  • キーが見つからない
  • 値が見つからない
シミュレーション可能な環境フォールト
これらの状況は、.NET以外のアプリケーション(例えば通常のEXEファイル)に対しても作り出すことができる。

 .NET Frameworkフォールトは当然.NET Frameworkアプリケーションに対してのみシミュレーションできるが、環境フォールトの方は.NET Framework以外のアプリケーション(ネイティブ・アプリケーションなど)に対してもシミュレーションすることができる。

 Fault Simulatorでシミュレーションを実行する方法は3つある。

 1つ目は、Visual Studio 2005(以下、VS 2005)またはVisual Studio .NET 2003に統合された操作環境で、例外を発生させたいソース・コード上での位置を示しつつ、対話的に条件を設定し、実行する方法。

 2つ目は、スタンドアロンで実行されるシミュレーション・ツールを用いて環境フォールトを発生させ、実行する方法。この場合、Visual Studioは必須ではない。

 最後は、コマンドラインより起動し、自動的に実行する方法。この方法を用いれば、あらかじめ用意した条件によるシミュレーションを実行するバッチ・ファイルを容易に作成でき、テストの自動化が可能になる。このように、対話的な使い方から完全な自動化までをカバーしていれば、現場レベルでの作業効率のアップに大きく貢献するだろう。

 では、これらの使い方の概要を以下に紹介していこう。

 

 INDEX
  [.NET Tools]
  例外を思いのままに発生できる「DevPartner Fault Simulator」レビュー 
  1.異常ケース再現シミュレータ「DevPartner Fault Simulator」
    2.簡単なシミュレーション操作(環境フォールト)
    3..NET Frameworkフォールトを試す
    4.スタンドアロン実行とコマンドラインからのテスト
 
インデックス・ページヘ  「.NET Tools」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間