【问题标题】:Why is caching usually disabled in test environments?为什么在测试环境中通常禁用缓存?
【发布时间】:2013-09-20 12:57:30
【问题描述】:

在我们的应用程序中,我们通过 selenium 进行了大量功能测试。

我们知道,让运行测试的服务器与生产服务器尽可能相似是一种很好的做法,我们会尽可能地遵循它。
但这很难 100% 实现,因此我们为我们的服务器设置了一个不同的设置文件,以便在暂存环境中进行一些更改(例如,由于需要额外的架构,我们选择关闭电子邮件发送)。
事实上,许多服务器框架都建议使用隔离的前端控制器(环境)进行测试,以轻松实现这些小改动。

默认情况下,ours 等大多数框架都建议其测试环境应关闭缓存。为什么?

如果我们想尽可能地模拟生产,那么在执行功能测试时关闭服务器缓存可能有什么好处?可能存在只有在缓存开启的情况下才能发现的错误,并且开启缓存还可能有助于加速我们的测试执行!

难道我们不只需要确保在开始新一批功能测试之前清除缓存,就像我们在将新版本部署到生产时清除缓存一样吗?

我的一位同事认为,造成这种情况的原因可能是缓存会产生误报,错误不是由实施不当的功能(这些测试的主要目标)引起的,而是缓存系统本身引起的...但即使这些真的发生了(我想这取决于缓存的使用方式有多先进),为什么它们会是误报?

【问题讨论】:

    标签: caching testing selenium symfony1 automated-tests


    【解决方案1】:

    为了最好地回答这个问题,我将澄清一些观点。

    (请注意,这是基于我的经验)

    使用浏览器的集成测试通常是“Black Blox 测试”,这意味着它们是在不了解代码的情况下进行的。即不知道缓存是否被使用。

    这些测试通常是根据系统正常使用期间执行的某些任务设计的。但是,这些任务是根据某些使用条件(主要是可重用性、关键性/重要性以及实施成本)来选择自动化的。所以大多数时候,我们不需要/不会测试缓存行为。

    按照惯例,必须以单一目的创建测试(任何)并且具有较少可能的依赖关系。为什么?

    • 当测试失败时,我们可以快速找到失败的根源。
    • 较小的测试更容易扩展、修复、删除...
    • 我们不花太多时间,先调试测试代码再 调试系统代码。

    集成测试应该遵循这个约定。

    回答问题:
    如果我们想检查一个特定的任务,我们必须尽可能地隔离它。
    例如,如果我们想验证用户是否正确登录,我们必须删除 cookie 以确保它们不会影响结果(因为它们可能会)。另一方面,如果我们想测试 cookie,我们必须以某种方式使用它们不会被删除的环境。

    所以,简而言之:
    如果需要测试缓存行为,那么我们需要在可能的情况下创建一个“隔离”环境。
    通常的集成测试目的是测试功能,因此框架默认值是禁用缓存。
    这并不意味着我们不应该创建自己的环境来测试缓存行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2013-01-09
      • 2020-04-26
      • 2016-03-04
      • 1970-01-01
      相关资源
      最近更新 更多