在更改时运行PHPUnit测试

19

我希望能够在磁盘上的文件改变时运行我的PHPUnit测试(或者至少是它们的子集)。这非常类似于您可以使用"grunt watch"做的事情。我有一个项目,其中包括JS和PHP,并且正在使用Grunt。在那里,我通过shell调用PHPUnit,在使用grunt watch运行JS测试的基础上运行它。虽然这很好用,但在仅限于PHP的项目中执行此操作似乎过于麻烦。我需要引入grunt并添加一个对node的依赖项。此外,我有许多这样的PHP项目。因此,需要一个更简单的解决方案。

10个回答

13

你可以使用Node.js的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

(感谢这篇有趣的文章提供的灵感)


1
但这将运行所有测试,这意味着在我们的情况下它们将运行约20分钟。 - floriank
1
对于Windows用户,需要像这样将'更改为",并将/更改为\: "test": "vendor\bin\phpunit tests --colors", "test:watch": "watch "npm run --silent test" tests" - Iván Quiñones

5
我曾经写过一篇关于这个问题的博客文章: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文件的更改。


或者只需 pywatch "./runSuite.sh" ./tests/*/*.php - Kzqai
我不知道如何构建Python包,我猜我应该在bootstrap.py和setup.py中做些什么,但你能给我一些提示吗? 谢谢 - Daniele Cruciani

4
也许你可以尝试使用 phpunit-watcher。首先,通过 composer require spatie/phpunit-watcher --dev 安装 phpunit-watcher,然后修改 composer.json 文件,在 scripts 属性中添加一项。参考链接:https://packagist.org/packages/spatie/phpunit-watcher
{
    "scripts" : {
        "test" : "./vendor/bin/phpunit-watcher watch --bootstrap vendor/autoload.php tests/"
    }
}

然后,你可以运行以下测试用例:composer test

有时候,你需要运行composer run test --timeout=0,否则进程会在300秒后被终止。


3
使用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,此脚本忽略它)。

这个脚本的灵感来自于网络上的各个地方,可能甚至包括一些答案。


这是一个非常简单且有效的解决方案。谢谢。 - Thomas Praxl
如果你想递归地观察你的项目文件夹,只需使用--recursive选项运行inotifywait即可。 - Thomas Praxl

3
在PHPStorm中,您可以配置文件监视器,在文件修改时为您执行shell命令。例如,您可以拥有一个文件监视器,在php文件修改时触发,并使用所有必要的命令运行phpunit命令。
有关文件监视器的更多信息,请参阅JetBrains网页帮助页面:https://www.jetbrains.com/phpstorm/webhelp/using-file-watchers.html

2
我已经创建了一个解决方案来处理这个问题:“什么改变了?” 简而言之,有些情况下你有一些非常大的测试套件,你只想运行与已更改的类相关的测试。
您可以通过运行composer require --dev icyapril/whats-changed将其拉入Composer中。
有了这个解决方案,只需运行./vendor/bin/whatschanged,就会运行上次提交或工作目录中更改的文件。神奇!

What's Changed running successfully


默认情况下需要在特定路径上安装 gitprivate $binary = '/usr/bin/git'; 但即使如此,仍有一些问题不能直接解决。https://github.com/IcyApril/WhatsChanged/issues/3 - Vladimir Vukanac

2

1

为此必须安装inotify-tools。而且不太适合使用Windows的同事。我在尝试让它正常工作以处理目录中的所有PHP文件时遇到了问题。你能提供一个例子吗? - Jeroen De Dauw

0
我找到了phpunit-testrunner节点包,它对我的问题很有用。每个PHP项目都有一个配置JSON文件,任何安装了节点包的人都可以使用它。还跨平台。但仍需要节点,因此不是理想的解决方案。

0

我发现了一个使用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 测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接