如何为 Web 应用程序 GUI 测试分离数据库依赖性
How to decouple DB dependencies for web application GUI tests
使用 Selenium API 的 WebApplication GUI 测试是验证应用程序行为的重要方式(当然仅限于特定程度)。这里的主要问题是对其他应用程序也使用的其他资源的依赖性。尽管应用程序(被测)部署在测试平台上,但其他被测应用程序也部署在那里并使用这些数据库。这里的结果是测试将无法正常工作,因为应用程序会相互干扰并操纵或删除它们所依赖的其他测试数据!
"enterprise" 系统的体系结构不依赖 Web 服务,一个应用程序可以通过 Web 服务从另一个应用程序域检索数据。 相反,它们通过数据库链接紧密耦合 通过自定义读取、写入执行权限,以便每个应用程序都能够通过以下方式检索所需的数据JPA 和 EJB。
为了克服这个问题我可以想到以下方案:
我的最爱!对于每个应用程序,都存在一个独立的 RESTful WebService,它充当 DB 和相应 WebApplication 之间的层,以及 dependent-by[=51= 的通信通道] 个申请。
- Pro: 最大的灵活性,因为在编译时很容易用测试虚拟机替换依赖关系
- 缺点: 大量初始工作,创建 Web 服务并用 REST 服务替换直接数据库访问。以及虚拟实现的维护。
第二个是通过执行逻辑按顺序执行不同 Web 应用程序的测试执行,该执行逻辑也在执行开始之前替换数据库(DB 设置)。
- Pro: 省力,因为我只需要提供和维护包含常用记录的数据库转储。
- 缺点: 无法并行化。必须安排测试执行。漫长的等待时间!
在可维护性方面可能是最差的一个,但我也想提一下这个选项,因为第二个可能会导致长时间空闲。因此,对于每个 Web 应用程序,都存在一个提供所有相关数据库的独特测试执行环境。数据库替换的工作方式与第二种方法所描述的相同。
- Pro: 与第二种方法相同加上高度的灵活性和无等待时间(调度),因为每个应用程序都有其专用的测试执行环境.
- 缺点: 消耗大量资源并导致混乱的测试系统环境,(可能)需要专门的系统管理员
看来您已经有了答案。选项 #3 适用于大型数据库,因为很难 "mock" 这么多数据。我一直在为具有数百万个条目的数据库这样做,以确保我们的查询不会影响应用程序性能。
选项 #1 显然是小型应用程序的最佳选择。这确实需要额外的努力,但明确区分前端和后端是非常有价值的。
我不太清楚这个平台是如何运作的
The major problem here are dependencies to other ressources which are used by other applications too. Although the application (under test) is deployed on a test plattform, other applications under test are deployed there too and are using those databases.
但是每个应用都应该有自己的数据库和专用资源。即使您的 integration tests 依赖于其他 SUT,这也不应该影响它的内部运作。毕竟这是一个黑盒子。同样适用于 UI 测试 - 为什么他们应该(明确地)关心 SUT 的数据库中发生了什么?
since the applications will interfere each other and manipulate or delete the others test data on which they rely!
恕我直言,您需要的是更好的测试夹具策略。 Here are 那些解释:
新鲜夹具
最小夹具
共享夹具
使用 Selenium API 的 WebApplication GUI 测试是验证应用程序行为的重要方式(当然仅限于特定程度)。这里的主要问题是对其他应用程序也使用的其他资源的依赖性。尽管应用程序(被测)部署在测试平台上,但其他被测应用程序也部署在那里并使用这些数据库。这里的结果是测试将无法正常工作,因为应用程序会相互干扰并操纵或删除它们所依赖的其他测试数据!
"enterprise" 系统的体系结构不依赖 Web 服务,一个应用程序可以通过 Web 服务从另一个应用程序域检索数据。 相反,它们通过数据库链接紧密耦合 通过自定义读取、写入执行权限,以便每个应用程序都能够通过以下方式检索所需的数据JPA 和 EJB。
为了克服这个问题我可以想到以下方案:
我的最爱!对于每个应用程序,都存在一个独立的 RESTful WebService,它充当 DB 和相应 WebApplication 之间的层,以及 dependent-by[=51= 的通信通道] 个申请。
- Pro: 最大的灵活性,因为在编译时很容易用测试虚拟机替换依赖关系
- 缺点: 大量初始工作,创建 Web 服务并用 REST 服务替换直接数据库访问。以及虚拟实现的维护。
第二个是通过执行逻辑按顺序执行不同 Web 应用程序的测试执行,该执行逻辑也在执行开始之前替换数据库(DB 设置)。
- Pro: 省力,因为我只需要提供和维护包含常用记录的数据库转储。
- 缺点: 无法并行化。必须安排测试执行。漫长的等待时间!
在可维护性方面可能是最差的一个,但我也想提一下这个选项,因为第二个可能会导致长时间空闲。因此,对于每个 Web 应用程序,都存在一个提供所有相关数据库的独特测试执行环境。数据库替换的工作方式与第二种方法所描述的相同。
- Pro: 与第二种方法相同加上高度的灵活性和无等待时间(调度),因为每个应用程序都有其专用的测试执行环境.
- 缺点: 消耗大量资源并导致混乱的测试系统环境,(可能)需要专门的系统管理员
看来您已经有了答案。选项 #3 适用于大型数据库,因为很难 "mock" 这么多数据。我一直在为具有数百万个条目的数据库这样做,以确保我们的查询不会影响应用程序性能。
选项 #1 显然是小型应用程序的最佳选择。这确实需要额外的努力,但明确区分前端和后端是非常有价值的。
我不太清楚这个平台是如何运作的
The major problem here are dependencies to other ressources which are used by other applications too. Although the application (under test) is deployed on a test plattform, other applications under test are deployed there too and are using those databases.
但是每个应用都应该有自己的数据库和专用资源。即使您的 integration tests 依赖于其他 SUT,这也不应该影响它的内部运作。毕竟这是一个黑盒子。同样适用于 UI 测试 - 为什么他们应该(明确地)关心 SUT 的数据库中发生了什么?
since the applications will interfere each other and manipulate or delete the others test data on which they rely!
恕我直言,您需要的是更好的测试夹具策略。 Here are 那些解释:
新鲜夹具
最小夹具
共享夹具