2013-10-07 88 views
11

每當文件在磁盤上發生更改時,我都想運行我的PHPUnit測試(或至少它們的子集)。非常類似於你可以用「grunt watch」做的事情。我有一個項目,我擁有JS和PHP,並使用Grunt。在那裏我掏出PHPUnit使它運行在使用grunt watch的JS測試之上。雖然這很好,但在PHP only項目中這樣做很麻煩。我需要引入grunt,並添加對節點的依賴。另外我有很多這樣的PHP項目。因此一個更簡單的解決方案是爲了。在變化時運行PHPUnit測試

回答

0

我發現了phpunit-testrunner節點包,這對我的問題有用。每個PHP項目一個配置json文件,然後可以由安裝了節點包的任何人使用。也跨平臺。仍然需要節點,所以不是一個理想的解決方案。

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文件

+0

或者只是'pywatch「./runSuite.sh」./tests/*/*。php' – Kzqai

+0

我不知道如何構建python包,我想我應該對bootstrap.py和setup.py做些什麼,但是你能給我一些提示嗎? 謝謝 –

2

在PHPStorm中,您可以配置文件查看器,在文件修改時爲您執行shell命令。例如,你可以有一個File Watcher,它將觸發php文件修改,並將運行帶有所有必要命令的phpunit命令。

有關文件看守

更多信息,可以JetBrains的網站幫助頁面上找到:https://www.jetbrains.com/phpstorm/webhelp/using-file-watchers.html

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,這個腳本忽略它)。

它完全受到了來自網絡各個地方的啓發 - 甚至可能來自其中一些答案。

+0

這是一個非常簡單和偉大的工作解決方案。謝謝。 –

+0

如果您想遞歸觀看項目文件夾,只需使用'--recursive'選項運行inotifywait。 –

0

我發現這個溶液使用節點+吞

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 /應用程序是所有源代碼

如果添加路徑擴展將此行添加到默認任務

gulp.watch('my_project_name//*.otherext',['phpunit']);

後編輯PHP文件運行PHPUnit的測試

5

您可以使用節點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

+0

但是,這將運行*所有*測試,在我們的情況下,這意味着他們將運行約20分鐘。 – burzum

2

我創建了一個解決方案來處理這個問題非常 「What's Changed?」 總之,有些情況下你有一些非常大的測試套件,並且你只想運行與已經改變的類相關的測試。

您可以通過運行composer require --dev icyapril/whats-changed

有了這個地方只是運行./vendor/bin/whatschanged通過作曲家拉這隻有在文件中上次提交或在您的工作目錄將被運行改變。魔法!

What's Changed running successfully

+0

默認情況下,它需要'git'安裝在特定的路由上。 'private $ binary ='/ usr/bin/git';' 但即使這樣,一些東西並不是開箱即用的。 https://github.com/IcyApril/WhatsChanged/issues/3 –

1

也許你可以試試phpunit-watcherhttps://packagist.org/packages/spatie/phpunit-watcher

首先,安裝phpunit-watchercomposer require spatie/phpunit-watcher --dev,然後修改composer.jsonscripts屬性添加一個項目:composer test

{ 
    "scripts" : { 
     "test" : "./vendor/bin/phpunit-watcher watch --bootstrap vendor/autoload.php tests/" 
    } 
} 

然後,您可以運行測試用例。

有時,您應該運行composer run test --timeout=0,否則該過程將在300秒後終止。