每当磁盘上的文件发生更改时,我想运行我的 PHPUnit 测试(或至少其中的一个子集)。非常类似于您可以使用“ grunt watch ”执行的操作。我有一个项目,其中我有 JS 和 PHP,并且正在使用 Grunt。在那里,我使用 grunt watch 让 PHPUnit 在我的 JS 测试之上运行。虽然这很好用,但在仅 PHP 的项目中执行此操作似乎非常麻烦。我需要引入 grunt,并添加对 node.js 的依赖。另外,我有很多这样的 PHP 项目。因此,一个更简单的解决方案是有序的。
10 回答
您可以使用watch
非常可爱的节点:
运行npm init
设置一个包(需要一分钟),然后
npm install --save-dev watch
然后编辑您的package.json
文件以包含这两个条目:
"scripts": {
"test": "bin/phpunit tests --color",
"test:watch": "watch 'npm run --silent test' ."
},
然后触发观看:
npm run test:watch
(归功于这篇有趣的文章)
不久前我写了一篇关于此的博客文章:http: //edorian.github.io/2010-03-11-running-your-unit-tests-everytime-you-save-a-file/
最基本的命令是:
pywatch phpunit .
这意味着“监视此目录及以下目录中的所有文件的更改,如果其中一个更改运行 PHPUnit ”。
如果您有很多文件(资产等)可能会变慢,那么更好/更快的版本是:
find -name '*.php' | xargs pywatch "./runSuite.sh"
仅监视.php
文件更改
也许你可以试试phpunit-watcher
。https://packagist.org/packages/spatie/phpunit-watcher
首先,使用 安装phpunit-watcher
,composer require spatie/phpunit-watcher --dev
然后修改composer.json
以在属性中添加一项scripts
:
{
"scripts" : {
"test" : "./vendor/bin/phpunit-watcher watch --bootstrap vendor/autoload.php tests/"
}
}
然后,您可以使用以下命令运行测试用例:composer test
.
有时,您应该运行composer run test --timeout=0
,否则该进程将在 300 秒后被终止。
在 PHPStorm 中,您可以配置 File Watcher,它会在文件修改时为您执行 shell 命令。例如,您可以拥有一个 File Watcher,它将在 php 文件修改时触发,并运行 phpunit 命令以及所有必要的命令。
有关文件观察器的更多信息,请参见 JetBrains 网络帮助页面:https ://www.jetbrains.com/phpstorm/webhelp/using-file-watchers.html
使用 inotifywait 和 bash 脚本的一种非常简单的方法:
#!/bin/bash
while true; do
FILE=$(inotifywait --exclude=".*.*sw*" --exclude="4913" ./ --format "%w%f" -e close_write) &&
clear &&
phpunit --color $FILE
done
然后你只需在终端中运行它(或者你想要的),你就很好了。我正在运行 tmux,所以我只设置了一个堆叠窗格,有一个小窗口可以查看我的测试结果。只需在测试所在的目录中运行此脚本即可。
对我来说效果很好。
此外,这个脚本对 Vim 很友好(Vim 创建一个文件 4913,在保存期间,这个脚本会忽略它)。
它完全受到网络上各个地方的启发——甚至可能来自其中一些答案。
安装 grunt 并使用https://github.com/SaschaGalley/grunt-phpunit
然后,您将在 watch 任务下设置 phpunit 任务。这就是我现在的做法。
我已经创建了一个解决方案来处理这个问题:“发生了什么变化? ”简而言之,在某些情况下,您有一些非常大的测试套件,而您只想运行与已更改的类相关的测试。
您可以通过运行通过作曲家将其拉入composer require --dev icyapril/whats-changed
有了这个,只需运行./vendor/bin/whatschanged
,只有在上次提交或工作目录中更改的文件才会运行。魔法!
您可以使用inotifywait
,请参阅https://speakerdeck.com/rowan_m/building-better-developers-2?slide=31以获取 PHPUnit 示例。
我找到了phpunit-testrunner节点包,它对我的问题很有用。每个 PHP 项目一个配置 json 文件,任何安装了 node 包的人都可以使用它。也可以跨平台。虽然仍然需要节点,所以不是一个理想的解决方案。
我发现这个解决方案使用 node+gulp
0. install node
1. npm init
2. npm install gulp --save-dev
创建一个 gulpfile.js 并把它
var gulp = require('gulp'),
util = require('util'),
exec = require('child_process').exec;
gulp.task('phpunit', function() {
exec('phpunit -c my_project_name/App', function(error, stdout) {
util.puts(stdout);
});
});
gulp.task('default',['phpunit'], function() {
gulp.watch('my_project_name/**/*.php', ['phpunit']);
});
my_project_name/App 是所有源代码的路径
如果添加扩展名在默认任务上添加这一行
gulp.watch('my_project_name/ /*.otherext ', ['phpunit']);
编辑 php 文件后运行 phpunit 测试