2014-02-20 115 views
0

我试图为存储过程的某些方法创建单元测试。以下是我的问题。单元测试 - 数据库数据

  • 使用大量的存储过程来 项目如何进行单元测试得到数据库验证数据?

    • 如果我要打电话从我的单元测试这些方法,我其实 将n没有数据库的调用......值得吗?

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

    • 如何模仿存储过程调用来使用模拟数据?

+1

你想测试哪些调用存储过程的一部分?你正在编写自己的SQL类吗? (对于普通的应用程序,你只是模拟数据持久层,并且从不担心单元测试中的数据库调用...) –

+0

要验证一个字段,它会创建几个数据库调用,并根据它返回的数据对这些数据进行验证字段并返回true或false。鉴于这种情况,你将如何嘲笑?你是什​​么意思嘲笑数据持久层?请详细说明。非常感谢您的回复! – user3123734

+0

Jeroen Vannevel有非常详细的答案(+1)。它确实不像你需要*单元测试*那样。 –

回答

1

您现在看到的集成测试,而不是单元测试。集成测试对外部系统(日期时间,数据库,文件系统,网络服务等)具有依赖性,而单元测试的范围局限于一个单元(一个或多个类中的一个或多个方法)。

这里要实现的第一件事是为了做一个集成测试,你将依赖于一个外部系统。您永远不想测试您的生产环境,并且希望保持对测试数据的控制。

因此,您应该创建一个与您现有的数据库完全相同的数据库,但不使用所有数据并使用模拟数据。这可以确保您的测试在整个变更过程中保持一致,因此可以信赖。
您还应该记住保持测试数据库在功能上与您的实时数据库相同,以避免落后和过时测试。

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

你的工作单元应该切合实际,测试方法应该做的一件事(单一责任原则)。
如果您的方法的目标是操纵数据库中的数据,那么您可以嘲笑数据源,然后单元测试您的操作。
如果您的方法的目标是调用数据库中的存储过程,那么您将使用集成测试来提供过程输入并针对其输出进行断言。

这一原则在行动中一个简单的例子:(!看看依赖注入和IoC容器的概念)

interface DataSource { 
    List<String> GetData(); 
} 

class Manipulator { 
private DataSource _source; 

public Manipulator(){ } 

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

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

    // Do something with the data 
} 
} 

此示例使用构造函数注入。

现在回答你的问题的一点是:

如果我要打电话从我的单元测试这些方法,我实际上将n没有数据库的调用......值得吗?

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

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

我不太清楚你在这里要求的是诚实的,但我认为它是用测试数据库的想法解决的。

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

你不知道。您可以使用实际的存储过程,通过与您的测试数据一起调用并根据您的期望断言结果。如果他们工作,那么这是结束,如果他们没有返回正确的结果,那么你知道出了问题。

+0

非常感谢您的详细解释!我们有不同的相同数据库的副本......比如说100.在某些情况下,数据可能会有所不同,但对于某些数据可能会不同在这种情况下更好的方法是什么? – user3123734

+0

为什么你有100个数据库?它们在功能上与只有不同的数据相同,还是数据库完全不同? –

+0

是的!在大多数情况下,使用不同数据的模式都是相同的......它是针对数据保护和其他原因单独维护的。谢谢! – user3123734

0

您需要定义一个包含所有数据访问方法的interface。您已经拥有一个使用这些方法的类,因此您可以在Visual Studio中通过右键单击数据访问类中的空白空间来重构它,然后选择重构,然后提取接口。所以现在你有一个interface,你需要添加一个模拟数据访问类,它实现了interface

这样做,只要它返回interface指定的正确类型的一些数据,您的模拟数据访问类不需要知道有关任何存储过程的任何信息。最后一部分是在使用应用程序和测试时传递实际数据访问类的实例,而不是传递模拟数据访问类的实例。

+0

非常感谢你! – user3123734