Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot run single test with data provider in PHPUnit

Tags:

php

phpunit

I've got a problem when using command line to run tests: if I run phpunit like this:

phpunit -–no-configuration -–filter testAdd DataTest DataProviderTest.php

it works fine. But we use a regular expression to specify exactly the name of the method that we want to be tested:

phpunit -–no-configuration -–filter /::testAdd$/ DataTest DataProviderTest.php

The second approach is not working unfortunately. Source code is:

<?php
class DataTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     */
    public function testAdd($a, $b, $c)
    {
        $this->assertEquals($c, $a + $b);
    }

    public function provider()
    {
        return array(
          array(0, 0, 0),
          array(0, 1, 1),
          array(1, 0, 1),
          array(1, 1, 3)
        );
    }
}

?>
like image 426
vasin Avatar asked Aug 30 '12 09:08

vasin


3 Answers

The regex to handle tests with or without data sets is

phpunit --filter "/::<method>( with data set .*)?$/" <class> <file>

For example

phpunit --filter "/::testAdd( with data set .*)?$/" DataTest DataProviderTest.php

Since a test method won't have a space in the name unless it has a data set, you could really shrink this to

phpunit --filter "/::testAdd( .*)?$/" DataTest DataProviderTest.php
like image 140
David Harkness Avatar answered Oct 26 '22 04:10

David Harkness


Like @sjoerd pointed out the name that gets matched against contains the number of the dataset.

That means that this works:

phpunit --filter "testAdd with data set #0" DataTest DataProviderTest.php

against your file produces:

PHPUnit 3.7.0RC1 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 5.25Mb

OK (1 test, 1 assertion)

tested in PHPUnit 3.5 and upwards.


It's not really pretty and having another syntax for this within PHPUnit is definitely preferable but for now it might solve your problem and once someone sends a PR it will be nicer to use ;)

Tracking issue for the nicer syntax on the phpunit github issue tracker

like image 36
edorian Avatar answered Oct 26 '22 05:10

edorian


By using a data provider with named datasets it's simpler now:

public function provideData()
{
    yield "dataset name 1" => [
        $expected = 0,
        $val1 = 1,
        $val2 = 2
    ];

    yield "dataset name 2" => [...];
}

$ phpunit --filter "dataset name 2"

like image 35
Aurel Avatar answered Oct 26 '22 03:10

Aurel