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

2024-04-13

我读了很多关于 e2e 测试的文章,但我无法理解的一件事是 e2e 测试应该有多“真实”。

无论我使用什么工具进行 e2e 测试,我发现大多数时候它们都是在本地、开发或 alpha 环境中使用。

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

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

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


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

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

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

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

关于您的身份验证问题,答案是肯定的。让我们看两个显示不同考虑因素的示例。

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

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

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

因此,与您的问题直接相关的要点是:

  1. 您应该始终拥有与常规用户帐户完全相同的专用测试用户帐户,仅用于测试。
  2. 根据团队和项目的规模,如果规模较小,几个专用帐户就可以了。如果工作规模更大,您需要更多专用测试帐户,并且可能需要一个自动化服务,允许单独的测试运行根据需要检查用户。
  3. 测试应该始终自行清理。如果测试创建了存储在数据库中的 TODO。当测试运行完成后,应该从数据库中删除该 TODO。如果您对此不一致,您最终会遇到数据不一致的错误和问题。上帝禁止这种情况在生产中发生。
  4. 只需担心单元测试的模拟数据,除非您在一个非常良好且专用的工程环境中工作,其中有人致力于使数据库模拟始终保持最新状态。如果你can这样做,您的集成测试将非常快,并且您实际上不必担心数据库的问题。但如果没有专门的支持,很难长期维持这种状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

e2e 测试是否应该将数据保存在真实数据库中? 的相关文章

  • 如何将一个表单的文件上传字段中的值复制到另一个表单的文本字段?

    我有一页上有两种不同的表格 第一个表单允许用户上传图像文件并通过电子邮件发送 第二个表单根据用户输入生成 URL 为了将图像名称添加到 URL 我需要在第二个表单中有一个字段 该字段从第一个表单的字段中复制图像名称 我不想让用户浏览并选择图
  • 使用 .add() 选择多个 jQuery 对象

    是否 add http api jquery com add 方法允许一次选择多个对象而不是一次添加一个 one add two add three add four on click function 以下变量的设置方式相同 因为每个变量
  • 如何使用 jQuery 在按下按钮后保持按钮处于活动状态

    我见过一些非常相似的问题 但一直无法找到我正在寻找的答案 我已经确定了解决方法 但想知道执行该任务的正确方法 我想要的是单击按钮并使活动状态保持不变 下一次单击将切换状态 这是所需的 我真正需要知道的是如何解决 uiButton activ
  • 当标题中包含“&”时,电子邮件标题无法正确显示,如何在 JavaScript 中修复?

    我有一些代码以以下格式显示文章标题列表 简短描述和作者姓名 标题 作者姓名 描述 作者的姓名和描述与此处无关 因为它们始终显示正确 大多数标题也可以正确显示 以下是一些虚构的示例 关于银行业务您需要了解的最重要的一件事 作者姓名 正确显示
  • 将 FireBug 用于带有框架的网站

    我下载了 Firebug 并尝试使用它来调试使用框架的站点的 JS 我的理解是 当我进入 Firebug 中的 脚本 选项卡时 我会看到 aspx 上的 JS 函数以及包含的任何文件中的 JS 并且我将能够设置断点 然而 我在这个网站上看到
  • 无法在 IE 中的选择选项上使用 onmouseover 事件

    更新的代码 function getElements var x document getElementsByTagName option var el document getElementById selectDept el onmou
  • 未捕获的类型错误:无法读取未定义的属性“prop”

    我有 6 个输入复选框 如果选中的复选框超过 3 个 则最后一个复选框将被取消选中 为了更好地理解 请参阅我之前的question https stackoverflow com questions 35195235 if checkbox
  • 从 html5

    我正在寻找一种方法来根据用户代理字符串将控件属性添加到视频标签 我不希望在 iPad 和 Android 之外的任何浏览器或设备上出现控件属性 所以我认为用户代理是最好的识别方法 因为 ipad 和 android 一词出现在各自的 UA
  • IE8 中空 div 层的 z-index 问题

    我在 IE8 中遇到 z index 问题 其他尚未测试 以下 JS 创建一些 html css document write img src border 0 document write div style background col
  • 如何避免 TypeScript 中出现虚假的“未使用参数”警告

    我遇到过很多次这种情况 最后决定弄清楚正确的方法是什么 如果我有一个声明方法的抽象父类 然后一些具体子类在其实现中实现真正的逻辑 并且显然使用方法参数 但某些子类不需要在该方法中执行任何操作 因此不要使用方法参数 那些不必执行任何操作的方法
  • 创建 html 结构,每个 li 中仅允许 3 个 div 元素。在 React + underscore.js 中

    这是以下内容的位副本如何创建每个 li 中仅允许 3 个 div 元素的 html 结构 在 React underscore js 中 https stackoverflow com questions 38008023 how to c
  • Intro.js 2页然后返回首页

    我在用intro js http introjs com 为我的网站创建一个小介绍 我希望游览从第 1 页 主页 2 另一页 然后回到第 1 页 主页 我已经成功地从第 1 2 页开始 但不确定如何让它返回到第 1 页 我对 javascr
  • 可选回调的 JavaScript 样式

    我有一些函数偶尔 并非总是 会收到回调并运行它 检查回调是否已定义 函数是一种好的风格还是有更好的方法 Example function save callback do stuff if typeof callback undefined
  • 如何更改元素的 CSS 类并在单击时删除所有其他类

    我如何处理 AngularJS 2 中的一种情况 即单击一个元素需要更改其自己的样式 并且如果其他元素具有该样式 则需要将其删除 最好在一个函数中 如同Angular js 如何在单击时更改元素 css 类并删除所有其他元素 https s
  • JavaScript 中的最短路径

    几周来我一直在寻找一种在 JavaScript 中计算最短路径的方法 我一直在玩书数据结构和算法作者 格罗纳 Groner 名字恰如其分 https github com loiane javascript datastructs algo
  • 模拟节点外部模块默认使用 jest 的链式方法

    在我们的节点 CLI 中 我们有一个简单的方法 use strict const ora require ora module exports function startSpinner textOnStart color spinnerT
  • 在firefox上用js改变表单方法

    我需要使用 javascript jQuery 或纯 更改表单的方法属性 我的表单有 method post 我尝试用以下方法更改它 submit button click function var url input id url val
  • 角度 4 单击按钮功能未触发

    我正在尝试检查文本输入是否为空或不在角度 4 中 我没有为此使用表单 这只是一个输入字段 当我在下面的按钮中执行 addLocaton 函数时 需要进行检查 我的输入字段
  • 如何调试 Node.js 应用程序?

    如何调试 Node js 服务器应用程序 现在我主要使用警报调试打印语句如下 sys puts sys inspect someVariable 一定有更好的调试方法 我知道谷歌浏览器 http en wikipedia org wiki
  • 错误:模块“html”不提供视图引擎(Express)

    我正在尝试设置一个简单的路由应用程序 但在渲染页面时不断遇到错误 Error Module html does not provide a view engine 奇怪的是我已经在 app js 文件中指定了视图引擎 但仍然收到错误 app

随机推荐

  • PHP 8.0 中处理未定义数组键的最佳方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 几个月前 我升级到了 PHP 8 0 和许多开发人员一样 我也遇到了这个通知变成警告的麻烦 我不明白处理这个问题的正确方法 所以我想知道如何解决
  • 通过批处理文件终止 MS Access 进程

    我尝试打开 MS Access 延迟大约 5 秒 然后关闭应用程序 使用下面的 bat 文件 我可以打开程序 但在延迟后无法将其关闭 echo off start B Access C Program Files x86 Microsoft
  • 如何让 Emacs 在保存文件时创建中间目录?

    有没有办法在 emacs 中创建文件夹树 类似于 mkdir p in bash 基本上 我希望 emacs 创建所有中间模具 如果它们不存在 当我保存文件时 功能make directory这样做 您的具体问题可能会这样解决 add ho
  • 使用 AngularJS 为 Windows 应用商店应用程序“无法添加动态内容”,但它可以工作

    我正在使用 AngularJS 创建一个 Windows 应用商店应用程序 或 Metro 应用程序 或无论他们如何称呼它 我解决了 Javascript 运行时错误 无法添加动态内容 该错误导致应用程序崩溃 请参阅here http on
  • 为什么 Java 在其语言语法中不使用 out 参数,而 C# 则使用?

    虽然我不太喜欢在 C 中使用 out 参数 但我想知道为什么 Java 选择不在其语言语法中包含它 是否有任何特殊原因 或者可能是因为一个人可以简单地将对象作为参数类型传递 可能是因为设计者觉得没有必要允许多种返回对象的方式 关于委托 泛型
  • 区分按下“home”按钮和打开另一个 Activity

    我有三项活动 飞溅活动 主要活动 玩家活动 当然 应用程序从 SplashActivity 启动 然后启动 MainActivity 并关闭 MainActivity 在某个时刻启动 PlayerActivity 并进入后台 MainAct
  • Spring 与 Hibernate - 线程“main”中的异常 java.lang.NullPointerException

    我正在学习 spring 与 hibernate 集成 我遇到了这个异常 Exception in thread main java lang NullPointerException Sep 04 2014 7 06 50 PM org
  • 如何将WCF项目平台目标更改为x86?

    我编写了一个使用第三方项目的项目 只有在 项目属性 下的 构建 下的 平台目标 设置为 X86 而不是 我的项目 中的 任何CPU 时 我才能运行它 但是 当我尝试将此第三方项目与我的 WCF 项目一起使用时 平台目标 功能不会出现在 WC
  • Jenkins BlueOcean 中的“分支索引”活动是什么

    我正在詹金斯蓝海中设置多分支管道 一切都开始顺利进行 我注意到的一件事是 每隔一段时间 我就会执行名为 分支索引 的作业 我的构建包含一些繁重的单元测试和代码覆盖率 需要大约 4 小时 30 才能执行 所以让这个作业随机执行 2 次并不是很
  • 使用 Popen 替换 Python 中的 Bash 进程

    我试图通过从 python 子进程库调用 ffmpeg 来创建循环视频文件 这是给我带来问题的部分 import subprocess as sp sp Popen ffmpeg f concat i lt for f in Desktop
  • Oracle 在组中的列中查找具有多个值的行

    我正在尝试查找某个零件号 组 是否有多 个运营商 我已经尝试过下面的代码但不起作用 SELECT PART NO CARRIER ROW NUMBER OVER PARTITION BY PART NO CARRIER ORDER BY P
  • 如何向菜单项添加工具提示?

    我正在尝试为菜单栏项添加工具提示 例如 Save 但我无法获取需求菜单项的实例 我可以添加这个工具提示吗 我正在使用 Tkinter 和 python 2 7 def createMenu self menu Menu root root
  • 编写java代码时出现SIGSEGV

    我有一段代码在 HTC Desire HD v2 3 3 上运行得很好 但是在 HTC Desire v2 2 上运行时 关闭蓝牙套接字时会崩溃并出现 SIGSEGV 07 25 16 23 52 462 INFO DEBUG 64 07
  • 如何调用.Net Core需要签名的XML SOAP服务?

    我意识到这个问题指的是旧技术 我正在呼叫供应商系统 并且无法更改服务 我们需要调用 XML SOAP WS 然后签署请求 10 年前 我会使用 Web 服务增强 WSE 3 0 之类的东西 然后继续前进 就像今天一样 我陷入了在 Net C
  • 持久性单元定义冲突

    春季3 1 1 Maven 3 0 4 日本PA Eclipse wtp 靛蓝 你好 我在服务器启动时遇到以下异常 我的项目中只有一个 persistence xml 有任何想法吗 谢谢埃里克 引起原因 java lang IllegalS
  • Node.js 找不到模块“tcp”

    节点在以下行崩溃 var tcp require tcp 错误文本 node js 201 throw e process nextTick error or error event on first tick Error Cannot f
  • 可折叠工具栏布局中的稀松布是什么?

    我在 Android 开发人员上阅读了可折叠工具栏布局 那里使用了一个术语 稀松布 它是什么 Scrim 隐藏或掩盖某事的事物 根据 Android CollapsingToolbarLayout 稀松布内容 当滚动位置达到某个阈值时显示或
  • 使 WooCommerce 结账运送字段可见并删除“运送到不同地址?”复选框

    我想知道是否有办法删除 运送到其他地址 复选框 在 woocommerce 结帐页面中 但保持运输字段可见 我努力了 add filter woocommerce cart needs shipping address return fal
  • Node.js 上通过套接字连接 Redis

    由于共享托管 目标主机上的我的 redis 服务器不在端口上运行 而是在非常特定的套接字上运行 可以通过套接字文件连接到该套接字 只有我的用户可以访问 但是 我还没有找到如何通过套接字指定连接node redis and connect r
  • e2e 测试是否应该将数据保存在真实数据库中?

    我读了很多关于 e2e 测试的文章 但我无法理解的一件事是 e2e 测试应该有多 真实 无论我使用什么工具进行 e2e 测试 我发现大多数时候它们都是在本地 开发或 alpha 环境中使用 如果我的应用程序具有身份验证 我是否应该在数据库中