我们需要测试数据还是可以依靠单元测试和手动测试?


10

我们目前正在开发一个中型/大型PHP / MySQL项目。我们正在使用PHPUnit&QUnit进行单元测试,并且有两个全职测试人员正在手动测试应用程序。我们的测试(模拟)数据当前是使用SQL脚本创建的。

我们在维护测试数据脚本方面遇到问题。业务逻辑非常复杂,测试数据中的一个“简单”更改通常会在应用程序中产生多个错误(不是真正的错误,只是无效数据的产物)。由于我们不断创建和更改表,因此这已成为整个团队的一大负担。

我真的看不到在脚本中维护测试数据的意义,因为可以使用UI在大约5分钟内将所有内容手动添加到应用程序中。我们的PM不同意,并说拥有无法使用测试数据进行部署的项目是一种不良做法。

我们是否应该放弃使用测试数据来维护脚本,而只是让测试人员在没有数据的情况下测试应用程序?最佳做法是什么?

Answers:


4

您正在混合两个不同的概念。一种是验证,它基于单元测试和同行评审。这可以由开发人员自己完成,而无需测试数据,其目的是验证是否满足一组要求。

第二个是验证,这是由质量检查人员(您的测试人员)完成的。对于此步骤,您确实需要测试数据,因为测试人员不需要了解应用程序中的程序,只需了解其预期的用例即可。其目的是验证应用程序在生产环境中的行为是否符合预期。

这两个过程对于向客户交付优质产品都非常重要和必要。您不能仅依靠单元测试。您需要找出一种可靠的方式来处理测试数据以确保其有效。

编辑:好的,我明白了你的要求。答案是肯定的,因为测试人员的工作不是生成测试数据,而只是为了测试应用程序。您需要以一种易于维护的方式构建脚本,并确保插入有效数据。没有测试数据,测试人员将无法测试。话虽如此,但是,如果您可以访问测试环境,我不明白为什么您不能手动而不是使用脚本来插入测试数据。


也许我通过提及单元测试和测试数据来错说我的问题。我了解验证与单元测试不同。我的问题是,使用脚本创建的测试数据可以在5分钟内通过UI创建。要将这些数据插入应用程序中,您不需要了解编程,只需遵循测试用例即可。
Christian P

@ christian.p检查有关您对问题的澄清的最新信息。
AJC

因此,您的解决方案是放弃脚本,而仅通过UI手动添加测试数据?P.Brian.Mackey提供的答案以及他将数据与UI耦合的答案如何?
Christian P

@ christian.p好吧,我同意您应该使用脚本。但是没有任何形式或规则说明您必须遵守。使用脚本生成模拟数据的主要原因是速度(自动化)和访问(对测试环境)。如果您具有访问权限,并且手动进行操作变得更快,更容易,则没有理由不这样做。(但是请保留测试数据的日志)。
AJC

每个测试人员都有自己的测试环境,并且测试人员每天要完全删除数据库几次,因此手动添加测试数据是不切实际的,但是我们可以礼貌地请他们添加一些数据进行测试。
Christian P

6

是的,进行单元测试和数据模型化是最佳实践。项目经理是正确的。由于在测试数据中执行“简单”更改通常会产生错误,因此这就是问题的核心。

该代码需要改进。不这样做(说嘿,我们不需要测试)不是解决办法,只是增加技术负担。将代码分解为更小的可测试单元,因为无法识别而不破损的单元是一个问题。

开始进行重构。保持小的改进,使其易于管理。寻找诸如上帝的课程/方法之类的反模式,而不遵循DRY,单一职责等。

最后,查看TDD,以了解它是否适​​用于团队。TDD可以很好地确保您的所有代码都是可测试的(因为您首先编写测试),并且可以通过编写足够多的代码来通过测试来确保精简(最大限度地减少工程设计)。

通常,如果一系列复杂的业务逻辑流程产生了一组数据,那么我将其视为报告。封装报告。运行报告,并将结果对象用作下一个测试的输入。


我需要澄清一些事情:“测试数据的简单更改会产生错误”-这里的问题不在应用程序中-数据有效时,应用程序运行正常(并且您不能手动添加无效数据) 。这里的问题是无效的测试数据在尝试处理该数据时会产生错误。那么我们还需要测试测试数据吗?
Christian P

不要因红色鲱鱼谬误而绊倒。测试数据引入错误的事实是一个完全不同的问题。删除测试不是解决办法,完全“治理政府”也是另外一回事。问题是代码。这是不可测试的,因为您告诉我们您无法编写不会破坏性能的测试。这就是为什么您需要改进代码的原因。
P.Brian.Mackey 2011年

也许您误解了我的问题。我们有工作单元测试,编写的每个新功能都有单元测试。我并不是建议我们删除未通过的测试,或者根本不编写测试。我只是建议我们不要使用脚本在数据库中创建模拟数据,因为手动测试人员在做同样的事情。
Christian P

“我真的看不到在脚本中维护测试数据的意义。” <-我说的是放弃测试支持。不删除旧测试。这是一个坏主意。您正在降低可重复性,并将自己与UI结合在一起,这是您要测试并能够适应变化的一部分。使自己与用户界面脱钩。保持数据自动化。
P.Brian.Mackey 2011年

但是,我们如何解决无效的模拟数据的问题呢?如果我们继续为数据库创建模拟数据,如何检查模拟数据是否正常?如果业务规则要求值X = 2,并且数据库接受X = 100,那么当业务规则很复杂时,我们如何检查测试数据的完整性?
Christian P

1

这是一个非常普遍的问题,也是一个非常困难的问题。针对某DATABSE(甚至是内存数据库,如进行自动测试HSQLDB)通常是缓慢的,非确定性,而且由于测试失败只是表明有问题的地方在你的代码或在您的数据,它们是没有太多的信息。

以我的经验,最好的策略是专注于业务逻辑的单元测试。尝试尽可能覆盖您的核心域代码。如果您正确地做到这一点,这本身就是一个挑战,那么您将获得自动化测试的最佳成本效益关系。至于持久层,我通常会花更少的精力在自动化测试上,而将其留给专用的手动测试人员进行。

但是,如果您真的想要(或需要)自动化持久性测试,我建议您阅读Tests指导的Growing Oriented Oriented Software。本书有一整章专门介绍持久性测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.