Testing CRUD Web应用程序自动化测试最佳实践

Testing CRUD Web应用程序自动化测试最佳实践,testing,selenium,automated-tests,Testing,Selenium,Automated Tests,G'day 我正在使用一个相当高DB的web应用程序,并考虑使用Selenium为其设置自动测试。然而,作为一个自动化测试新手,我不知道从哪里开始 您如何对测试进行分类,以确保它们在逻辑上合理且完整 测试时如何处理数据库?在每次测试之前构建一个新的DB,并在每次测试之后删除表?从测试数据库开始 只是想寻找一些关于这方面最佳实践的指针 谢谢,我对Selenium一无所知,但我在标题为“单元测试模拟基础”的部分中发现,作者展示了一种创建模拟对象的好方法,以避免任何数据库调用。显然,您需要一些涉及

G'day

我正在使用一个相当高DB的web应用程序,并考虑使用Selenium为其设置自动测试。然而,作为一个自动化测试新手,我不知道从哪里开始

  • 您如何对测试进行分类,以确保它们在逻辑上合理且完整
  • 测试时如何处理数据库?在每次测试之前构建一个新的DB,并在每次测试之后删除表?从测试数据库开始
只是想寻找一些关于这方面最佳实践的指针


谢谢,

我对Selenium一无所知,但我在标题为“单元测试模拟基础”的部分中发现,作者展示了一种创建模拟对象的好方法,以避免任何数据库调用。显然,您需要一些涉及DB调用的集成测试,但是对于普通的单元测试,概述的方法效果很好

请记住,运行单元测试应该非常快。

通常…

如果您的主要目标是测试数据库CRUD操作,我将至少“降低一级”,编写一些不使用GUI进行测试的集成测试。如果去掉GUI,测试将更加关注实际的CRUD操作

如何处理数据库…

无论您使用的是Selenium测试还是集成测试,测试互不依赖是一个好主意。这意味着在每次测试之前设置数据库和/或在测试之后将其分解为干净/已知状态。维护以这种方式编写的测试要容易得多。例如,您可以单独运行一个测试

对于我们的集成和验收测试,我们都使用dbunit来实现这一点。轻松设置和拆除DBs并不是什么新鲜事,您的技术堆栈也应该有可用的东西。(您没有提到您正在使用的技术)

如何对测试进行分类…

对于CRUD操作,我会确保测试一件事,并且只测试一件事。例如,我有一个Employee表。你可以有一个测试套件来测试与员工有关的一切,但一个测试只能测试一件事“成功保存员工”应是与“尝试保存已存在的员工”或“删除员工”不同的测试用例

编辑:(回答评论)

我们基本上是在测试开始时杀死数据库并从头开始构建它。(不确定这一部分有多重要,但这确保了我们的数据库与代码期望的一致。我们正在使用hibernate…)

然后,对于每个测试,我们都要插入不同的数据集。让我们再说一遍,我们正在测试员工。如果我想测试删除一名员工,我会插入一个数据集,该数据集包含数据库中最小的信息量,以实现这一点。较小的数据集更易于维护。如果您对所有测试使用相同的数据集,那么更改代码、更改或添加新测试将变得非常困难

对于似乎需要相同信息的事情,我们使用相同的数据集。例如,您希望测试“尝试将员工保存到数据库”和“删除员工”。您可以为此重用一个数据集

我想知道大楼和 为每次测试拆卸DB 时间和计算都很昂贵 明智


对此我不会太担心。是的,它可能会增加,比方说,每次测试3-4秒,但从大局来看,这真的很重要吗?更重要的是,您必须进行旨在维护的测试,因为作为开发人员,您的时间比这些测试运行5分钟(而不是3分钟)要宝贵得多。

谢谢您的回答。无论我在网上能找到什么样的最佳实践建议,都提出了同样的建议。然而,我想知道为每个测试构建和拆除DB是否会花费大量时间和计算?还有,你是怎么做到的?是否有一个共同的构建和分解脚本,并且每个测试都会插入数据?或者使用一个通用脚本在数据库中构建、删除和插入样本数据?再次感谢。@Gaurav Dadhania:在我的帖子正文中添加了对该评论的回答。@Gaurav Dadhania我对你如何清理数据集感兴趣?您是如何管理模式中的更改的?@MatthewBrown我们这样做的方式是在开始运行测试套件之前使用一个构建脚本,该脚本使用最新的模式创建数据库(我们有一个基本模式文件+应用数据库迁移)。在测试套件完成运行后删除数据库的销毁脚本。初始测试,因此使用应用程序将基本数据插入数据库,这样管理员、用户等就不在数据库中,我们实际上会在测试这些用例时使用应用程序插入数据。然后每个测试都在事务中运行,但可以在db中预期初始测试数据。@MatthewBrown:所以测试用例可以预期某些数据,例如admin:password123是有效的凭据等,但它插入/更新/删除的所有数据都将在运行结束时回滚。