CRUD Web App自动化测试最佳实践

10

你好,

我正在处理一个相当DB重的Web应用程序,并计划使用Selenium设置自动化测试。然而,作为一名自动化测试新手,我不知道该从哪里开始。

  • 你如何分类你的测试以确保它们在逻辑上合理且完整?
  • 在测试时如何处理DB?在每次测试前构建一个全新的DB并在每次测试后删除表格吗?或者从一个测试数据库开始?

只是想了解在这方面的最佳实践点。

谢谢,

2个回答

10

总体而言...

如果您的主要目标是测试数据库的CRUD操作,我建议至少要“深入”一级,并编写某种不使用GUI进行测试的集成测试。如果将GUI排除在外,则测试更加专注于实际的CRUD操作。

如何处理数据库...

无论您选择Selenium还是集成测试,让测试彼此之间不依赖是个好主意。这意味着在每次测试前设置数据库并/或在测试后将其恢复到一个干净/已知状态。以这种方式编写的测试维护起来更容易。例如,您可以单独运行一个测试。

针对我们的集成和验收测试,我们使用dbunit来实现这一点。轻松设置和拆卸数据库并不是什么新鲜事物,您的技术堆栈中应该也有类似的工具。(您没有提及您使用的技术)

如何分类测试...

对于CRUD操作,我建议确保每个测试只测试一件事情。例如,我有一个员工表。您可以有一个测试套件,测试与员工有关的所有内容,但单个测试仅应测试一件事情。“成功保存员工”应该是不同于“尝试保存已存在的员工”或“删除员工”的测试用例。

编辑(回复评论):

我们基本上在测试开始时清空数据库并从头构建。(不确定这部分有多关键,但这可以确保我们的数据库与代码期望的一致。我们正在使用Hibernate...)

每个测试都需要不同的数据集进行插入。假设我们再次测试“员工”,如果我想测试删除“员工”,我将插入包含数据库中最少信息以使其发生的数据集。较小的数据集更容易维护。如果您对所有测试使用相同的数据集,则更改代码和更改或添加新测试将变得非常困难。

我们确实会针对那些需要相同信息的事物使用相同的数据集。例如,您想测试“尝试将员工保存到数据库”和“删除员工”。您可以重复使用一个数据集进行这些测试。

我想知道对于每个测试构建和拆除数据库是否在时间和计算方面都比较昂贵?

我不会过于担心这个问题。是的,它可能会为每个测试增加3-4秒钟的时间,但从宏观上看,这真的很重要吗?更重要的是,您要有针对维护的测试,因为作为开发人员,您的时间比这些测试花费5分钟而不是3分钟更有价值。


感谢您的答复。无论我在网上找到的最佳方法建议都是同样的事情。但是,我想知道为每个测试构建和拆除数据库是否会在时间和计算方面昂贵?此外,你是怎么做的?有一个共同的构建和拆除脚本,并且每个测试都插入数据吗?还是有一个公共脚本,用于构建、拆除和插入DB中的示例数据?再次感谢。 - Gaurav Dadhania
@Gaurav Dadhania:将我的回答添加到帖子正文中。 - c_maker
@GauravDadhania 我对你如何清理数据集很感兴趣?你是如何处理模式变化的? - Matthew Brown
@MatthewBrown 我们的做法是使用一个构建脚本,在开始运行测试套件之前,使用最新的模式创建数据库(我们有一个基础模式文件+应用数据库迁移)。在测试套件完成运行后,使用销毁脚本删除数据库。进行初始测试,使用应用程序将基础数据插入数据库,因此管理员、用户等不在数据库中,我们会在测试这些用例时使用应用程序插入这些数据。然后每个测试都在事务中运行,但可以期望在数据库中具有初始测试数据。 - Gaurav Dadhania
@MatthewBrown:因此,测试用例可以期望某些数据,例如,admin:password123是有效的凭据等,但它插入/更新/删除的所有数据都将在运行结束时回滚。 - Gaurav Dadhania
如果我需要测试删除员工的功能,我是否也需要测试插入代码?因为删除依赖于插入,所以也许我需要调用INSERT使用的方法进行插入,并验证它是否存在,然后再进行DELETE。你的意见是什么? - Dejell

1
我对Selenium一无所知,但我找到了一个非常好的JavaRanch文章。 在标题为“Unit Testing Mock Basics”的部分中,作者展示了一种很好的创建模拟对象以避免任何数据库调用的方法。 显然,您需要一些涉及DB调用的集成测试,但对于普通的单元测试,所述的方法很有效。
请记住,运行单元测试应该超级快速。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接