If you have a Dusk test suite of reasonable size, I guarantee you there are a few pesky tests that fail intermittently and unpredictably. If you’ve ever tried to manipulate a DatePicker or a Select2 dropdown from Dusk, you know exactly what I’m talking about.
Let me show you a little trick I use (2 lines of code) that will automatically run your test again if it fails. This can save you from loads of false-negatives.
Drumroll, please… Introducing…
Laravel’s retry()
helper function!
It’s a little helper function that catches exceptions and re-runs the provided code however many times you specify. Check it out:
Before:
class IsAcceptanceTestingEvenWorthIt extends TestCase
{
/** @test */
public function select_something_from_a_freaking_dropdown()
{
$this->browse(function ($browser) {
$browser->visit('/some-page')
->click('div > .select2 > .select2sucksatnamingclasses')
->waitFor('.select2 > .select2options > .ifihadanickleforeverytimeipunchedawalldealingwiththesekindsoftests')
->click('.select2 > .select2options > .ifihadanickleforeverytimeipunchedawalldealingwiththesekindsoftests');
});
}
}
After:
class IsAcceptanceTestingEvenWorthIt extends TestCase
{
/** @test */
public function select_something_from_a_freaking_dropdown()
{
retry($times = 2, function () {
$this->browse(function ($browser) {
$browser->visit('/some-page')
->click('div > .select2 > .select2sucksatnamingclasses')
->waitFor($selector = '.select2 > .select2options > .ifihadanickleforeverytimeipunchedawalldealingwiththesekindsoftests')
->click($selector);
});
});
}
}
That’s it! Not the most beauteous bit of code I’ve ever written, but it does the job.
Fair warning: this is most definitely a band-aid. If you find yourself relying on this often, you probably need to re-evaluate your testing strategy. Treat this more like a last-resort kind of thing.
Hope you found something useful here!
TTFN,
I send out an email every so often about cool stuff I'm working on or launching. If you dig, go ahead and sign up!