首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试.数据库数据

单元测试.数据库数据
EN

Stack Overflow用户
提问于 2014-02-20 22:39:38
回答 2查看 2.2K关注 0票数 0

我尝试为一些有存储过程的方法创建单元测试。下面是我的问题。

  • 如何对使用大量存储过程从数据库获取数据进行验证的项目进行单元测试?

代码语言:javascript
复制
- If i have to call those methods from my unit test, i am actually making n no of database calls...Is it worth it? 
- If i have to use the mock data, how to get the copy of the data from database locally? 
- How to mimic the stored procedure calls to use the mock data?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-20 22:57:14

你看的是集成测试,而不是单元测试。集成测试依赖于外部系统(日期时间、数据库、文件系统、网络服务等),而单元测试的范围仅限于一个单元(一个或多个类中的一个或多个方法)。

这里要认识到的第一件事是,为了进行集成测试,您将依赖于外部系统。您永远不希望针对您的生产环境进行测试,并且希望维护对测试数据的控制。

因此,您应该创建一个与现有数据库完全相同的数据库,但删除所有数据并使用模拟数据。这可以确保您的测试在整个更改过程中保持一致,因此可以信赖。

您还应该记住保持您的测试数据库在功能上等同于您的活动数据库,以避免落后和有过时的测试。

这里的关键是:抽象您的数据源层。如果将所有数据库调用都放在接口后面,则可以简单地模拟/存根该接口,并从该接口提供测试数据。

你的工作单位应该是重点,测试方法应该做的一件事(单一责任原则)。

如果您的方法的目标是操作数据库中的数据,那么您将模拟数据源,并对您的操作进行单元测试。

如果方法的目标是调用数据库中的存储过程,则使用集成测试来输入过程并针对其输出进行断言。

这一原则的一个简单例子是:

代码语言:javascript
复制
interface DataSource {
    List<String> GetData();
}

class Manipulator {
    private DataSource _source;

    public Manipulator() { }

    public Manipulator(DataSource d) { _source = d; }

    public void ManipulateData() {
        var data = _source.GetData();

        // Do something with the data
    }
}

此示例使用构造函数注入(查看依赖注入和IoC容器的概念!)

现在让我们来回答你们的问题:

如果我必须从我的单元测试中调用这些方法,我实际上是在使数据库calls...Is的n不值得吗?

是的,否则您没有集成测试。由于您有一个单独的测试数据库,这不会干扰您的生产环境。

如果我必须使用模拟数据,如何从本地数据库获取数据副本?

老实说,我不太清楚您在这里要求什么,但我认为通过测试数据库的想法可以解决这个问题。

如何模拟存储过程调用以使用模拟数据?

没有。您使用实际的存储过程,使用测试数据调用它们,并根据所期望的结果断言结果。如果他们成功了,那就结束了,如果他们没有返回正确的结果,你就会知道出了什么问题。

票数 1
EN

Stack Overflow用户

发布于 2014-02-20 22:57:37

您需要定义一个具有所有数据访问方法的interface。您已经有了一个带有这些方法的类,因此您只需在Visual中右键单击数据访问类中的一个空空间,然后选择refactor,然后提取Interface即可在Visual中重构它。现在您有了一个interface,您需要添加一个实现该interface的模拟数据访问类。

在这样做时,只要模拟数据访问类返回由interface指定的正确类型的数据,它就不需要了解任何存储过程的任何信息。最后一部分是在使用应用程序时传递实际数据访问类的一个实例,并在测试中传递模拟数据访问类的一个实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21921264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档