[C#] MSTest で Excel をデータソースにしたテスト環境構築

# 概要

MSTest で Excel ファイルをデータソースにする際に、いくつか引っかかったので備忘録としてTipsを残します。

## 前提条件

* OS : Windows 10
* Microsoft Visual Studio 2017 Community

## MSTest について

MSTest は Visual Studio インストール時に付属してくるテストツールです。  
詳細については、以下を参照

https://learn.microsoft.com/ja-jp/dotnet/core/testing/unit-testing-with-mstest

## 結論

実行時にエラーが発生する場合に、以下の設定状況を見直すことで、解決しました。

* 「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」のインストール
* テスト実行時のプロセッサ設定の見直し

## [詳細] Excel をデータソースとしたデータドリブンテスト

下記のテストメソッドとテストデータを例に、必要な環境構築手順を説明します。

### テストメソッド

```csharp
        [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」が存在しないことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755356/2cb37533-db80-cae1-50e3-3208a2937ef3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755356/b949bd7f-b933-d475-52f7-d96807ccf2de.png)

この状態の場合は、以下にアクセスしドライバ (Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント) のインストールを行うことで解決します。(32bit / 64bit から選択可能)

https://www.microsoft.com/ja-jp/download/details.aspx?id=13255

インストール後は、以下の通りDNS「Excel Files」のドライバが構成されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755356/08f31278-5323-26f6-ed5e-a37a6ea17d85.png)

#### 2. MSTest のプロセッサ アーキテクチャ設定

ここまでセットアップした上で、テストを実行した際に以下のエラーメッセージが発生する場合は、Visual Studio のメニューから「テスト」→「テスト設定」→「規定のプロセッサ アーキテクチャ」にてインストールしたドライバーのbitと合わせることで、エラーを解消することができます。

```
ERROR [IM014] [Microsoft][ODBC Driver Manager] 指定された DSN には、ドライバーとアプリケーションとのアーキテクチャの不一致が含まれています
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755356/50d86e9e-12b7-8b21-499e-cacf86968fc2.png)

#### 3. テストデータの設定

この状態で、まだ以下のエラーが発生する場合はテストデータが適切な箇所に配置されていない場合があります。
下図に示す通り、テストデータに対してソリュ－ションエクスプローラより「出力ディレクトリにコピー」を「**常にコピーする**」に設定することで、テストプログラムからアクセス可能な位置にテストデータがコピーされます。
それでも解決しない場合は、ファイル名・拡張子・シート名等に誤りがないかを確認ください。

```
ERROR [42S02] [Microsoft][ODBC Excel Driver] オブジェクト 'Sheet1$' が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認してください。'Sheet1$' がローカル オブジェクトでない場合は、ネットワークの接続を確認するか、サーバー管理者に問い合わせてください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755356/01974141-a86e-aa58-2a2a-8d2e21aa1d53.png)