使用phpunit进行集成测试:如何提示用户输入?

时间:2015-03-16 16:31:24

标签: php phpunit integration-testing

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

现在我想使用phpunit进行进一步的集成测试。由于这些速度慢得多,我建立了一个特殊的测试套件,即集成"必须明确调用。因此,单元测试可以经常运行并保持快速。

集成 testsuite的bootstrap.php执行数据库转储和种子设定。集成测试非常慢,因此不会像单元测试那样经常调用它们。它们只会由人类管理。

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

  1. 是否可以在phpunit测试中提示输入?
  2. 提示是否会损害集成测试的任何" 设计原则"
  3. 谢谢。

1 个答案:

答案 0 :(得分:3)

  

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

基本提示可能如下所示:

<?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";
  

是否可以在phpunit测试中提示输入?

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

  

提示是否会损害任何“集成测试的设计原则”?

在测试期间提示用户数据(“数据输入提示”)将指示真正糟糕的自动化状态。这表明您的测试不准备完全自动化运行。

在测试设置或自举阶段,此提示是“事故保护”,在盒装或隔离的测试环境中不需要它。

最好是努力实现完整的测试自动化,并使用Continuous Integration服务器来运行功能和集成测试。 (就像@halfer之前指出的那样。)

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

嗯,有一些“测试模式”或“最佳实践”。

  • 喜欢(子)对您的TestSuite进行分组,以便在parallel执行时加快速度。
  • 避免“只会由人类运行”测试执行!更好:“完全自动运行”和/或“在10次测试运行中自动运行”。
  • 测试中的数据提示是“测试运行阻止程序”。
  • 基于env或常量并在测试引导期间触发的提示是可以的。