VB单元测试与数据库连接

时间:2014-07-17 12:12:25

标签: vb.net unit-testing

我是单元测试项目的新手,我想知道如何创建和使用数据库连接。有人可以提供VB.Net示例吗?似乎大多数都在c#

这是我所拥有的!函数GetCorrectedTransactionEffectiveDate需要一个连接对象,因为它在数据库中查找一些好东西

所以我对如何在单元测试中做到这一点感到有些困惑?

<TestClass()> Public Class UnitTest1

<DataSource ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\BServer\bucshared\Systems\ApplicationData\BOne\ENV_DEV\Database\BOne.accdb; Jet OLEDB:Database Password=password"), ]
<TestMethod()> Public Sub RecordedDateTest()

    Dim DateToday As New Date(2014, 6, 14)
    Dim TransactionDate As New Date(2014, 7, 15)
    Dim oUtil As New BerkleyOne.clsDbUtil({Database connection})

    Dim Res as date = oUtil.GetCorrectedTransactionEffectiveDate(TransactionDate)

End Sub

End Class

1 个答案:

答案 0 :(得分:1)

TL; DR,我认为DataSourceAttribute不是您想要的。

根据the class's documentation,其目的是识别用于测试方法输入的数据存储。

因此,在您的情况下,您要使用的方式是:

  • 让测试方法接受一个Date(或DateTime)参数
  • 将该参数传递给oUtil.GetCorrectedTransactionEffectiveDate()
  • 将一组输入参数值存储在数据库中
  • 使用DataSourceAttribute将确定如何找到测试输入值

...但是(据我所知),这比单元测试更像是集成测试


为了能够对您的代码进行单元测试,您的代码应遵循Single Responsibility Principle。但是看来GetCorrectedTransactionEffectiveDate()方法至少在做两件事:

  • 在数据库中查找信息(可能是周末和节假日);
  • 执行某种日期计算。

正如我在评论中指出的那样,在自动化测试的世界(这似乎是您的目标)中,单元测试应该(自然)测试代码,并且能够迅速地进行测试。因此,您不希望要进行单元测试的代码执行网络,数据库甚至磁盘I / O。

一种常见方法是将日期计算逻辑和数据库访问分开,如下所示:

  • 为数据检索机制(GetFooById()GetFooByName()等)定义接口-通常称为“存储库”;
  • 使用“真实的”类实现存储库接口,该类从数据库/ Web服务/其他中获取值;
  • 使用模拟类(例如,该类始终返回硬编码的值或值的集合)来实现接口;
  • 更好的方法是,使用模拟框架创建模拟实现-这将允许您构造模拟对象并在测试方法中指定其应返回的值 (“即时”);
  • 修改clsDbUtil以接受IFooRepository作为构造函数参数(而不是连接字符串),并将所有数据检索工作委托给存储库。

现在,您可以对日期计算进行一次测试,该测试最多可以运行几毫秒。因此,下次发生“ Y2K”类型日历更改事件时,您将能够快速验证(回归测试)您必须对日期计算进行的任何更改。
另一个好处是,存储库接口是(或应该是)与媒体无关的。如果您必须从数据库转到XML或JSON文件或Web服务,则任何日期计算代码都不会受到影响

我意识到所有这些都不是小事。而且,修改clsDbUtil或其他内容的源代码并不总是可行的。您仍然可以测试该方法。再次,它将更多地是一个集成测试,但是(正如评论所指出的),它仍然比根本没有测试要好得多。

自动化测试(单元/集成/验收测试)是一个大话题;在这里我只涉及了表面。
假设我没有吓you您,建议您阅读Roy Osherove's The Art of Unit Testing。如果您使用的代码库无法(轻松)进行自动化测试,那么我还建议您使用Michael Feathers' Working Effectively with Legacy Code