1

大家好,我目前正在探索一些极限编程,并尽可能坚持下去。这意味着,一旦我开始迭代(当然是在计划发布之后),我需要将我的(到目前为止,出乎意料的厚厚的)用户故事转变为验收测试。

我不完全确定我将使用的实现语言,但是,我确信这将是一个带有数据库后端的动态 Web 应用程序,由 Web 服务器提供服务。现在,我计划在具有本地测试环境的本地机器上开发第一个版本,因此可以假设安全性与验收测试无关(因此,我可以为验收测试授予对测试数据库的 root 访问权限参与,例如)。我仍然有点不确定要使用的验收测试框架,但是,由于这将是一个 Web 应用程序,我想我将使用 Selenium RC 来编写测试并运行它们(我提到这一点以防有人能够为我指出更好的东西:))。

但是,仍然存在一个黑暗区域:我还没有此应用程序的数据,因为我正在实施一个新的、全新的应用程序。因此,我无法获取当前生产数据库的快照以获取测试数据库,此外,该应用程序是有状态的(就像任何具有数据库后端的 Web 应用程序一样),因此将使用单个数据库进行所有验收测试在测试隔离方面造成丑陋的问题(至少对于单元测试,读作“这可能会带来很大的乐趣和大量的白发”)。

那么,我该如何解决这个问题呢?我是否创建人工测试数据库(并在数据库模式更改时维护它们)并编写验收测试,以便每个验收测试在运行测试之前将适当的数据库状态加载到测试数据库中?(当运行大量口音测试时,加载十几条记录一百次的速度有多快或多慢?)我应该创建一个示例数据库,为所有测试加载它并希望最好吗?我是否应该在验收测试中重新创建我一直需要的测试数据?或者,人们如何做到这一点?

4

1 回答 1

0

根据进一步的研究,正确的方法是使用适当的 setUp 方法使数据库进入定义状态。这可能涉及删除表中的所有现有数据,将某个测试数据集添加到表中,然后对这些数据运行测试。之后,teardown-method 清除对表所做的一切(setUp 删除所有内容,或者 teardown 再次删除所有内容)。有像 dbUnit 这样的工具来简化这个过程。这会导致测试速度有所降低,但是,它建立了测试的完全隔离,这是一件好事,因为这样,绿色仅表示绿色,红色仅表示红色,而不是“鉴于当前的测试执行顺序,这是可行的”。

除此之外,速度问题对我来说可能不太重要,因为我可以在为单个用户故事开发代码期间专注于少量测试,并让我的 CI 服务器运行所有测试(然后需要更多时间)当我认为我完成时的背景。

于 2009-12-26T17:24:07.433 回答