Vb.net VB单元测试与数据库连接
我是单元测试项目的新手,我想知道如何创建和使用数据库连接。有人能提供一个VB.Net的例子吗?似乎大多数都是c语言# 这就是我所能做到的!函数GetCorrectedTransactionEffectiveDate需要一个连接对象,因为它在数据库中查找一些好东西 所以我有点困惑,在单元测试中应该怎么做Vb.net VB单元测试与数据库连接,vb.net,unit-testing,Vb.net,Unit Testing,我是单元测试项目的新手,我想知道如何创建和使用数据库连接。有人能提供一个VB.Net的例子吗?似乎大多数都是c语言# 这就是我所能做到的!函数GetCorrectedTransactionEffectiveDate需要一个连接对象,因为它在数据库中查找一些好东西 所以我有点困惑,在单元测试中应该怎么做 <TestClass()> Public Class UnitTest1 <DataSource ("Provider=Microsoft.ACE.OLEDB.12.0;Dat
<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
公共类UnitTest1
TL;DR我不认为数据源属性是您想要的
根据,其目的是为测试方法的输入识别数据存储
因此,在您的情况下,您希望使用它的方式是:
- 让测试方法接受
日期
(或日期时间
)参数
- 将该参数传递给oUtil.GetCorrectedTransactionEffectiveDate()
将输入参数值集存储在数据库中
使用DataSourceAttribute
可以确定如何定位测试输入值
。。。但是(据我所知),这更像是一个集成测试,而不是一个单元测试
为了能够对代码进行单元测试,您的代码应该遵循。但是,GetCorrectedTransactionEffectiveDate()
方法似乎至少在做两件事:
- 在数据库中查找信息(可能是周末和节假日)李>
- 执行某种日期计算
正如我在一篇评论中所指出的,在自动化测试的世界中——这似乎是您的目标——单元测试应该(自然地)测试代码,并且能够快速完成。因此,您不希望单元测试的代码执行网络、数据库甚至磁盘I/O
一种常见的方法是将日期计算逻辑和数据库访问分开,如下所示:
- 为数据检索机制定义一个接口(
GetFooById()
,GetFooByName()
,等等)——这通常被称为“存储库”李>
- 使用一个“real”类实现存储库接口,该类从数据库/web服务/任何东西获取值李>
- 使用模拟类实现接口,该类(例如)始终返回硬编码值或值集合李>
- 更好的是,使用模拟框架创建模拟实现——这将允许您构造模拟对象,并指定它在测试方法中应该返回什么(“动态”)李>
- 修改
clsDbUtil
以接受IFooRepository
作为构造函数参数(而不是连接字符串),并将所有数据检索工作委托给存储库
现在,您有了一个用于日期计算的测试,该测试最多应在几毫秒内运行。因此,下次发生“Y2K”类型的日历更改事件时,您将能够快速验证(回归测试)对日期计算所做的任何更改。
另一个好处是存储库接口是(或应该是)媒体无关的。如果必须从数据库转换为XML或JSON文件或web服务,则日期计算代码都不应受到影响
我意识到这一切都不是小事。而且,修改clsDbUtil
或任何东西的源代码并不总是可行的。您仍然可以测试该方法;同样,它更像是一个集成测试,但是(正如评论所指出的)这仍然比根本没有测试要好得多
自动化测试(单元/集成/验收测试)是一个大主题;我只触及了表面。
假设我没有吓跑你,我建议你读一读。如果您使用的代码库本身不适合(轻松地)进行自动化测试,我还建议您。可以说,单元测试的整个要点是独立于网络和数据库连接之类的事情来测试您的逻辑。(如果你的单元测试被认为有助于检测代码破坏——即用于回归测试——那么它们需要很快。如果你正在进行实际的DBMS调用,它们就不会如此。)一种流行的方法是将你的数据访问隐藏在您的存储库方法中的值。在此单元测试中,我将保留GetCorrectedTransactionEffectiveDate或模拟BerkleyOne.clsButil。e、 g.如果测试的其余部分显示为foo,则日期<今天或之后。三个测试,stubgetcorrectedtransactioneffectivedate返回今天之前、今天和之后,并测试foo或bar是否按预期发生。其他内容与单元测试无关。我明白你的观点。然而,在这种特殊情况下,数据库表包含了一个月的截止点,因此,虽然我可以硬编码一个日期,但让它通过获取截止点的动作是否有利?这是一个命名问题;称之为集成测试,你就没事了。不过,不要贬低单元测试的重要性,理想情况下,您应该同时拥有这两种测试。