.NET单元测试用于读取/保存数据到数据库

时间:2009-02-26 13:55:33

标签: database unit-testing

我读到的关于单元测试的大部分内容都是关于测试你的课程及其行为。但是,如何测试将数据保存到数据库并从数据库中读取数据。在我们的项目中,保存和读取数据是通过Flex应用程序使用的服务完成的(使用WebORB作为网关)。例如,服务读取所有可以访问某个模块的用户。您如何测试实际返回的用户是否有权访问该模块的用户?

有时能够测试从数据库中加载数据需要数据库中已存在数据。在我们的一些测试中,我们首先需要将大量的testdata保存到数据库中,然后才能测试阅读内容......

同样的事情对存储过程有效。如果数据库中没有数据,如何测试sp?现实是,为了测试某些存储过程,我们需要十个表中的数据......

thx,Lieven Cardoen

7 个答案:

答案 0 :(得分:5)

这更像是集成测试,而不是单元测试。

我在这种情况下做的是我构建了一个非持久性测试,它在test-db中加载测试所需的数据,然后运行单元测试。之后,它处理当前事务,因此不存储任何数据。

这里最大的问题是,如果您的客户出现故障 - 您无法运行此类测试......另一个问题是,每次运行此类测试时,test-db中的数据都将被重置。

答案 1 :(得分:5)

我同意@Gambrinus。通常,对数据层进行单元测试几乎是不可能的;您可以做的最好的事情是提供一个强大的数据层接口,并在业务层中对其进行模拟,然后为您的集成测试保存数据质量测试。

我已经看到尝试模拟ORM工具(this one for LINQ让我很开心),但他们没有测试查询的正确性,只是查询是按照测试人员认为应该编写的方式编写的。由于测试人员通常是针对ORM编写查询的人,因此无法提供任何价值。

答案 2 :(得分:4)

您可以对数据库操作进行测试,但如果可能,请尽量避免使用,否则:

  • 它们的运行速度比普通测试慢(更可能是集成测试)
  • 他们需要更多设置/拆卸工作(db / schema / table data)
  • 他们引入了对您的测试框架的外部依赖

可能也是一种代码气味,你的类没有将数据库相关的工作与其他工作分开,例如商业逻辑。但是它可能没有,我们有一个框架测试,它验证自动生成的SQL脚本在插入新数据后返回预期的递增标识值,AFAIK没有办法测试这个代码是否正常工作而不是对数据库执行它。您可以将其模拟出来,或者只是假设如果SQL符合您的预期,那么它就可以了,但我不喜欢这个假设,因为其他代码依赖于它。

根据您的测试框架,您应将这些测试标记为[数据库]相关,允许您将它们与其他测试分开。

答案 3 :(得分:2)

尝试使用mbunit。它是一个.NET测试框架,允许您在设置中填充数据库,然后在测试期间将您所做的更改回滚到数据库,将数据库还原到以前的状态。有一个快速的写作here

答案 4 :(得分:2)

对保存到数据库和从数据库读取的代码的测试称为Integration Tests。您可以在运行集成测试之前使用数据生成器生成测试数据。集成测试不必像单元测试那样频繁运行。

答案 5 :(得分:1)

这很有趣,我的项目也有同样的问题。模拟可能是一个很好的方法,但我没有尝试过。通常,我们使用数据填充表格。我编写单元测试来运行给定类的CRUDL功能。因此,如果我有一个Person类,则单元测试包括创建,读取,更新,删除和列表。这些方法倾向于调用存储过程(在大多数情况下),因此它也会测试它的一部分。

有些工具可以丢弃大量的测试数据。

Sql data generator from Red Gate

让我们知道哪种方法适合您。

答案 6 :(得分:0)

  • 答:如果FlexApplication直接访问您的数据库,则测试起来并不容易。你应该在它们之间有一个可测试的接口/层。
  • B:将数据放入数据库是“TestSetup-Phase”中的正常现象。
  • C:应该可以测试实际触发存储过程的接口。
    • 如果是GUI不使用的sprocs,而只是sql-to-sql,那么它也是“在那里”测试sprocs的系统。通常在实际测试之前和之后都有sp_setup和sp_teardown sproc