e2e测试是否应该在真实数据库中保留数据?

问题描述 投票:3回答:3

我一直在阅读很多关于e2e测试的内容,而我无法理解的一件事是e2e测试应该是多么“真实”。

无论我用于e2e测试的工具如何,我都看到他们大部分时间都遇到了本地,开发或alpha环境。

如果我的应用程序具有身份验证,是否应该在数据库中创建具有有效凭据的“测试”用户?我应该为Alpha甚至生产环境这样做吗?该测试用户如何登录我的应用程序?

说我有臭名昭着的TODO应用程序。我有一个测试记录用户。登录后,我想测试用户是否能够创建TODO。此TODO保存在数据库中。

运行测试后,我应该运行一些东西来删除在e2e测试期间创建的数据吗?或者我应该在保存之前拦截请求并模拟响应(这是否是e2e测试的反模式)?

javascript integration-testing nightwatch.js e2e-testing cypress
3个回答
2
投票

我目前正在一家大型知名公司工作,参与我们的测试工具和框架团队。因此,虽然我不是专家,但这是我工作的一部分。我将专门讨论网络测试。对于像iOS和Android这样的原生应用程序,测试有些不同,我对这些方面并不是很熟悉。

e2e(端到端)和集成测试之间的术语在某种程度上是可以互换的,而单元测试则有更具体的定义。

通常,e2e /集成测试应该可以在开发和生产环境中运行。根据您的设置,您的开发环境可能正在使用生产数据库的一些半频繁更新的快照。在其他情况下,您的本地环境可能会达到实际的生产数据库。这两种方法都有利弊,但在很大程度上取决于公司或项目的规模。例如,如果您是一家拥有专门团队的大公司,那么您每天都会看到许多变化,这些变化会影响生产数据库,而不是一个小团队,其中prod db的每周快照可能足以在本地进行测试。 i在基础级别,所有集成测试都应视为真实。在处理Web应用程序时,我们必须考虑许多其他因素,例如不同的Web浏览器,网络活动/可用性等。因此,模拟api调用的数据将允许超快速测试,但随后又增加了另一层复杂性确保模拟与现实世界的数据库保持同步。

在本地运行集成测试应该或多或少地对您的开发服务器做同样的事情,他们将对分段和生产做。除了让应用程序检测其是否在开发,登台或生产环境中运行以切换URL和各种凭据之外,应该预期应用程序的行为方式完全相同。

关于您的身份验证问题,答案是肯定的。让我们看看2个显示不同注意事项的示例。

假设您的项目非常小。您可以在生产中创建一些真实帐户,并且每周都会为您的数据库创建快照,以便在本地开发环境中使您只需根据需要与一个或多个用户一起运行集成测试。由于本地测试仅访问本地数据库,因此您无需担心生成的数据,因为它不会影响生产。团队中的其他工程师可以使用相同的用户而不用担心。如果一个工程师对db模式,ORM等进行了一些更改,那么每个人只需获取数据库快照的新副本并继续工作。

现在换另一个极端。假设您的项目非常大。数以百万计的用户和数百名员工每天都在共同对代码库和数据库进行更改。基础设施有各种各样的方式来处理各种工程任务。数据太多,数据库更改太频繁,无法使用本地快照。在这种规模下,您可能正在进行持续集成并在每次提交时运行测试。您希望这样做,以便传入的更改不会使其生产并导致重大问题。您可能正在针对不断更新的临时数据库运行本地开发环境,甚至可能针对生产数据库本身。 (尝试计划登台数据库,因为它避免了很多其他问题。)

现在,只有一小组专用测试用户开始出现问题。测试一直在运行,既有自动化,也有数十名工程师都在自己的工作中工作。由于登台数据库可能是共享的,因此当同一个测试用户正在执行各种操作并开始导致测试失败时,您很容易开始出现奇怪的冲突。我见过的一个很好的解决方案是一种测试帐户结帐服务器。您创建100或1000(或更多)测试用户帐户。当您的集成测试运行时,它们会从服务器中检出测试用户帐户。测试完成后,集成测试会清除他们对该用户所做的任何更改,并告诉结帐服务器用户再次空闲。然后由某人/其他人随机检查并继续循环。

所以直接与你的问题有关的收获:

  1. 您应始终拥有与常规用户帐户完全相同的专用测试用户帐户,仅用于测试。
  2. 根据团队和项目的规模,如果小一些专用帐户是好的。如果工作范围更大,则需要更多专用测试帐户,并且可能需要一种自动化服务,允许单独的测试运行以根据需要检出用户。
  3. 测试应该总是自己清理干净。如果测试创建了一个存储在db中的TODO。测试运行完毕后,应从db中删除该TODO。如果你对此不了解,你最终会遇到数据不一致的错误和问题。上帝禁止在生产中发生这种情况。
  4. 只担心模拟单元测试的数据,除非你在一个非常好的专用工程环境中工作,在那里你有人致力于让db模拟器始终保持最新状态。如果你能做到这一点,你的集成测试将非常快,你不必真的担心db的东西。但是如果没有专门的支持,很难保持这种状态。

1
投票

端到端测试涉及确保应用程序的集成组件按预期运行。整个应用程序在真实场景中进行测试,例如与数据库,网络,硬件和其他应用程序进行通信

Definition of Technopedia

E2E测试是最抽象的测试。它测试集成组件的“流程”和“完整性”。或多或少,作为测试,它是一个完整的Blackbox,所有部分都应该是可以互换的。集成测试,检查代码组件是否可以互换。 E2E在测试hirachy(nginx或Apache?PHP或Java?Ms oder MySQL?)中高出一步

此外,E2E测试的定义是业务需求的直接翻译,并且或多或少地由需求工程过程预定义。

例如,Gurkin是一种将用例转换为特性和场景的语言。例:

Feature:  Login functionality of social networking site Facebook. 
Given:  I am a facebook user. 
When: I enter username as username. 
And I enter the password as the password 
Then I should be redirected to the home page of facebook 

其自身的用例/特征可能由少数或多个句子组成,具体取决于主题的复杂性。在任何情况下:它应该完全独立于您的应用程序。

如何处理测试取决于您,并取决于您的应用程序:

您可以捕获某些情况(注册用户?)或者您是否想要使用每日Cron清理数据库?

此外,为每个功能编写测试也要求相当高的性能。大部分时间,您都会为演练(应用程序中最重要的部分 - 资金来源)或功能编写这些测试,这些测试非常重要,但从未进行过积极测试(cookie信息,取消订阅电子邮件,法律信息等) 。)


1
投票

我一直在阅读很多关于e2e测试的内容,而我无法理解的一件事是e2e测试应该是多么“真实”。

E2e应该尽可能地模仿生产系统,你可以使用e2e自动化来重现任何生产问题,如生产数据,

无论我用于e2e测试的工具如何,我都看到他们大部分时间都遇到了本地,开发或alpha环境。

e2e自动化必须与任何资源/数据库/数据组/消息总线等一起使用,并与任何enironmet一起使用,包括本地/远程或云平台

如果我的应用程序具有身份验证,是否应该在数据库中创建具有有效凭据的“测试”用户?我应该为Alpha甚至生产环境这样做吗?该测试用户如何登录我的应用程序?

只要应用程序凭据是应用程序配置的一部分,您就可以灵活地控制专用于测试的凭据。我强烈建议运行并行的全自动e2e专用基础架构,不会妥协或共享生产机密。

说我有臭名昭着的TODO应用程序。我有一个测试记录用户。登录后,我想测试用户是否能够创建TODO。此TODO保存在数据库中。

通过e2e测试,您有兴趣通过验证规则识别所有应用输入(如UI交互或REST / HTTP请求),配置文件和输出。这包括UI更改,生成的日志/消息,数据存储/数据库更改。

运行测试后,我应该运行一些东西来删除在e2e测试期间创建的数据吗?或者我应该在保存之前拦截请求并模拟响应(这是否是e2e测试的反模式)?

作为e2e测试的一部分,您需要注意设置初始应用程序状态,以及每个用例的状态(如果适用)。通过e2e测试,您需要测试所有应用程序行为,因此这里没有太多可以模拟的地方。运行测试后,您可以销毁所有应用程序资源,清除数据库服务。我认为这是可选步骤,因为设置应用程序或用例状态解决资源/数据库准备。

最后,如果您没有合适的工具集和良好的数据组织策略,那么e2e测试可能具有挑战性,尤其是随着时间的推移,您最终将针对中小型应用程序大小进行数百个用例测试。除此之外,您还需要e2e测试工具,该工具适用于以任何语言编写的多堆栈应用程序(java,javascript golang,您可以命名),并支持任何平台的自动化,包括localbox,docker,kubernetess,无服务器云。

以下是一些有趣的读物:

© www.soinside.com 2019 - 2024. All rights reserved.