你如何测试你的业务对象?

时间:2009-02-14 03:09:53

标签: .net unit-testing testing csla

我希望在我的软件开发项目中使用Visual Studio中的Microsoft测试框架实现自动化测试。我已经创建了一些测试,总而言之,它很容易使用。

测试业务对象有哪些更好的做法,更具体地说是读取和写入数据库的

最好是从测试用户界面的开发数据库中设置一个单独的测试数据库,然后只针对该数据库进行测试?基本上只是填充垃圾数据。

在自己心态之后接受某种类型的清理是否更好,这意味着,如果我正在测试AddUser方法,我是否添加用户,检查我的测试,然后删除用户?

您是否在一种测试方法中测试每种CRUD方法?

最后,验证字符串等各个业务规则的大小是否正确,开始日期是否小于结束日期,CustomerId是否是正确的客户等等。

我意识到这是一个非常广泛的问题......只是寻找一些方向......采取婴儿步骤。

更多信息......

很多很好的答案!我不确定我是否能够启动模拟数据库。我使用CSLA作为我的对象的框架。需要一些严肃的重构才能使用mock对象进行测试。我要调查一下这个。虽然,在某些时候,我想要测试数据库交互...当使用模拟数据库时,你何时/何时会实际测试数据库通信?

另一个问题......最好是保持每个测试方法不依赖于其他测试吗?

8 个答案:

答案 0 :(得分:8)

理想情况下,您将拥有不直接访问数据库的业务对象,但使用辅助对象或某种ORM(对象关系映射)框架。然后你可以在没有数据库的情况下测试你的BO,可能会模拟一些帮助对象。这可能是最干净的方式,因为您可以避免真正数据库的复杂性,而且只能测试您的业务逻辑。

如果您无法避免将业务规则和数据库访问组合到一个类中(可能是有问题的设计,但有时难以避免),那么您必须针对数据库进行测试。

几乎唯一合理的选择就是有一个单独的数据库用于自动测试。您的测试方法应删除设置时的所有设置,然后加载所有数据,进行测试并验证结果。

甚至不要考虑尝试初始化DB一次然后再运行 测试相同的数据。一次测试会意外地改变数据,并且 其他测试将神秘失败。我做到了,后悔了...... 每项测试都必须独立进行。

为了做到这一切,我强烈推荐某种数据库测试框架。 这些可以帮助您清理数据库,加载必要的数据和比较查询 结果预期结果。 我使用DBUnit(用于Java),但还有许多其他语言用于其他语言。

答案 1 :(得分:5)

我建议您实现业务对象,以便他们不会意识到数据库。在数据访问层上使用可以根据类型正确保存/检索业务对象的方法(即,它具有表与它们对应的对象之间的内部映射)。在测试业务对象本身时,您根本不必担心数据库。只需创建对象,可能使用反射来设置私有字段,并对对象进行测试。

在测试需要与数据访问层交互的代码时,使用模拟来创建模拟数据层并对其设置期望以返回所需对象或正确响应保存。您可能需要将数据层开发为接口(或者如果使用不直接支持模拟的严格框架,则将其与可模拟类包装在一起)。大多数模拟框架都要求方法是虚拟的,以允许创建模拟实现。使用接口强制实现类中的方法是虚拟的,因此模拟更容易。

答案 2 :(得分:2)

使用dependency injection。在接口中实现数据库方法。然后使用控制数据编写接口的新实现,以测试适用的方案。

答案 3 :(得分:2)

有关带有CSLA的TDD的更多信息,请参阅this question的答案。特别是this one

同样this question可能很有趣。

答案 4 :(得分:1)

通常我创建BO,将其保存到夹具设置中的db,然后测试各种插入/更新/选择然后在我的拆卸中从数据库中删除对象。它保持了良好和干净,特别是当涉及到很多约束时,如果你不删除你在测试中创建的所有内容,你的测试数据库会很快变得混乱。

答案 5 :(得分:1)

要测试数据库访问层,不应在同一个数据库上运行所有测试。某些测试可能会失败,因为它们取决于其他测试的结果。所以这不是你想要的。实际上,在每次测试之后,您应该在测试运行之前将db状态返回到原始状态。

在我的实践中,我将测试数据集保存在XML中,在每次测试之前,它使用XML在db中设置数据。因此,每个测试都针对某些数据集运行。

答案 6 :(得分:1)

我支持曾经说过你应该使用moched数据库测试业务对象。在某些情况下,您可能希望将数据作为测试的一部分保留。缺点是运行时间更长,需要清理。

可能对您有帮助的一个解决方案是使用内存数据库进行测试。例如,SQLite允许您动态创建内存数据库,当您处置它们时它们就消失了。这使得您的测试更快,并且您不必设置清理代码 - 而您实际上是通过自动化测试来测试SQL / db代码。

答案 7 :(得分:0)

(我知道你不使用Java,但下面的一般策略根本不依赖于Java)

我正在开发一个使用大量EJB3 / JPA代码的Java项目。我决定创建一种能够“部署”EJB并使用内存数据库(HSQL)和hibernate实体管理器的模拟容器。

这个“容器”在不到1秒的时间内启动,允许我测试大多数业务组件,包括那些通过JPA访问数据库的组件。例如,如果服务太复杂而无法支持,那么我只需使用EasyMock(或任何其他模拟库)来创建虚假服务并插入“容器”。

到目前为止取得了巨大成功,但需要我几天的时间才能实现模拟基础架构。