我们的解决方案有两个不同的数据库提供程序,它们都位于不同的项目中。它们都继承了我们核心项目中的公共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);
}
我真的 讨厌 必须 CTRL + C / CTRL + V 我的所有集成测试只是为了改变DbProvider。
有没有办法运行所有集成测试两次,而每次运行只需注入不同的DbProvider?我希望能够(显然)在我们的Powershell构建中执行此操作,但也可以在IDE中执行此操作。
我最初的想法是创建两个公共方法和一个私有方法,注入适当的数据库提供程序。
[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
}
答案 0 :(得分:4)
一种解决方案可能是使用参数化测试。这个想法是你的测试每次运行都传递了不同的数据,因此允许你对每个数据库运行两次测试。
请查看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);
}
}
答案 1 :(得分:2)
您可以将这些数据驱动的测试与Value源结合使用:
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...
}
对于从值源返回的每个对象,将调用一次测试方法。
请参阅NUnit文档here 当然,您还需要在测试项目的配置文件中提供db config stuff。
HTH 托马斯
答案 2 :(得分:0)
你可以按照以下几点来做:
[TestFixture]
public class RepositoryTests
{
protected IDbConnectionProvider Connection_SQLServer;
protected IDbConnectionProvider Connection_SQLLite;
protected string testDatabaseName_SQLServer;
protected string testDatabaseName_SQLLite;
[SetUp]
public void Setup()
{
// init both providers and db-names
}
public IEnumerable Providers()
{
yield return new SqlServer.DbProvider(testDatabaseName_SQLServer, Connection_SQLServer);
yield return new Sqlite.DbProvider(testDatabaseName_SQLLite, Connection_SQLLite);
}
// Do tests