Storyplayer 1.5 Released

Posted by Stuart Herbert on January 7th, 2014 in Storyplayer.

Storyplayer v1.5 has been released.

The major feature of this release is a complete overhaul of how test devices (such as web browsers) are managed inside Storyplayer, and integration with Sauce Labs for cross-browser testing. It also comes with the usual upgrades to support the latest Selenium Webdriver, Chrome, Chromedriver and Browsermob-Proxy releases. (full changelog)

I’ve also (finally!) completed the manual which covers:

You can add Storyplayer to your projects using Composer – you’ll find the package as datasift/storyplayer – or download as an experimental PHAR. (Please make sure you’ve installed the necessary dependencies first!)

Any problems, please let me know.

Storyplayer is the open-source test automation tool built by DataSift. Use it to bring your user stories to life using plain old PHP #noDSL. Create test environments; deploy code; test with real browsers, shell commands, and any PHP code; and clean up afterwards – all from your tests. Write your tests once, and run them against your dev, test, staging and production environments. Storyplayer ships with 20 modules, including support for Vagrant, Amazon EC2, and ZeroMQ, and can easily be extended with your own plugins.

Be the first to leave a comment »

Storyplayer is DataSift’s test tool for functional and non-functional testing of software and services, built to test at the firehose scale. It sits nicely between PHPUnit for unit testing by developers, and Behat for acceptance testing by product managers.

Earlier this month, I spoke to a packed audience at the PHP London user group meetup about Storyplayer, a test tool that we’ve open-sourced here at DataSift.

Here are the slides from that talk, for everyone who hasn’t yet seen them via Twitter:

If you can’t see the embedded slides in this blog post, they’re available over on SlideShare.

Right now, I’m focused on completing the online documentation (which is very much a work in progress), and preparing v1.1.0 with further improvements.

Comments Off on Storyplayer Slides From PHP London Talk

HubFlow 1.5.1 Released

Posted by Stuart Herbert on March 25th, 2013 in Toolbox.

Over the weekend, I released v1.5.1 of HubFlow – a Git extension that brings the gitflow workflow to GitHub.

The key new features are:

  • New ‘git hf push’ and ‘git hf pull’ commands, which do the right thing no matter which kind of branch you’re working in at the time.
  • No more manual ‘git remote update’ before running HubFlow commands.

There’s also a long list of smaller changes and fixes too – many thanks to everyone who sent in a pull request or logged an issue.

The full ChangeLog is available.

I’m starting to get requests for documentation and portability fixes for Windows users. I don’t run Windows on any of my computers, so if there’s anyone out there who’d be interested in helping out, please let me know!

Be the first to leave a comment »

Free Ebook: Getting Hired

Posted by Stuart Herbert on November 12th, 2012 in 1 - Beginner, Toolbox, Training.

From the Introduction:

“This e-book will hopefully show you how to put yourself across to a prospective employer in a way that makes it easy for them to spot what you have to offer them, to increases your chances of successfully finding a job in the United Kingdom’s computing industry.

“Recruitment processes vary from employer to employer. I’ll take you through the most likely steps that you need to get through. I’ll explain the process from the employer’s perspective first, and then from your point of view as someone applying for a job. A better understanding of what the recruitment process is, and why, will help you avoid the common pitfalls along the way.

“The second part of the book is more about you, about what you need to do to be prepared for when you join the industry, either during an industrial placement year or when you graduate and leave academia. Ours is a multi-disciplined industry where things change rapidly, so to help you prepare, I’ve finished off the book with some lists of the fundamental skills that industry expects you to have before you start your first job.”

Getting Hired is a free ebook released under a Creative Commons licence. I hope you find it useful.


I’ve just published v1.4 of DataSift’s HubFlow Git extension. HubFlow is a branching strategy for Git and GitHub, based on Vincent Driessen’s original GitFlow model.

Changes In This Release

The main change in this release is that you now must merge your feature into the develop branch via a pull-request before using the git hf feature finish command. (You can override this behaviour, and get feature finish to do the merge for you, by using the -f flag).

The full changelog is available on our GitHub pages.

Upgrading From An Older Release

To upgrade to this release, please run:

sudo git hf upgrade

If that doesn’t work (because you’re on an older version of HubFlow that doesn’t have the upgrade command), please re-install:

git clone
cd gitflow
sudo ./
Be the first to leave a comment »

If you’re using Sublime Text 2 w/ my PHPUnit plugin, but you have phpunit installed into a non-standard place (i.e., it isn’t installed into your system path), then keep reading – this change is for you.

You can now tell the PHPUnit plugin where to find phpunit, by adding the following to your PHPUnit.sublime-settings file:

    "path_to_phpunit": "/Users/stuart/build/pear/phpunit"

Tweaking BrowserMob-Proxy

Posted by Stuart Herbert on August 10th, 2012 in Toolbox.

If you’re writing tests for your web-based applications (and if you’re not, I’m sure Chris Hartjes will want a stern word with you …), then you might be using a combination of Selenium 2 / aka Selenium WebDriver and WebMetrics’ BrowserMob-Proxy for your testing.

WebDriver is the latest Selenium API for controlling real web browsers such as Internet Explorer, Firefox and Chrome, and BrowserMob-Proxy adds in essential missing capabilities such as checking HTTP status codes and injecting headers for HTTP Basic Auth.

I’ve recently forked BrowserMob-Proxy on GitHub and started to make tweaks to it for work. Thought I’d mention it, in case anyone else out there is using BrowserMob-Proxy and would find our tweaks useful too. We’ll be submitting our tweaks upstream in due course.

  • Executable JAR – Maven POM file updated to build browsermob-proxy-X.XX-standalone.jar – an executable JAR file – during the ‘package’ phase. Very handy if you’re running and testing it via the remote API. Upstream’s is still available, and is now always built during the ‘install’ phase.
  • /features endpoint – a new REST API endpoint allowing you to GET and POST and DELETE feature flag settings. We’re using this to enable/disable any new features that might break backwards compatibility, in case you want to use existing BrowserMob-Proxy REST clients with our tweaked version. Said REST clients can also use this to see which features are present / enabled.
  • enhancedReplies – by default, BrowserMob-Proxy isn’t the most chatty of REST services. Switch this feature on (POST ‘enhancedReplies=true’ to /config/enhancedReplies), and now every response includes either a ‘success: TRUE’ or an ‘error: TRUE’ field for your client to easily understand what has happened.
  • More logging – we’ve added some additional log messages throughout the ProxyResource REST API, to make it easier to debug browsermob-proxy REST API clients. This logging is off by default, and is switched on by POSTing ‘paramLogs=true’ to /config/paramLogs, and/or POSTING ‘actionLogs=true’ to /config/actionLogs.
  • additional header GET / DELETE API – we’ve extended the REST API for additional HTTP request headers to now allow you to GET /proxy/:port/header/:name and to DELETE /proxy/:port/header/:name if you need to. You can also delete all additional HTTP request headers in one go by DELETE /proxy/:port/headers.
  • REST API for HTTP Basic Auth – BrowserMob-Proxy’s existing support for HTTP Basic Auth is now available via PUT /proxy/:port/basicAuth/:domain. One of the key features missing from WebDriver. (This is a convenience feature; it could be done by injecting the headers directly into BrowserMob-Proxy).
  • exception handling – by default, BrowserMob-Proxy lets exceptions bubble up to the servlet container … which unfortunately sends back HTML errors rather than a JSON error. To make things a little easier for REST clients, I’ve tweaked the REST API to trap exceptions and return back a (hopefully suitable) error class. This will probably need more tweaking before it provides useful information all the time.

Bookmark this page; I’ll be updating it as we complete more tweaks to BrowserMob-Proxy.

1 comment »

At work, we’ve recently published HubFlow: instructions + tools for using Vincent Dreissen’s GitFlow model with GitHub.

The full article is over on the DataSift dev blog.


I’ve recently built a product in Node JS, and it was a very positive experience (more on that in another blog post). I’m now looking around at what I need to do to package it all up for customers and entrepreneurs – hosting, developer meetups, that sort of thing. I’m looking for the wider ecosystem that customers can tap into. I’m a bit surprised at what I found during my research, and I thought I’d share it in case anyone else can add to it.

Why Hosting Matters

Let’s not beat about the bush here. As a rule, Node JS’s target audience probably doesn’t know enough to safely and securely run their own Internet-connected servers. It isn’t their skillset. A customer using Node JS really needs someone to look after all of that for them.

That isn’t a service I want to have to build myself if I don’t have to. For the customers I’m targeting, being able to say, “go there, sign up, and deploy to their cloud, and they’ll look after it all for you” is the right solution for everyone.

Where Is All The Hosting?

With all the buzz and hype around Node JS, it seems reasonable to think that there’d be plenty of cloud providers out there offering Node JS hosting services. Not the “here’s how to install it into a VPS”-type stuff, but a Heroku / Engine Yard-like service targeted at Node JS.

However, a quick Google for “nodejs hosting” turned up the following results on the front page:

  • 1 hosting provider which is public, free, and unable to provision new services when I tried (
  • 3 hosting services in private beta (Nodester, NodeSocket, and NodeJitsu.
  • … and zero paid-for ads offering Node JS hosting. is the hosting service from Joyent, who are the current guardians of the Node JS project itself. Their Node JS product page directs you to the service. But unfortunately, is a limited-capacity service, and you can only get your app on there if you’re lucky enough to catch them when there is spare capacity. Joyent do offer a VPS w/ Node JS pre-installed, but you’d be hard-pressed to find the product if you didn’t know it existed, as it isn’t linked to from their Node JS page at all.

The other three services all look interesting (NodeJitsu in particular caught my eye), but I can’t sit down in a sales meeting today and recommend any of them to a customer, because until they are public services, I can’t be sure that my customers can get a login and get their apps deployed and running.

But what really caught my eye is that no-one seems to be using Google AdWords to advertise their Node JS hosting service right now. That’s a significant smell, and a big surprise to me. I don’t want to draw any conclusions about that, just simply ask the question: does it mean that there’s an opportunity that isn’t being exploited yet, or does it mean that the opportunity isn’t big enough yet for folks to invest in?

Where Are The Community Meet-ups?

As well as hosting, I’m also interested in being able to introduce customers to other Node JS users, preferably through established developer meetup groups. From the customer’s perspective, being part of a community helps them broaden their skills and experience, and potentially helps them find new employees if they start to grow. From my perspective, the most valuable marketing of all is word of mouth, and having customers going to meetups and saying that they’re using our product because it solves their problems is a very important way of finding new customers.

We’re just outside London, which is a veritable hive of startup activity these days. But looking on for existing meetups for Node JS, all I could find is this waiting list. I did find the London Node User Group via Lanyrd, and I plan on trundling over to their next meetup on Wednesday, but that was it.

We seem to have meetups coming out of our ears in London right now on all sorts of technical topics; the lack of ones focused on Node really does stand out.

Thoughts And Conclusions

For a product that has had a lot of sustained buzz, and which is a good solution for some technical problems, the almost complete absence of an ecosystem around Node JS caught me completely by surprise. Are we just ahead of the curve, and using Node JS very early on in its adoption? Are there resources out there that I’ve just failed to find? Or is Node JS actually just another passing trend which failed to get enough traction?

I don’t know. Your thoughts and comments most welcome below!


So that I don’t forget how to do this next time around. Worked for me, your mileage may vary.

First step is to get a working install of PHP.

  1. Download PHP 5.4.latest ZIP file from the PHP Windows website
  2. Unpack the ZIP file into c:php. You should end up with c:phpphp.exe
  3. Copy c:phpphp.ini-development to be c:phpphp.ini
  4. Edit c:phpphp.ini to suit (e.g. set date.timezone)
  5. Make sure you add c:php to your system PATH (via Computer’s Advanced Properties -> Environment Variables)
  6. Reboot (this is Windows, after all 🙂

At this point, you should be able to open up a Command Prompt, and type ‘php -v’, and see the response ‘PHP v5.4.latest …’ appear as expected.

Now for PEAR itself.

  1. Open in a browser, save this file into c:php
  2. In a Command Prompt, cd to c:php and then run “php c:phpgo-pear.phar”
  3. At the prompt, select ‘system’. A text menu of paths will appear
  4. Fix the default path for pear.ini (option 11) to be c:phppear.ini
  5. Fix the default folder to look inside for php.exe to be c:php
  6. Make sure the binaries folder (option 4) is c:php
  7. Check all of the other options, make sure they are prefixed with c:php
  8. Press ENTER, and you should see PEAR downloading various PEAR packages onto your system
  9. Double-click the PEAR_ENV.reg file in c:php
  10. Reboot again to make sure PEAR_ENV registry entries have taken effect

At this point, PEAR is installed and should be available to use in your own projects, or with something like Phix.

Personal Notes

Some reminders to myself for the next time I have to do this.

  • Documentation for PHP for Windows and PEAR for Windows both seem to be out of step with current downloads. There’s currently no Windows installer for PHP available, and the PHP .ZIP file doesn’t contain the ‘go-pear.bat’ file.
  • You have to pay close attention to the default folders offered when running ‘go-pear.phar’. They appear to use the current working directory as the prefix even when installing system-wide, except for the location of pear.ini and php.exe – neither of these defaults are sane, and must be manually changed during the install 🙁
  • After install, pear command doesn’t seem to be 100% compatible with its behaviour on Linux and OS X. -D switch didn’t work, there may be other problems too that I haven’t yet found.
  • Both reboots are required – I’m not taking the piss there – for all running Windows apps to pick up the changes.
Page 1 of 912345...Last »

This Month

July 2020
« Sep