与 phpunit 的集成测试:如何提示用户输入?

Integration test with phpunit: How to prompt for user input?

我已经用 phpunit 编写了 单元测试 RESTful API。

现在我想使用 phpunit 进行进一步的集成测试。因为这些要慢得多,所以我构建了一个特殊的测试套件 "integration" ,它必须被显式调用。所以单元测试可以 运行 经常并且保持快速。

集成 测试套件的bootstrap.php 执行数据库转储和播种。集成测试非常慢,因此它们不会像单元测试那样经常被调用。它们只会被人类运行。

为了防止意外删除本地开发数据库,​​我希望测试脚本在转储数据库之前提示确认。只有在确认后,数据库才会被删除并重新播种。

  1. 是否可以在phpunit测试中提示输入?
  2. 提示是否伤害了任何“集成测试的设计原则”

谢谢。

To prevent an unintended deletion of the local development database I want the testscript to prompt for confirmation before dumping the database. Only if confirmed the database will be deleted and re-seeded.

基本提示可能如下所示:

<?php

echo "Are you sure you want to drop the database?\n";
echo "Type 'yes' or 'y' to continue: ";

$handle = fopen("php://stdin","r"); // read from STDIN
$line = trim(fgets($handle));

if($line !== 'yes' && $line !== 'y'){
    echo "Execution stop.\n";
    exit;
}

echo "\n Continuing execution: dropping database.\n";

Is it possible to prompt for input in phpunit tests?

是的,这是可能的 - 但要注意可能的超时。

Does a prompt hurt any "design principle of integration tests"?

在测试期间提示输入用户数据 ("data entry prompt") 表明自动化状态确实很差。这表明您的测试尚未准备好 运行 完全自动化。

此提示是 "accident protection" 在测试设置或 bootstrap 阶段,在盒装或隔离测试环境中不需要它。

最好争取完全测试自动化并使用持续集成服务器 运行 进行功能和集成测试。 (就像@halfer 之前指出的那样。)

请记住,您还可以检测测试 运行 所在的环境。 当您在 CI 服务器上时,只需跳过提示。

嗯,有一个"testing patterns"或"best practices"。

  • 喜欢(子)分组您的测试套件,以便通过 parallel 加速执行。
  • 避免"will only be run by humans" 测试执行!更好:"runs fully automated" and/or "runs automated in 1 out of 10 test runs".
  • 测试中的数据提示是"Test Run Blocker"。
  • 基于 env 或常量并在测试期间触发的提示 bootstrap 可以。