【问题标题】:Run PHPUnit tests on change在更改时运行 PHPUnit 测试
【发布时间】:2013-10-07 13:44:36
【问题描述】:

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

【问题讨论】:

    标签: php testing phpunit gruntjs


    【解决方案1】:

    您可以使用节点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

    【讨论】:

    • 但这会运行 all 测试,在我们的例子中这意味着它们会运行大约 20 分钟。
    • 对于 windows 用户,必须更改 ' 代表 \" 和 / 代表 \\ 像这样: "test": "vendor\\bin\\phpunit tests --colors", "test: watch": "watch \"npm run --silent test\"tests"
    【解决方案2】:

    不久前我写了一篇关于此的博客文章: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
    • 我不知道如何构建python包,我想我应该对bootstrap.py和setup.py做一些事情,但是你能给我一些提示吗?谢谢
    【解决方案3】:

    也许你可以试试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 秒后被终止。

    【讨论】:

      【解决方案4】:

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

      有关文件观察器的更多信息可以在 JetBrains 网络帮助页面上找到:https://www.jetbrains.com/phpstorm/webhelp/using-file-watchers.html

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 这是一个简单而有效的解决方案。谢谢。
        • 如果你想递归地查看你的项目文件夹,只需运行 inotifywait 和 --recursive 选项。
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          你可以通过 composer 运行 composer require --dev icyapril/whats-changed 来获取它

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

          【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 必须为此安装 inotify-tools。也不是很Windows 使用同事友好。我在让目录中的所有 PHP 文件正常工作时遇到问题。你能举个例子吗?
          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-06-03
              • 1970-01-01
              • 2017-10-19
              • 2021-07-02
              • 2020-09-09
              • 2017-08-05
              • 2015-08-28
              • 2011-12-16
              相关资源
              最近更新 更多