在更改时运行PHPUnit测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在更改时运行PHPUnit测试相关的知识,希望对你有一定的参考价值。

每当文件在磁盘上发生变化时,我都想运行我的phpUnit测试(或者至少是它们的一部分)。非常类似于你可以用“grunt watch”做什么。我有一个项目,我有JS和PHP,并使用Grunt。在那里我向PHPUnit发出请求,让它在我使用grunt watch的JS测试之上运行。虽然这样做很好,但在仅PHP项目中执行此操作似乎非常麻烦。我需要引入grunt,并在节点上添加依赖项。另外,我有很多这样的PHP项目。因此,更简单的解决方案是有序的。

答案

你可以使用非常甜的节点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

(由于this interesting article的信用)

另一答案

我发现这个解决方案使用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测试

另一答案

我前段时间写了一篇博文: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文件的更改

另一答案

使用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,在保存期间,此脚本忽略它)。

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

另一答案

也许你可以试试phpunit-watcherhttps://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秒后被杀死。

另一答案

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

然后你用watch任务设置phpunit任务。这就是我现在这样做的方式。

另一答案

在PHPStorm中,您可以配置文件监视器,它将在文件修改时为您执行shell命令。例如,您可以拥有一个将在php文件修改时触发的文件监视器,并将使用所有必需的命令运行phpunit命令。

有关File Watchers的更多信息,请访问JetBrains网页帮助页面:https://www.jetbrains.com/phpstorm/webhelp/using-file-watchers.html

另一答案

我已经创建了一个解决这个问题的解决方案:“What's Changed?”简而言之,有些情况下你有一些非常大的测试套件,你只想运行与已经改变的类相关的测试。

你可以通过运行composer require --dev icyapril/whats-changed来解决这个问题

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

What's Changed running successfully

另一答案

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

另一答案

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

以上是关于在更改时运行PHPUnit测试的主要内容,如果未能解决你的问题,请参考以下文章

在单独的进程中运行测试时,PHPUnit 无法生成代码覆盖率

如何让 PHPUnit 等待条件测试?

PHPUnit - 使用配置文件时“未执行测试”

在 Laravel 8 中运行多个 PHPUnit 测试时出错

Composer 自动加载器在运行测试时找不到 PHPUnit

在 Gitlab CI 上更改 Xdebug 模式 PHP Docker