18

每当磁盘上的文件发生更改时,我想运行我的 PHPUnit 测试(或至少其中的一个子集)。非常类似于您可以使用“ grunt watch ”执行的操作。我有一个项目,其中我有 JS 和 PHP,并且正在使用 Grunt。在那里,我使用 grunt watch 让 PHPUnit 在我的 JS 测试之上运行。虽然这很好用,但在仅 PHP 的项目中执行此操作似乎非常麻烦。我需要引入 grunt,并添加对 node.js 的依赖。另外,我有很多这样的 PHP 项目。因此,一个更简单的解决方案是有序的。

4

10 回答 10

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

(归功于这篇有趣的文章

于 2016-12-25T12:39:53.237 回答
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文件更改

于 2013-10-08T16:28:54.043 回答
4

也许你可以试试phpunit-watcherhttps://packagist.org/packages/spatie/phpunit-watcher

首先,使用 安装phpunit-watchercomposer 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 秒后被终止。

于 2018-02-28T10:07:17.850 回答
3

在 PHPStorm 中,您可以配置 File Watcher,它会在文件修改时为您执行 shell 命令。例如,您可以拥有一个 File Watcher,它将在 php 文件修改时触发,并运行 phpunit 命令以及所有必要的命令。

有关文件观察器的更多信息,请参见 JetBrains 网络帮助页面:https ://www.jetbrains.com/phpstorm/webhelp/using-file-watchers.html

于 2014-01-13T15:58:12.350 回答
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,在保存期间,这个脚本会忽略它)。

它完全受到网络上各个地方的启发——甚至可能来自其中一些答案。

于 2014-12-12T15:43:45.567 回答
2

安装 grunt 并使用https://github.com/SaschaGalley/grunt-phpunit

然后,您将在 watch 任务下设置 phpunit 任务。这就是我现在的做法。

于 2013-12-23T22:25:58.163 回答
2

我已经创建了一个解决方案来处理这个问题:“发生了什么变化? ”简而言之,在某些情况下,您有一些非常大的测试套件,而您只想运行与已更改的类相关的测试。

您可以通过运行通过作曲家将其拉入composer require --dev icyapril/whats-changed

有了这个,只需运行./vendor/bin/whatschanged,只有在上次提交或工作目录中更改的文件才会运行。魔法!

What's Changed 成功运行

于 2017-05-14T17:01:17.857 回答
1

您可以使用inotifywait,请参阅https://speakerdeck.com/rowan_m/building-better-developers-2?slide=31以获取 PHPUnit 示例。

于 2013-10-07T13:53:52.620 回答
0

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

于 2013-10-07T14:11:17.080 回答
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 测试

于 2016-11-11T14:18:42.857 回答