Question

When one starts searching for PHP unit tests, one usually stumbles upon:

  1. PHPUnit.
  2. SimpleTest.
  3. A plethora of blogs explaining how to use PHPUnit and SimpleTest.
  4. StackOverflow questions about PHPUnit and SimpleTest...

...and I think you get the idea.

I was wondering: How does one go about unit testing with plain ol' PHP? Is that even a wise endeavor?

I suppose I would have to build my own little framework. I'm interested because I want to have a better understanding of what's going on in my unit tests. I'm also interested because I think a lightweight, tailored solution would run my tests faster.

Bonus question: Who's the underdog? Is there a third framework worth looking into (for acedemic purposes)?

Was it helpful?

Solution

Unit testing is basically a set of assertions.

Consider the following PHPUnit test case:

class MyTest extends PHPUnit_Framework_TestCase {
   public function testFoo() {
       $obj = new My;
       $this->assertEquals('bar', $obj->foo());
   }
}

You can have a similar test case without using PHPUnit:

class MyTest {
   public function testFoo() {
       $obj = new My;
       assert("$obj->foo() == 'bar'");
   }
}

However, by doing it without a framework, you will have to manually create an instance of the test case (MyTest) and call each test method manually (MyTest::testFoo, etc.).

The framework (e.g.: PHPUnit) is nothing more than a set of "helpers" to make it easier and faster: by automatically generating skeleton; with built-in mock objects, command lines scripts, etc.

You can still unit test without a framework, but in the end, you'll probably save more time using one, because after all, that's generally what frameworks are for.

OTHER TIPS

My view would be what's so wrong with the standard wheel (PHPUnit in all probability) that warrants the development of a replacement? After all, Isn't a proven solution the wiser choice in this instance?

Additionally, the output of the standard tools will be easier to use if you ever want to take advantage of a Continuous Integration server further down the line. (You could of course make your own tool output in an identical format, but that leads me back to the "why re-invent the wheel" argument.)

I've used SimpleTest about a year ago and it's very lightweight. There really wasn't much to it except providing you a way to auto-load test packages and assert.

Essentially it included all classes starting with "test" and it would call all methods starting with "test" inside that class. Inside the methods you could assert the results are what you expected.

If you were to build your own framework, I would strongly recommend looking into SimpleTest before. It's very lightweight compared to PHP Unit (if that's what scares you).

You can write tests in any language without a framework, but the code you write that you share in your tests will end up being a kind of mini-framework anyhow.

A good unit testing framework will have the common stuff that you need to make testing easier, such as assertions, mocks, stubs, exception handling and code coverage.

Bonus question: Who's the underdog? Is there a third framework worth looking into (for acedemic purposes)?

There are underdogs in the PHP unit testing space, for example Enhance PHP, which is a unit-testing framework with mocks and stubs built in. It has some advantages over the big players - it has good documentation and is very quick to get started on.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top