我应该制作使用模拟的单元测试副本并将其更改为真正的数据库进行集成测试吗?

时间:2012-10-02 04:13:37

标签: c# unit-testing integration-testing

我目前正在使用模拟库对我的代码进行单元测试。我现在正处于这样一个阶段,我想测试一切与数据库的完美结合并按预期工作。

复制大量的单元测试并调整它们以使用测试数据库是否有意义?

3 个答案:

答案 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)

在做任何事情之前,先想想你的目标是什么。很容易过度使用集成测试,并最终需要花费很长时间才能运行很多测试,但实际上并没有提供任何价值。

说到这一点,将最高级别的单元测试作为集成测试的模板可以带来一些好处(最高意义离数据库最远)。这些测试对该服务的功能有所期望,因此插入真正的依赖项,服务和数据库可以很好地测试该片。它不是一个完整的测试,但确实可以确保一切按预期工作。