gpt4 book ai didi

c# - 如何针对两个不同的数据库运行集成测试?

转载 作者:行者123 更新时间:2023-12-03 19:08:44 25 4
gpt4 key购买 nike

我们的解决方案有两个不同的数据库提供程序,它们都位于不同的项目中。它们都继承了位于我们核心项目中的通用 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 进行了集成测试。

目前,所有 RepositoryTest 都继承自一个基类。

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);
}

我真的讨厌不得不CTRL + C/CTRL + V 我所有的集成测试都只是为了更改 DbProvider。

有没有一种方法可以运行所有集成测试两次,同时只需为每次运行注入(inject)不同的 DbProvider?我希望能够(显然)在我们的 Powershell 构建中以及在 IDE 中执行此操作。

我最初的想法是创建两个公共(public)方法和一个私有(private)方法,注入(inject)适当的数据库提供程序。

[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
}

最佳答案

一种解决方案可能是使用参数化测试。这个想法是你的测试每次运行都有不同的数据传递给它,因此允许你运行测试两次,一次针对每个数据库。

看看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);
}

或者,要针对两个提供者运行类中的所有测试,请尝试如下操作:

[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);
}
}

关于c# - 如何针对两个不同的数据库运行集成测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19386148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com