20
  • Visual Studio 2012
  • SQLite 1.0.82.0(nugetから)

「テストエクスプローラー」で「すべて実行」コマンドを使用しようとしています。テストを1回実行すると、次のエラーが発生します。その後、Visual Studioを再起動するまで、テストはビルドされません。

これがビルドエラーです

別のプロセスによって使用されているため、プロセスはファイル'SQLite.Interop.dll'にアクセスできません

これがコードです

using System.Data.SQLite;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Test.Sqlite
{
    [TestClass]
    public class Test_Sqlite_Locking
    {
        [TestMethod]
        public void can_create_table()
        {
            using(var fact = new SQLiteFactory())            
            using (var conn = fact.CreateConnection())
            {
                conn.ConnectionString = "Data Source=:memory:;Version=3;New=True;";
                conn.Open();
                //conn.Close();                
            }

            //SQLiteConnection.ClearAllPools();
            //GC.Collect();
        }
    }
}

私は、接続を閉じ、ClearAllPools、GC.Collectを呼び出し、SQLiteConnectionを(ファクトリではなく)直接作成しようとしました...それでも同じ問題

これは、すべてのテストをデバッグする場合に機能します...しかし、テストを実行するだけで、これがロックされているように見えます。

4

8 に答える 8

32

私はVS2012でそのオプションを見つけることができませんでした(少なくとも標準の単体テストではありません)ので、別の解決策を思いつきました:

あなたが直面している問題は、単体テスト ランナーがロードされたままであるため、テストの繰り返し実行が高速になるという事実に起因しています。SQLite.Interop.dllおそらくあまり頻繁に変更されることはないので、CopyToOutputDirectoryオプションをPreserveNewestデフォルトではなくに変更しましたAlways

これを行うには、プロパティ (F4) ビューを開き、SQLite.Interop.dllソリューション内のファイルを選択します。これがおそらくまだロックアップするのは、新しいバージョンの SQLite にアップグレードして VS2012 を再起動すると、問題なく動作する場合だけです。

于 2012-12-02T11:42:29.173 に答える
13

影響を受けるテスト プロジェクトでビルド前のイベントとして次を使用することで、この問題を回避しました。

64 ビットの場合:

taskkill /F /IM vstest.executionengine.exe /FI "MEMUSAGE gt 1"

または 32 ビットの場合:

taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1"

これにより、テスト プロジェクトをビルドする前に実行エンジンが黙って強制終了されます。実行エンジンが実行されていない場合に、コマンド (したがって/FI "MEMUSAGE gt 1"ビルド) が失敗するのを防ぎます。

于 2013-02-03T21:41:26.417 に答える
8

これを試して:

  • VS.NET で、[ツール] \ [オプション] をクリックします。
  • ダイアログが表示されたら、[テスト ツール] をクリックします。
  • 「テスト実行」をクリック
  • 「テスト間でテスト実行エンジンを実行し続ける」ボックスのチェックを外します
  • [OK] をクリックして、VS.NET を再起動します。

再起動しなくても、SQLite ベースのテストを実行できるはずです。

于 2012-11-17T03:02:41.333 に答える
4

Visual Studio 2013 の場合 - [テスト] > [テストの設定] > [テスト実行エンジンを実行し続ける] に移動し、チェックを外します。私のために働きます。

于 2014-02-21T00:37:28.633 に答える
2

Philipp Aumayr によって提供された回避策(CopyToOutputDirectoryオプションをPreserveNewestデフォルトではなく に設定Always) はほとんどのシナリオで機能しますが、残念ながらすべてではありません。SO に関する他の質問が指摘しているように、vstest.executionengine終了しないという事実は VS2012 の一般的な問題です。さらに悪いことに、Microsoft の開発者はこれを機能として、また設計により扱います。この動作を防止するオプションは VS2010 に存在していましたが、VS2012 では削除されました。

この「改善」に問題がある場合は、Microsoft Connect サポートの問題vstest.executionengine.x86.exe (32 ビット) - 閉じていません(タイトルに関係なく、x86 と x64 の両方に影響します) に投票してください。

于 2013-01-08T10:24:49.973 に答える
2

この質問は古いことは知っていますが、私はこの問題を抱えており、ここでの回答のいくつかがアイデアを引き起こしました。SQLite を中心にユニット/統合テストをビルドしようとしたときに最初に遭遇した問題の 1 つは、MSTest (スクリプト ビルドに使用する) が、テストを実行する前に必要なすべての依存関係をテスト実行の "Out" ディレクトリに展開していないことでした。したがって、テストは失敗しました。この問題を解決するために私が見つけた最善の方法は、これらの属性をテスト クラスに追加することでした。

[TestClass]
**[DeploymentItem("System.Data.SQLite.dll")]
[DeploymentItem("x86\\SQLite.Interop.Dll")]**
public class TestClass

これにより、この問題も解決されるようです...これにより、VSTest がこれらの依存関係の別のコピーをロードして、VSBuild が通常の /bin/ ディレクトリ内のコピーを使用して実行できるようになると思います。

于 2015-06-22T15:38:42.713 に答える
0

また、データベースが正しいフォルダー
SQLite 接続文字列にインストールされていることを確認してください。

SQL Lite を使用して試してみたいデータ アダプター .NET で SQLitew を使用する

SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
builder.FailIfMissing = true;
builder.DataSource = "Insert the fully qualified path to your sqlite db";
SQLiteConnection connection = new SQLiteConnection(builder.ConnectionString);
try
{
  connection.Open();
}
catch(SqlException exp)
{
    // Log what you need from here.
    throw new InvalidOperationException("Whatever exception you want to throw", exp);
}

この記事を読んで、問題の修正にも役立つかどうかを確認してください System.Data.SQLite.View Ticket

于 2012-10-16T18:05:23.120 に答える