Symfony如何为端到端测试加载测试环境?

3
我正在开发一个使用端到端测试和.env文件的PHP项目。但是在运行测试之前,我需要修改.env文件,将其指向测试数据库(而不是开发数据库)。当我在Symfony项目上工作时,我认为我不需要这样做,因为它会自动加载测试环境。
我知道以前的版本中每个环境都有不同的前置控制器,比如app.phpapp_dev.php等等,但据我所知现在不再这样了。
那么Symfony是如何知道为端到端测试加载测试环境的呢?
2个回答

5
phpunit-bridge 的弹性配置包括一个 phpunit.xml 文件,该文件将 APP_ENV 变量设置为 test。这会触发 Symfony 加载适当的 .env.test 文件。
在测试期间,通常不使用前端控制器,因为桥接程序实例化了一个 Request 对象并将其直接传递给应用程序内核。但是,在使用 PantherTestCase 进行端到端测试时,框架会在内置的 PHP Web 服务器中引导项目,该服务器仍由环境变量控制。
这更好地解释在书中,而不是文档本身的测试章节中:

$client 变量模拟浏览器。它不是向服务器发出 HTTP 调用,而是直接调用 Symfony 应用程序。此策略具有多个优点:比客户端和服务器之间进行往返要快得多,但它还允许测试在每个 HTTP 请求后检查服务的状态。

Panther announcement中:

然而,WebTestCase 并不使用真正的 Web 浏览器。它使用纯 PHP 组件模拟浏览器。它甚至不使用 HTTP 协议:它创建 HttpFoundation 的 Request 对象实例,将它们传递给 Symfony 内核,并允许断言应用程序返回的 HttpFoundation Response 实例。
[...]
在幕后,Panther 有:

  • 在 localhost:9000 上启动内置的 PHP Web 服务器启动您的项目
  • 启动与库一起提供的 Chromedriver 版本以自动化您的本地 Chrome
  • 使用 Chrome 在无头模式下执行在测试中定义的浏览场景

那么您的意思是,当我运行任何WebTestCase时,它会启动一个新的PHP进程并带有一个监听请求的服务器?您有关于这发生在哪里的任何信息吗? - mickadoo
1
@mickadoo 不,WebTestCase不使用内部Web服务器,它实例化Request对象并直接将其传递给应用程序内核,没有实际的HTTP请求。但是PantherTestCase使用Web服务器,APP_ENV仍然适用。 - msg
谢谢你的回答,现在我有点清楚了。我之前不明白PantherTestCase是如何工作的,因为我想它应该是向本地服务器发送请求,但似乎Symfony会自己启动服务器,所以可以为其设置环境变量。 - mickadoo
@mickadoo 我已经包含了一些链接和引用来解决这些问题。 - msg

1

一般来说,使用哪个环境是在 phpunit.xml.dist 中设置的。

这更多是一个 PhpUnit 的问题,而不是 Symfony 的问题。

你应该有一个类似于以下条目:

<php>
    <server name="APP_ENV" value="test" force="true" />
<!-- ... -->
</php>

通过使用force=true,它将覆盖任何现有的APP_ENV环境变量的值。 WebTestCase将“模拟”请求,如这里所解释的。如果您使用类似Panther的东西,则测试将启动内部 Web 服务器并进行“真实”的 HTTP 请求,如这里所解释的。
在任一情况下,应用程序使用的APP_ENV是在PhpUnit配置中定义的。

1
PhpUnit设置的环境变量将在请求的接收端(逻辑上)产生影响,无论是发起真正的请求还是内部请求(这种测试可以同时进行,参见 https://symfony.com/doc/current/testing.html#application-tests )。但回答你的问题:Symfony如何知道要启动哪个环境?它使用PhpUnit设置的APP_ENV环境变量。 - yivi
抱歉,如果我在这里有点慢反应,但是如果我将e2e测试想象成发送curl请求,那么它不能仅仅决定在服务器上设置环境变量。从我的理解来看,服务器只会像平常一样服务于请求。我知道PHPUnit可以为PHPUnit进程加载环境变量,但我认为处理请求的过程与此不同。 - mickadoo
但是即使使用PantherTestCase(它会发出“真实”的HTTP请求),最终也会触发内部Web服务器,并使用在PhpUnit配置中设置的APP_ENV。 - yivi
好的,我猜答案就是使用WebTestCase和向本地开发服务器发送HTTP请求不是同一件事情(但以某种方式知道要加载测试环境)。根据你所说的,WebTestCase将在内部处理请求或使用测试环境变量创建新服务器。这听起来对吗?编辑:我看了一下Panther,它很不错,自述文件提到:“在测试模式下,Panther会自动使用PHP内置的Web服务器启动您的应用程序。” - mickadoo
1
WebTestCase 不会启动内部 Web 服务器,它只是模拟请求。如果要发送实际的 HTTP 请求,你需要使用其他工具,比如 Panther。我已将此添加到答案中,并在之前的评论中提到了。 - yivi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接