如何在PHPUnit中以编程方式对测试函数进行排序?

I'm using PHPUnit to test a class that has many functions. The PHPUnit framework runs the test functions from the top to the bottom.

The question is: How can I run the test functions in a specified order without reorder then in the source code.

To clarify the issue, imagine we have 5 test functions;

  • testFunc1
  • testFunc2
  • testFunc3
  • testFunc4
  • testFunc5

The framework will run testFunc1 then testFunc2 until it reaches testFunc5.

However, I want to run testFunc3 then testFunc1 then testFunc5 then testFunc2 then testFunc4 without reordering them in the source file.

PHPUnit will execute the tests in the exact order they are written in your *_TestCase class.

Every one of those tests should be able to run in isolation and not depend on some other test beeing executed before it.

If you have issues testing against a Database I'd suggest using somethig like this:

class MyTest extends PHPUnit_Framework_TestCase {

    public function setUp() {
        // REPLACE INTO testDb (ID, NAME, VALUE) VALUES (1001000, 'testing', 'value')
        $this->db = $db_connection;
    }

    public function tearDown() {
        // DELETE FROM testDb WHERE ID > 10010000 // or something like this
    }

    public function testSelect() {
        $this->assertSame("value", $this->db->getId(100100));
    }

    /**
     * @depends testSelect
     */
    public function testInsert() {
        $this->db->insertById(1001111, "mytest", "myvalue");
        $this->db->getId(1001111);
    }

    /**
     * @depends testSelect
     */
    public function testDelete() {
        $this->db->deleteById(1001000);
        $this->assertNull($this->db->getId(10010000);
    }

    // and so on
}

The setUp() method will be run before every testcase and make sure all the values most testcases need are there, the tearDown() will clean up after the testsuite.

The @depends annotation will make sure that the insert test isn't run when the select test fails. (If you can't load values then inserting new ones and getting those can't work ether, no need to try it).

For that also check the manual on test dependencies

The whole point of unit tests are actually in the name itself, Unit Testing. They function on their own and have no dependencies whatsoever on each other. If you code your tests right, order of execution should not matter.

If it is a matter of a database issue, make sure you have a clean database before every test.

Right now there's no way to do it short of reordering the functions in the file. There's a feature request to use the @depends annotations to reorder the tests, and the PHPUnit author has expressed a desire to do it. You can comment on the request at PHPUnit's github tracker.