如何有效地测试使用 Behat/Mink 访问大文件?

Posted

技术标签:

【中文标题】如何有效地测试使用 Behat/Mink 访问大文件?【英文标题】:How to efficiently test accessing a large file with Behat/Mink? 【发布时间】:2013-11-12 16:00:00 【问题描述】:

我想编写 Behat/Mink 场景来检查某些用户帐户是否可以下载大文件。我可以使用When I follow "largefile.zip" 事件,但这似乎会下载整个文件。

与其浪费时间和资源流式传输大文件,我想(例如)检查 HTTP HEAD 请求的结果,或者尝试使用 HTTP GET 请求开始下载文件然后立即取消并查看the response status code

如何使用 Behat/Mink 做到这一点?

【问题讨论】:

您找到解决方案了吗?我也有同样的问题。 @BaptisteDonaux:不,还没有。 目前我正在尝试测试一个小文件的下载。想我可以做'当我关注“somefile.txt”''那么响应应该包含“sometext”',但大概是因为文件是下载而不是打开的,我只是得到'在任何地方都找不到字符串“sometext”在当前页面的 html 响应中。你知道如何处理这方面的问题吗? @NathanStretch:我也还没弄清楚。我刚刚检查了 HTTP 响应代码。 在阅读和查看代码之后,听起来好像没有预先构建的方法可以做到这一点。您可以扩展 BehatContext 类并添加一个自定义函数,该函数使用 cURL 来获取文件的一部分。 【参考方案1】:

我同意@NathanStretch 关于扩展的看法,所以这就是我所做的。

此示例基于使用http://download.thinkbroadband.com/5MB.zip 作为下载网址。不完美,因为我没有在响应标头中看到文件名,但它确实有内容长度。

<?php

class DownloadContext extends Behat\MinkExtension\Context\RawMinkContext 
  private $headers = [];

  /**
   * @When /^I try to download "([^"]*)"$/
   */
  public function iTryToDownload($url)
  
    $this->headers = get_headers($url);
  

  /**
   * @Then /^I should see in the header "([^"]*)"$/
   */
  public function iShouldSeeInTheHeader($header)
  
    assert(in_array($header, $this->headers), "Did not see \"$header\" in the headers.");
  

使用具有以下内容的 .feature 文件:

  Scenario: Try to download a file
    When I try to download "http://download.thinkbroadband.com/5MB.zip"
    Then I should see in the header "Content-Length: 5242880"

如果您可以自己控制下载,则可以在标题中设置文件名并检查它而不是大小。如果大小可以变化当然更好,因为我认为这意味着必须拆分内容长度字符串,转换为 int 并 然后 进行比较。啊。可能有一个更优雅的解决方案。

希望能有所帮助。

【讨论】:

以上是关于如何有效地测试使用 Behat/Mink 访问大文件?的主要内容,如果未能解决你的问题,请参考以下文章

php Behat + Mink等待模态可见

php Behat + Mink等待模态可见

如何使用 XPath 获取特定表格单元格中的值

2w字的超级大文:自动化测试入门

如何有效地将 Postgres 数据从 Query 传输到 S3

Vue Test Utils & Vue 3:如何有效地测试 onKeyStroke() 事件