我目前正在使用模拟库对我的代码进行单元测试。我现在正处于这样一个阶段,我想测试一切与数据库的完美结合并按预期工作。
复制大量的单元测试并调整它们以使用测试数据库是否有意义?
答案 0 :(得分:3)
不要复制你的测试。
我之前已经完成了这项测试,以测试不同版本的MySQL和SQL Server。我遇到的一个问题是当MySQL服务器的实例在Windows或UNIX上运行时MySQL如何在命名表等时处理“case”。因此,针对不同数据库引擎运行集成测试的能力证明是非常有价值的。
我推荐以下模式。它使用MSTest完成,但您可以将其适应其他人。它假设IMyRepository是一个包装数据库逻辑的接口。
[TestClass]
public abstract class MyTestBase
{
protected abstract IMyRepository CreateRepository();
[TestMethod]
public void MyTest1()
{
// use IMyRepository
// execute tests
}
}
[TestClass]
public sealed class MyUnitTest : MyTestBase
{
protected abstract IMyRepository CreateRepository()
{
IMyRepository mockedRepository = /* create a mock */;
}
// additional unit tests that are not dependent upon database
}
[TestClass]
public sealed class MyIntegrationTest : MyTestBase
{
[TestSetup]
public void TestSetup()
{
// configure the database to be pristine
}
[TestCleanup]
public void TestCleanup()
{
// dispose of database connections etc.
}
protected abstract IMyRepository CreateRepository()
{
IMyRepository mockedRepository = /* create real repository */;
}
}
另一种方法是仅为IMyRepository编写集成测试,IMyRepository又使用不同的数据库引擎。在您的业务逻辑测试中,您只需模拟IMyRepository。如果您的业务逻辑模拟数据库问题并且IMyRepository适当地封装数据库问题,则实际上没有任何值测试业务逻辑两次。
答案 1 :(得分:2)
取决于测试,我们需要更多关于他们正在做什么的细节。
但是,如果您只是复制测试,则现在必须维护这两个副本。也许你可以在两种模式下运行相同的测试。一种模式使用模拟基础架构,另一种模式使用真实(测试)基础架构。如何实现这一点取决于您如何完成模拟以及配置系统的工作方式。
答案 2 :(得分:0)
在做任何事情之前,先想想你的目标是什么。很容易过度使用集成测试,并最终需要花费很长时间才能运行很多测试,但实际上并没有提供任何价值。
说到这一点,将最高级别的单元测试作为集成测试的模板可以带来一些好处(最高意义离数据库最远)。这些测试对该服务的功能有所期望,因此插入真正的依赖项,服务和数据库可以很好地测试该片。它不是一个完整的测试,但确实可以确保一切按预期工作。