跳到内容

创建 Bug 重现器

编辑此页

Symfony 主要代码仓库每年收到数千个问题报告。其中一些问题很容易理解,无需任何其他信息即可修复。但是,其他问题更难理解,因为开发人员无法在他们的计算机上重现它们。这时我们会要求你创建一个“bug 重现器”,它是使 bug 在执行时出现的最小代码量。

重现简单 Bug

如果你报告的 bug 与在 Symfony 框架之外使用的某些 Symfony 组件有关,则只需共享一个小的 PHP 脚本,该脚本在执行时会显示该 bug。

1
2
3
4
5
6
7
8
9
10
11
12
13
// First, run "composer require symfony/validator"
// Then, execute this file:
<?php
require_once __DIR__.'/vendor/autoload.php';
use Symfony\Component\Validator\Constraints;

$wrongUrl = 'http://example.com/exploit.html?<script>alert(1);</script>';
$urlValidator = new Constraints\UrlValidator();
$urlConstraint = new Constraints\Url();

// The URL is wrong, so var_dump() should display an error, but it displays
// "null" instead because there is no context to build a validator violation
var_dump($urlValidator->validate($wrongUrl, $urlConstraint));

重现复杂 Bug

如果 bug 与 Symfony 框架有关,或者创建 PHP 脚本太复杂,则最好通过创建一个新项目来重现该 bug。为此

  1. 创建一个新项目
1
$ composer create-project symfony/skeleton bug_app
  1. 添加并提交 Symfony 生成的更改。
  2. 现在你必须添加最少量的代码来重现 bug。这是最棘手的部分,稍后会详细解释。
  3. 添加并提交你的更改。
  4. 在 GitHub 上创建一个新仓库(给它任何名称)。
  5. 按照 GitHub 上的说明将 origin 远程仓库添加到你的本地项目并推送它。
  6. 在你的原始问题报告中添加评论,分享你的 fork 项目的 URL(例如 https://github.com/YOUR-GITHUB-USERNAME/symfony_issue_23567),并在必要时解释重现步骤(例如“浏览此 URL”,“在此表单中填写数据并提交”等)。

添加最少量的代码

创建 bug 重现器的关键是只关注你怀疑失败的功能。例如,假设你怀疑 bug 与路由定义有关。然后,在创建你的项目之后

  1. 不要编辑任何默认的 Symfony 配置选项。
  2. 不要复制你的原始应用程序代码,也不要使用与你的原始应用程序中相同的控制器、操作等结构。
  3. 创建一个小控制器并添加显示 bug 的路由定义。
  4. 不要创建或修改任何其他文件。
  5. 安装 Symfony 提供的本地 Web 服务器,并使用 symfony server:start 命令浏览到新路由,看看 bug 是否出现。
  6. 如果你能看到 bug,你就完成了,并且可以与我们分享代码了。
  7. 如果你无法看到 bug,你必须继续进行小的更改。例如,如果你的原始路由是使用 XML 定义的,请忘记之前的路由,而是使用 XML 定义路由。或者你的应用程序可能注册了一些事件监听器,而这才是真正的 bug 所在。在这种情况下,添加一个类似于你的实际应用程序的事件监听器,看看是否可以找到 bug。

简而言之,其想法是不断向新项目添加小的增量更改,直到你可以重现该 bug。

这项工作,包括代码示例,均根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本