我正在考虑设置单元测试和集成测试,但我遇到了web.config中的连接字符串无法进行测试的问题。我们提出的解决方案是使用另一个连接字符串进行测试,但我想知道是否有更好的方法。
问题的另一半是设置和拆除测试数据库。现在我们只是进行了一次巨大的测试,在运行之前设置数据库然后将其撕下来。这样我们就可以控制测试运行的顺序,以确保结果正确。
只是想看看是否有更好的方法/工具可用于测试ASP.Net应用程序。
答案 0 :(得分:1)
实际上,正如所提到的,模拟和使用存根来测试系统交互而没有数据库交互是很好的,但是集成测试可能只是有效的。
关于脚本化数据库表和数据,然后在所有集成测试之前运行设置脚本,你提到的是一种相当明智的方法。
不知道你有多少ORM粉丝,但是使用NHibernate你可以从映射重建你的表。在重建数据库之后,我通常只有一个物理创建对象的脚本,并通过NHibernate持久化它们。我知道这不是最好的方法,但我通常发现我需要的启动测试数据量不大,而且通过NHibernate插入也是一个测试本身:-)。
我从来没有使用过“Mike Scott”所提到的Fitnesse,但我听到了很好的东西,看起来确实很有趣。在臭名昭着的Billy McCafferty中也提出了这一点。 这篇文章给出了一些很好的通用开发最佳实践的简介,例如单元测试,ddd,合同设计等。
答案 1 :(得分:0)
建议的方法是构建您的系统,您可以在没有数据库的情况下测试代码。对于代码透视,这意味着使用关注点分离。您希望从您的页面中分离出所有核心业务逻辑。你可以使用MVC或MPV模式来做到这一点,如果你很好,你可以找到很多。
现在有ASP.Net MVC;然而,在该框架存在之前很久就已经在ASP.Net中使用了MVC模式,所以如果你想要增强现有的web表单应用程序,请确保你最终不会看到最新的关于ASP.Net MVC的嗡嗡声。 ASP.Net中的编程模型。
现在假设你有一个核心逻辑来处理从页面隔离的按钮点击,所以你有一个类让我们称之为WidgetController。窗口小部件控制器可能有一个HandleClick()方法,用于执行业务逻辑。
让我们进一步假设您的业务逻辑需要数据访问。您可以再次使用关注点。您的业务逻辑不应该关心如何访问数据库,它所需要的只是数据让另一个类获取数据。分离数据的一种流行方法是使用Depedancy Injection或Inversion of Control模型(DI,IoC respectivley)。基本上,您所做的是为数据访问定义一个接口,您的控制器将针对该接口进行编程。然后,您在运行时通过某种方法(Property,Constructor等...)
向控制器提供实际的类它的作用是允许您在运行时提供MOCK实现,从而分离您的数据库。模拟将实现您的界面,您只需要新建测试需要将它们存储在内存中的对象。
答案 2 :(得分:0)
在单元测试中,隔离数据访问代码并对其进行抽象(通常使用接口,例如repository pattern),以便在单元测试中没有任何数据库代码。相反,使用模拟框架(例如Moq)模拟您的数据访问抽象。这样,您的测试将快速运行 ,这是您确保经常运行所有测试所需的。
当您需要测试整个系统(包括数据库)时,您正在进行集成测试。为此,请查看Fitnesse。有good book on it。