Javascript e2e测试应该在真实数据库中保存数据吗?

Javascript e2e测试应该在真实数据库中保存数据吗?,javascript,integration-testing,nightwatch.js,e2e-testing,cypress,Javascript,Integration Testing,Nightwatch.js,E2e Testing,Cypress,我已经读了很多关于e2e测试的书,有一件事我不明白,e2e测试应该是多么“真实” 不管我在e2e测试中使用了什么工具,我已经看到,大多数情况下,它们都会影响本地、开发或alpha环境 如果我的应用程序具有身份验证,我是否应该在数据库中创建具有有效凭据的“测试”用户?我应该为Alpha甚至生产环境这样做吗?该测试用户还将如何登录到我的应用程序 假设我有臭名昭著的TODO应用程序。我有一个用户登录的测试。登录后,我想测试用户是否能够创建TODO。此TODO保存在数据库中 在运行测试之后,我是否应该运

我已经读了很多关于e2e测试的书,有一件事我不明白,e2e测试应该是多么“真实”

不管我在e2e测试中使用了什么工具,我已经看到,大多数情况下,它们都会影响本地、开发或alpha环境

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

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

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

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

E2E测试是最抽象的测试类型。它测试集成组件的“流程”和“完整性”。或多或少,作为测试,它是一个完整的黑盒,所有部件都应该是可互换的。集成测试,检查代码组件是否可互换。E2E在测试hirachy(nginx或Apache?PHP或Java?Ms Order 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信息、取消订阅电子邮件、法律信息等)

我目前在一家大型知名公司的测试工具和框架团队工作。所以,虽然我不是专家,但这是我工作的一部分。我将专门讨论web测试。对于iOS和Android等本机应用程序,测试有些不同,我对这些方面不太熟悉

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

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

在本地运行集成测试应该或多或少地对您的开发服务器执行与对登台和生产服务器相同的操作。除了让应用程序检测其是否在开发、登台或生产环境中运行以切换URL和各种凭据之外,应用程序的行为应该完全相同

关于你关于认证的问题,答案是肯定的。让我们看两个显示不同注意事项的示例

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

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