2009-10-27 40 views
1

假设我有一个文章表,并且我想为返回所有即将到期的文章的方法编写一个测试。如何测试按日期范围返回文章的查询?

我该如何去编写一个单元测试呢?如果我嘲笑该方法返回的文章集合,那么这是一个单元测试?

我的意思是我想确保它返回正确的文章数据范围?

有人可以澄清这一点吗?

+0

你用什么来访问表? ADO.NET? NHibernate的? – zvolkov 2009-10-27 19:58:14

+0

我使用ADO.NET来访问数据库。 – mrblah 2009-10-27 20:21:50

回答

1

如果您正在测试数据访问层本身,您确实可能需要访问某些数据。许多人认为一个测试会触及像数据库这样的外部依赖,而不是“单元”测试,而不是“重要”测试。

一种选择是使用一个轻量级或内存数据库如SQLite的。作为设置测试的一部分,使用一组已知数据对数据库进行种子处理。然后,您可以安全地以受控方式测试结果。

你要控制的另一个因素:当你创造的东西,(在这种情况下为)取决于当前的日期,你会想办法注入一个假的“当前日期”,以使测试更加简单 - - 不要仅仅在数据库中使用“SYSDATE”或等价物,否则您的测试将变得更加困难(您的测试数据将不得不根据日期进行更改)。

1

我通常有一些由单元测试框架驱动的集成测试,它对确定的一组数据(包括为每个测试运行设置数据的脚本,as described here)起作用。通过这种方式,您可以确切知道应该在给定日期范围内返回多少(以及哪些)文章,然后您还可以为其创作测试。

+0

我同意这个想法。我在预测试阶段使用SQL脚本来生成我的单元测试可以使用的模拟数据。 – 2009-10-27 20:15:40

0

有没有办法“单元测试”数据访问层,而不是你可以写一个“集成测试”,将设置一个简单的数据库查询,并用断言检查结果。

您还需要经过测试运行全新的功能,以确保数据库恢复到它的初始状态。

  • 如果您使用MSTest,则可以使用部署项目来设置数据库,否则您将不得不编写简单的辅助方法。

如果您想检查业务逻辑 - 即如果处理结果,则使用模拟从查询中创建假退货。

1

如果你嘲笑它,它是一个单元测试,因为你正在测试的功能,尽可能小的量。

如果你不嘲笑它,不利于现场数据库,德罗尔说,这是一个集成测试。

0

这种类型的测试确实是前面提到的集成测试。您可以使用MSTest或NUnit作为测试运行器,但是一个好的经验法则是将这些测试分离到各自的程序集或类别中,以便在每次运行快速单元测试时都不会运行它们。拉过这个集成测试应该不是很困难的,你需要做类似如下:

  1. 创建数据库/清除掉现有的数据库
  2. 种子同来自SQL脚本数据的数据库或像ndbunit的框架,这一步可以在测试设置或类似的设置程序进行
  3. 运行的集成测试,并断言,在上一步中接种已知数据相匹配的结果,从您的代码
  4. 清理返回数据库和截断/删除记录形式的数据库,所以他们不会有害地影响其他测试。

就像一个谨慎的词,尽管如果你没有很多良好的实践来快速和容易地设置你的系统,这些类型的测试可能会非常令人沮丧,因为集成测试非常依赖整个系统处于某个“状态”成功通过。使这些类型的测试可重复且易于运行将使未来的集成,甚至整个系统范围的测试更容易实现。