问候, 我目前正在探索一些极端的编程,并尽可能地坚持下去。这意味着,一旦我开始迭代(当然,在规划发布之后),我将需要将我的(现在,意外地厚厚的一叠)用户故事转变为验收测试。
我不完全确定我将要使用的实现语言,但是,我确信这将是一个带有数据库后端的动态Web应用程序,由Web服务器提供服务。现在,我计划在具有本地测试环境的本地计算机上开发第一个版本,因此可以假设安全性与验证测试无关(因此,我可以给验证测试根访问测试数据库)例如,涉及)。我仍然对使用的验收测试框架有点不确定,但是,因为这将是一个Web应用程序,我想我将使用Selenium RC来编写测试并运行它们(我提到这个以防万一有人是能够指出我更好的东西:))。
然而,仍然有一个黑暗的区域:我还没有这个应用程序的数据,因为我正在实现一个新的,新的应用程序。因此,我无法获取当前生产数据库的快照以获取测试数据库,此外,应用程序是有状态的(因为任何带有数据库后端的Web应用程序都是),因此使用单个数据库进行所有验收测试在测试隔离方面引起丑陋的问题(至少对于单元测试来说,这可能会导致“这会带来很大的乐趣和大量的白发”)。
那么,我该如何解决这个问题呢?我是否创建了人工测试数据库(并在数据库模式更改时维护它们)并编写验收测试,以便每个验收测试在运行测试之前将适当的数据库状态加载到测试数据库中? (当很多重要性测试运行时,加载十几条记录的速度有多快或多慢?)我应该创建一个单独的示例数据库,为所有测试加载它并希望最好吗?我应该在验收测试中重新创建我需要的测试数据吗?或者,人们如何做到这一点?
答案 0 :(得分:0)
根据进一步的研究,正确的方法是使用适当的setUp-methods将数据库置于已定义的状态。这实际上涉及删除表中的所有现有数据,向表中添加某个测试数据集,然后在exaclty这些数据上运行测试。然后,拆解方法清除对表执行的任何操作(setUp丢弃所有内容,或者拆除掉所有内容)。有一些像dbUnit这样的工具可以简化这个过程。这导致测试速度有所降低,然而,它确立了测试的完全隔离,这是一件好事,因为那时,绿色只是意味着绿色和红色只是意味着红色而不是“鉴于当前的测试执行顺序,这是有效的”。
除此之外,速度问题对我来说可能不那么重要,因为我可以在为单个用户故事开发代码期间专注于少量测试并让我的CI服务器运行所有测试(然后需要更多时间)在我认为我完成的背景中。