2

データベースに対していくつかの統合テストを実行しています。シード データを使用してデータベースをセットアップし、テストを実行してから、テストごとにデータベースを削除したい (したがって、各テストには新しいスレートがあります)。私は現在、これらのセットアップ/ティアダウン方法を使用してそれを行っています:

private ProjectDbContext db;

[TestInitialize]
public void SetUp()
{
    db = new ProjectDbContext("TestConnection");
    (new SeedData()).Run(db); //Seed Data
}

[TestCleanup]
public void Teardown()
{
    db.Database.Delete();
    db.Dispose();
}

私の問題は、テストごとに 0.5 秒強かかることです。パフォーマンスを向上させたいと考えています。何かご意見は?誰でもより良い戦略を持っていますか?

4

2 に答える 2

0

あなたのコードによると、テストのためにデータベースに挿入したデータを削除したいということを理解しています。ちょっと違う方法でやってみましたが参考になれば幸いです。データを手動で削除する代わりに、TransactionScopeを使用できます。コードの画像アプローチの詳細については、こちらTestMethod での TransactionScope の使用 も参照してください。

于 2013-06-11T01:13:04.800 に答える
0

次のようなことができます:

public static void ClearDatabase(DbContext context)
{
    var objectContext = ((IObjectContextAdapter)context).ObjectContext;
    var entities = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace).BaseEntitySets;
    var method = objectContext.GetType().GetMethods().First(x => x.Name == "CreateObjectSet");
    var objectSets = entities.Select(x => method.MakeGenericMethod(Type.GetType(x.ElementType.FullName))).Select(x => x.Invoke(objectContext, null));
    var tableNames = objectSets.Select(objectSet => (objectSet.GetType().GetProperty("EntitySet").GetValue(objectSet, null) as EntitySet).Name).ToList();

    foreach (var tableName in tableNames)
    {
        context.Database.ExecuteSqlCommand(string.Format("DELETE FROM {0}", tableName));
    }

    context.SaveChanges();
}

制約がなく、ID 列をテスト用に特定の方法で設定することが重要な場合 (これはお勧めしません)、DELETE FROM の代わりに TRUNCATE を使用できます。

(ここから削除するためのコード。)

于 2013-03-24T03:24:25.343 に答える