我目前在一家大型知名公司的测试工具和框架团队工作。所以虽然我不是专家,但这是我工作的一部分。我将专门讨论 Web 测试。对于 iOS 和 Android 等原生应用的测试有些不同,我对这些方面不是很熟悉。
e2e(端到端)和集成测试之间的术语在某种程度上可以互换,而单元测试有更具体的定义。
一般来说,e2e/集成测试应该可以在开发和生产环境中运行。根据您的设置,您的开发环境可能正在使用生产数据库的一些半频繁更新的快照。在其他情况下,您的本地环境可能会影响实际的生产数据库。这两种方法各有利弊,但这在很大程度上取决于您的公司或项目的规模。例如,如果您在一家拥有专门团队的大公司工作,那么您每天可以看到生产数据库发生许多变化,而在小型团队中,每周生产数据库的快照可能足以在本地进行测试。
一世
在基础级别,所有集成测试都应该被视为真实的。在处理 Web 应用程序时,我们必须考虑许多其他因素,例如不同的 Web 浏览器、网络活动/可用性等。因此,模拟 api 调用的数据将允许超快速测试,但会增加另一层复杂性确保模拟与真实世界的数据库保持同步。
在本地运行集成测试应该或多或少地对您的开发服务器做同样的事情,就像他们将对登台和生产做的事情一样。除了让应用检测其是否在开发、登台或生产环境中运行以切换 URL 和各种凭据之外,应用的行为方式应该完全相同。
关于您关于身份验证的问题,答案是肯定的。让我们看两个显示不同考虑因素的示例。
假设您的项目非常小。您在生产环境中创建了一些真实帐户,并且您的数据库每周都会被快照,以便在本地开发环境中使用。您只需根据需要与这些用户中的一个或多个运行集成测试。由于本地测试只针对您的本地数据库,因此您无需担心生成的数据,因为它不会影响生产。您团队中的其他工程师可以使用相同的用户而不必担心。如果一位工程师对数据库架构、ORM 等进行了一些更改,那么每个人都会获得数据库快照的新副本并继续工作。
现在来说另一个极端。假设你的项目很大。每天都有数百万用户和数百名员工共同对代码库和数据库进行更改。有各种方法可以设置基础设施来处理各种工程任务。数据太多,数据库更改太频繁,无法使用本地快照。在这种规模下,您可能正在进行持续集成并在每次提交时运行您的测试。您希望这样做,以使传入的更改不会进入生产环境并导致重大问题。您可能正在针对不断更新的暂存数据库,甚至可能针对您的生产数据库本身运行本地开发环境。 (尝试规划暂存数据库,因为它可以避免很多其他问题。)
现在,只有一小部分专门的测试用户开始成为问题。测试一直在运行,无论是自动化的还是由数十名工程师都在自己的工作中进行的。由于暂存数据库可能是共享的,因此您很容易开始遇到奇怪的冲突,因为同一个测试用户正在做各种各样的事情并开始导致测试失败。我见过的一个很好的解决方案是一种测试帐户结帐服务器。您创建了 100 个或 1000 个(或更多)测试用户帐户。当您的集成测试运行时,他们会从服务器上签出一个测试用户帐户。测试完成后,集成测试会清理他们对该用户所做的任何更改,并告诉结帐服务器该用户再次空闲。然后它随机被某人/其他人签出并继续循环。
因此,与您的问题直接相关的要点:
- 您应该始终拥有与普通用户帐户完全相同的专用测试用户帐户,仅用于测试。
- 根据团队和项目的规模,如果是少数几个专用帐户就可以了。如果在更大范围内工作,您需要更多专用测试帐户,并且可能需要允许单独测试运行以根据需要结帐用户的自动化服务。
- 测试应始终自行清理。如果测试创建了一个存储在数据库中的 TODO。当测试完成运行时,应该从数据库中删除该 TODO。如果您对此不持一致意见,您最终会遇到数据不一致的错误和问题。上帝禁止在生产中发生这种情况。
- 只需担心单元测试的模拟数据,除非您在一个非常好的和专用的工程环境中工作,在那里您有专门的人员致力于使数据库模拟始终保持最新状态。如果您可以这样做,那么您的集成测试将会非常快,而且您真的不必担心数据库的问题。但是,如果没有专门的支持,随着时间的推移很难保持这种状态。