In this article you’ll learn how to run your PHPUnit tests whenever a PHP file changes. This is useful if you don’t use an IDE that does this or want to share the results during a pairing session where only one party has access to a PHP execution environment.
With the command line tool entr
you
can watch for changes in a list of files and run a command whenever one of
the files changes. You must provide entr
with a list of files. To
generate the list of files, you can use the find
command. Combining
find
, entr
and phpunit
in a typical PHP project (with files in src
and test
) looks like this:
find -f tests src -name '*.php' | entr -s 'vendor/bin/phpunit'
entr
will react to any file change, so if you have a big project with
long-running tests, you might want to use the --filter
parameter for the
PHPUnit command and use more specific directories in the find
command.
Additionally to its terminal output, PHPUnit can also generate an HTML
report with the argument --testdox-html report/index.html
. You can name
this anything you want, but make sure you avoid checking in the report in
your version control.
You can open the HTML file in your browser, but if you want to refresh it
automatically after each run of PHPUnit, you need a web server that sends
a “refresh” signal to the browser the file report/index.html
changes.
I recommend using browser-sync for that. After
installing with npm install -g browser-sync
, you can serve the report with
browser-sync start --server --serveStatic web --files report/index.html
You’ll need two terminal windows or a terminal multiplexer like
tmux
to run both entr
and
browser-sync
at the same time.
Sharing the output with a pairing partner
I like to use VS Code for my pairing sessions, together with the LiveShare plugin. Additionally to sharing your code, Liveshare allows to share terminal contents.
Other options for sharing a read-only terminal are tmate, a tmux fork that allows sharing of interactive and read-only terminals via an SSH proxy, and streamhut which “streams” your terminal output to a web page.
You can also use the “Share Server” feature of VS Code LiveShare or a tool
like ngrok or
localtunnel to share your local web
server with the PHPUnit HTML report for the duration of your pairing
session. The automatic refresh of browser-sync
might break for your
coding partner, though.