概要
MSTest で Excel ファイルをデータソースにする際に、いくつか引っかかったので備忘録としてTipsを残します。
前提条件
- OS : Windows 10
- Microsoft Visual Studio 2017 Community
MSTest について
MSTest は Visual Studio インストール時に付属してくるテストツールです。
詳細については、以下を参照
結論
実行時にエラーが発生する場合に、以下の設定状況を見直すことで、解決しました。
- 「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」のインストール
- テスト実行時のプロセッサ設定の見直し
[詳細] Excel をデータソースとしたデータドリブンテスト
下記のテストメソッドとテストデータを例に、必要な環境構築手順を説明します。
テストメソッド
[TestMethod]
[DeploymentItem(@"Data.xlsx")] // テスト入力データファイルを指定
[DataSource("System.Data.Odbc",
"Dsn=Excel Files;dbq=|DataDirectory|\\Data.xlsx",
"Sheet1$",
DataAccessMethod.Sequential)]
public void Test_ExeclDataSource()
{
var a = int.Parse(TestContext.DataRow["a"].ToString());
var b = int.Parse(TestContext.DataRow["b"].ToString());
var act = a + b;
var exp = int.Parse(TestContext.DataRow["c"].ToString());
Assert.AreEqual(act, exp);
}
テストデータ
以下のテーブルを持つ Data.xlsx を作成する。
a | b | c |
---|---|---|
1 | 2 | 3 |
2 | 4 | 6 |
3 | 5 | 8 |
環境構築
1. OBDC データソースの設定
上記のテストメソッド・テストデータを用いてテストを実行したときに、以下のエラーメッセージが発生する場合は OBDC データソースの設定を行う必要があります。
ERROR [IM002] [Microsoft][ODBC Driver Manager] データ ソース名および指定された既定のドライバーが見つかりません。
このケースでは、テストメソッドの DataSource で指定している以下の内容のが、ODBCデータ ソース に存在していないことを示しています。
- Dsn : Excel Files
この時点で、OBDC データ ソース アドミニストレータ を確認すると以下の通り、DNS「Excel Files」のドライバが存在しない旨記載されており、またドライバーそのものにも「Microsoft Excel Driver」が存在しないことが確認できます。
この状態の場合は、以下にアクセスしドライバ (Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント) のインストールを行うことで解決します。(32bit / 64bit から選択可能)
インストール後は、以下の通りDNS「Excel Files」のドライバが構成されていることが確認できます。
2. MSTest のプロセッサ アーキテクチャ設定
ここまでセットアップした上で、テストを実行した際に以下のエラーメッセージが発生する場合は、Visual Studio のメニューから「テスト」→「テスト設定」→「規定のプロセッサ アーキテクチャ」にてインストールしたドライバーのbitと合わせることで、エラーを解消することができます。
ERROR [IM014] [Microsoft][ODBC Driver Manager] 指定された DSN には、ドライバーとアプリケーションとのアーキテクチャの不一致が含まれています
3. テストデータの設定
この状態で、まだ以下のエラーが発生する場合はテストデータが適切な箇所に配置されていない場合があります。
下図に示す通り、テストデータに対してソリュ-ションエクスプローラより「出力ディレクトリにコピー」を「常にコピーする」に設定することで、テストプログラムからアクセス可能な位置にテストデータがコピーされます。
それでも解決しない場合は、ファイル名・拡張子・シート名等に誤りがないかを確認ください。
ERROR [42S02] [Microsoft][ODBC Excel Driver] オブジェクト 'Sheet1$' が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認してください。'Sheet1$' がローカル オブジェクトでない場合は、ネットワークの接続を確認するか、サーバー管理者に問い合わせてください。