2

私たちのソリューションには 2 つの異なるデータベース プロバイダーがあり、どちらも別々のプロジェクトに配置されています。IDbProviderどちらもコア プロジェクトにあるコモンを継承します。

namespace OurApp.Data
{
    public interface IDbProvider
    {
       // truncated
    }
}
namespace OurApp.Data.SqlServer
{
    public class DbProvider : IDbProvider {}
}
namespace OurApp.Data.Sqlite
{
    public class DbProvider : IDbProvider {}
}

データベースは機能的に同一である必要があり、SqlServer.DbProvider.

現在、すべての RepositoryTests は基本クラスから継承されます。

public abstract class RepositoryTestsBase
{
    protected IDbConnectionProvider Connection;
    protected IDbProvider DbProvider;

    [SetUp]
    public void Setup()
    {
        // Need to create a new connection to the server and make sure there is no database
        ConnectionStringSettings dbConnection = ConfigurationManager.ConnectionStrings["databaseConnection"];
        string testDatabaseName = ConfigurationManager.AppSettings["databaseName"];

        Connection = new DbConnectionProvider(dbConnection.ConnectionString, dbConnection.ProviderName);
        DbProvider = new DbProvider(Connection, testDatabaseName);
    }

DbProvider を変更するためだけにすべての統合テストを+ / +しなければならないのは本当に嫌です。CTRLCCTRLV

実行ごとに異なる DbProvider を注入するだけで、すべての統合テストを 2 回実行する方法はありますか? Powershell ビルドだけでなく、IDE でもこれを (明らかに) 実行できるようにしたいと考えています。

私の最初の考えは、2 つのパブリック メソッドと 1 つのプライベート メソッドを作成し、適切な db プロバイダーを注入することです。

[Test]
public void ShouldDoStuff_SQLServer() {
    var dbProvider = sqlserver.DbProvider;
    ShouldDoStuff(dbprovider);
}

[Test]
public void ShouldDoStuff_Sqlite() {
    var dbProvider = sqlite.DbProvider;
    ShouldDoStuff(dbprovider);
}

private void ShouldDoStuff (IDbProvider dbprovider){
    // Assert
}
4

3 に答える 3

5

1 つの解決策は、パラメーター化されたテストを使用することです。テストを実行するたびに異なるデータが渡されるため、各データベースに対して 1 回ずつ、2 回テストを実行できるという考え方です。

http://www.nunit.org/index.php?p=testCaseSource&r=2.6.2を見て、ここでのニーズに合っているかどうかを確認してください。

あなたの場合、次のようなものがあるかもしれません:

static IDbProvider[] DbProviders = new IDbProvider[] 
{
    sqlserver.DbProvider,  
    sqlite.DbProvider
};

[Test, TestCaseSource("DbProviders")]
public void TestMethod(IDbProvider dbProvider)
{
    ShouldDoStuff(dbprovider);
} 

または、クラス内のすべてのテストを 2 つのプロバイダーに対して実行するには、次のようにします。

[TestFixture(0)]
[TestFixture(1)]
public class RepositoryTests
{
    private IDbProvider _provider;

    public IDbProvider(int index)
    {
        _provider = IDbProvider[index];
    }


    static IDbProvider[] DbProviders = new IDbProvider[] 
    {
        sqlserver.DbProvider,  
        sqlite.DbProvider
    };

    [Test]
    public void TestMethod(IDbProvider dbProvider)
    {
        ShouldDoStuff(_provider);
    }
}
于 2013-10-15T16:31:20.120 に答える
2

次の行に沿って、値のソースと組み合わせてデータ駆動型テストを使用できます。

public IEnumerable Providers()
{
    yield return new OurApp.Data.SqlServer.DbProvider();
    yield return new OurApp.Data.Sqlite.DbProvider();
}

[Test]
public void MyTest([ValueSource("Providers")] IDbProvider provider)
{
    // Test code...
}

テスト メソッドは、値のソースから返されるオブジェクトごとに 1 回呼び出されます。

こちらのNUnit のドキュメントを参照してください 。もちろん、テスト プロジェクトの構成ファイルで db 構成も提供する必要があります。

HTH トーマス

于 2013-10-15T16:39:31.887 に答える