5

Excel をデータ ソースとして単体テストを実行しようとしています。次の例外が発生しています。どのように修正しますか?

単体テスト アダプターは、データ ソースへの接続またはデータの読み取りに失敗しました。このエラーのトラブルシューティングの詳細については、「データ ドリブン ユニット テストのトラブルシューティング」を参照してください。


  [TestMethod]
  [Owner("Lijo ")]
  [TestProperty("TestCategory", "Developer"), 
      DataSource("Microsoft.ACE.OLEDB.12.0", 
     "Data Source=C:/Sheets/DataSheet.xlsx;Extended Properties=Excel 12.0;",
     "[Sheet1$]", 
     DataAccessMethod.Sequential)]
  public void ChangePasswordTest()
  {

     int a = Convert.ToInt32(TestContext.DataRow[0]); //(int)Column.UserId
     int b = Convert.ToInt32(TestContext.DataRow[1]);
     int expectedResult = Convert.ToInt32(TestContext.DataRow[2]);

     MyClass myObj = new MyClass(1, "P@ssw0rd");
     int actualResult = myObj.GetAdditionResult(a, b);
     Assert.AreEqual<int>(expectedResult, actualResult, "The addition result is incorrect.");

  }

読書:

  1. 単体テスト エラー - 単体テスト アダプターがデータ ソースへの接続またはデータの読み取りに失敗しました

  2. データ駆動型単体テストの問題

  3. Visual Studio テスト プロジェクトのスタートアップ スクリプトとクリーンアップ スクリプトを作成する方法は?

  4. MSTEST/Visual Studio 2008 チーム テストは、テスト メソッドの実行順序をどのように決定しますか?

  5. Visual Studio 2010 Ultimate - 列のデータ生成プランが正しくないデータ型を設定する

  6. 単純な CRUD クラスを単体テストするにはどうすればよいですか?

4

3 に答える 3

5

今日、同じタスクをフェードアウトしました。そして、いくつかの頭痛の種の後、app.configなしで解決できました:

[TestMethod]
[DataSource("System.Data.OleDB",
  @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Sheets\DataSheet.xlsx; Extended Properties='Excel 12.0;HDR=yes';",
  "Sheet1$",
  DataAccessMethod.Sequential
)]       
public void ChangePasswordTest()
{
 //Arrange

 //Act

 //Assert

}

テストプロジェクトで Excel ファイルをリソースとして使用する場合は、ファイルの [出力ディレクトリにコピー] プロパティをCopy alwaysまたはに設定する必要がありますCopy if newer。そして、DeploymentItem属性をテストに追加します。

[TestMethod]
[DataSource("System.Data.OleDB",
  @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=.\DataSheet.xlsx; Extended Properties='Excel 12.0;HDR=yes';",
  "Sheet1$",
  DataAccessMethod.Sequential
)]       
[DeploymentItem(".\DataSheet.xlsx")]
public void ChangePasswordTest()
{
 //Arrange

 //Act

 //Assert

}
于 2013-03-23T17:41:13.643 に答える
4

別の方法で自分で解決しました。他の答えは大歓迎です。

参照:ウォークスルー:構成ファイルを使用したデータソースの定義 http://msdn.microsoft.com/en-us/library/ms243192.aspx

  [TestMethod]
  [DeploymentItem("C:/Sheets/DataSheet.xlsx")]
  [DataSource("MyExcelDataSource")]
  public void ChangePasswordTest()
  {

     int a = Convert.ToInt32(TestContext.DataRow[0]); //(int)Column.UserId
     int b = Convert.ToInt32(TestContext.DataRow[1]);
     int expectedResult = Convert.ToInt32(TestContext.DataRow[2]);

     MyClass myObj = new MyClass(1, "P@ssw0rd");
     int actualResult = myObj.GetAdditionResult(a, b);
     Assert.AreEqual<int>(expectedResult, actualResult, "The addition result is incorrect.");

  }

App.Config

<configuration>


<configSections>

<section name="microsoft.visualstudio.testtools" 
 type="Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>

 </configSections>



 <connectionStrings>

<add name="MyExcelConn" 
     connectionString="Dsn=Excel Files;dbq=C:/Sheets/DataSheet.xlsx;defaultdir=.; driverid=790;maxbuffersize=2048;pagetimeout=5" providerName="System.Data.Odbc" />

 </connectionStrings>


 <microsoft.visualstudio.testtools>


  <dataSources>

      <add name="MyExcelDataSource" 
      connectionString="MyExcelConn" 
      dataTableName="Sheet1$" 
      dataAccessMethod="Sequential"/>

  </dataSources>


</microsoft.visualstudio.testtools>

</configuration>

VS 2010の場合、使用されるTestToolsのバージョンはVersion=10.0.0.0です。

于 2012-05-21T12:55:09.320 に答える
3

質問と 100% 関係があるわけではなく、些細なことかもしれませんが、この一般的なトピックに 2 セントを投じたいと思います (これは、私が投稿できる最も関連性の高い質問でした)。

私が現在取り組んでいるプロジェクトでは、いくつかの単純なデータ駆動型単体テストを実行する必要があることに気づきました (たとえば、特定のテストでおそらく 20 行程度)。データ駆動型の「フレームワーク」に対する私のウィッシュ リストは次のとおりです。

  1. Visual Studio Test Explorer への優れた簡単な統合
  2. 既存のキーボード ショートカット キーを引き続き使用して、カーソルがあるテスト メソッドを実行/デバッグする機能
  3. 外部ファイルやデータベースを管理する必要はありません (つまり、「データソース」はありません)。
  4. C# および Visual Studio での「ネイティブ」サポート、つまり追加パッケージは不要

#4 の願いにもかかわらず、xUnit や NUnit などの外部ライブラリを調べました。彼らは 3 番目の願いを解決したように見えましたが、1 番目と 2 番目の願いはうまくいきませんでした。

簡単な解決策がないことに不満を感じたので、非常に基本的なデータ駆動型ヘルパーを自分で実装することにしました。

    public static void DataDrivenTest(Action<List<object>> testAction, List<List<object>> dataRows)
    {
        foreach (var dataRow in dataRows)
            testAction(dataRow);
    }

私はこのように使用します:

    [TestMethod]
    public void Unit_Can_Add_Two_Numbers()
    {
        UnitTestUtilities.DataDrivenTest(
            dataRow =>
            {
                // Tests a+b=c
                var a = (int)dataRow[0];
                var b = (int)dataRow[1];
                var c = (int)dataRow[2];
                Assert.AreEqual(a + b, c);
            },
            new List<List<object>>
                {
                    // Rows of arguments a,b,c respectively
                    new List<object>{1,2,3},
                    new List<object>{4,5,9}
                });
    }

上記の私の願いをすべて満たしていますが、欠点があります。

  1. テスト アクション定義内でキャストが必要です (おそらく、いくつかの一般的な引数マジックで修正できます)。
  2. データ行の引数の順序を更新すると、アクション メソッドのアクセサーも更新する必要があります。
  3. 明らかに大規模なデータ駆動型のテストには適していません (たとえば、このヘルパーは、たとえば 20 行を超えるテスト行では扱いにくくなります)。
  4. 明らかに「精巧さ」に欠けています。つまり、xUnit のようなライブラリには、これにはないファンキーな機能がいくつかあると確信しています。
  5. すべての行を 1 つの単体テストとして実行します (つまり、個別の単体テストとデータ行ごとのレポートはありません)。

とにかく、それは私の基本的な問題を簡単な方法で解決しました。私のように簡単な解決策を探している人に役立つことを願っています。結局のところ、メソッドをテストするために大量のテスト行が必要であることがわかった場合は、テスト対象の関数をより小さなコンポーネントに分解するリファクタリングを検討する価値があるかもしれません (その後、モック/フェイク、依存性注入などと組み合わせて使用​​します)。 )。

于 2014-05-01T14:31:17.600 に答える