与 phpunit 的集成测试:如何提示用户输入?
Integration test with phpunit: How to prompt for user input?
我已经用 phpunit 编写了 单元测试 RESTful API。
现在我想使用 phpunit 进行进一步的集成测试。因为这些要慢得多,所以我构建了一个特殊的测试套件 "integration" ,它必须被显式调用。所以单元测试可以 运行 经常并且保持快速。
集成 测试套件的bootstrap.php
执行数据库转储和播种。集成测试非常慢,因此它们不会像单元测试那样经常被调用。它们只会被人类运行。
为了防止意外删除本地开发数据库,我希望测试脚本在转储数据库之前提示确认。只有在确认后,数据库才会被删除并重新播种。
- 是否可以在phpunit测试中提示输入?
- 提示是否伤害了任何“集成测试的设计原则”?
谢谢。
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 可以。
我已经用 phpunit 编写了 单元测试 RESTful API。
现在我想使用 phpunit 进行进一步的集成测试。因为这些要慢得多,所以我构建了一个特殊的测试套件 "integration" ,它必须被显式调用。所以单元测试可以 运行 经常并且保持快速。
集成 测试套件的bootstrap.php
执行数据库转储和播种。集成测试非常慢,因此它们不会像单元测试那样经常被调用。它们只会被人类运行。
为了防止意外删除本地开发数据库,我希望测试脚本在转储数据库之前提示确认。只有在确认后,数据库才会被删除并重新播种。
- 是否可以在phpunit测试中提示输入?
- 提示是否伤害了任何“集成测试的设计原则”?
谢谢。
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 可以。