26
26
<div class="chapter" title="Chapter 4. Writing Tests for PHPUnit"><div class="titlepage"><div><div><h2 class="title"><a id="writing-tests-for-phpunit"></a>Chapter 4. Writing Tests for PHPUnit</h2></div></div></div><p>
27
<a id="id2553118" class="indexterm"></a>
27
<a id="id2555557" class="indexterm"></a>
29
29
<a class="xref" href="writing-tests-for-phpunit.html#writing-tests-for-phpunit.examples.StackTest.php" title="Example 4.1: Testing array operations with PHPUnit">Example 4.1</a> shows
30
30
how we can write tests using PHPUnit that exercice PHP's array operations.
31
31
The example introduces the basic conventions and steps for writing tests
33
</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>The tests for a class <code class="literal">Class</code> go into a class <code class="literal">ClassTest</code>.</p></li><li class="listitem"><p><code class="literal">ClassTest</code> inherits (most of the time) from <code class="literal">PHPUnit_Framework_TestCase</code>.</p></li><li class="listitem"><a id="id2553876" class="indexterm"></a><a id="id2553881" class="indexterm"></a><p>The tests are public methods that are named <code class="literal">test*</code>.</p><p><a id="id2553896" class="indexterm"></a>Alternatively, you can use the <code class="literal">@test</code> annotation in a method's docblock to mark it as a test method.</p></li><li class="listitem"><p>Inside the test methods, assertion methods such as <code class="literal">assertEquals()</code> (see <a class="xref" href="api.html#api.assert" title="PHPUnit_Framework_Assert">the section called “PHPUnit_Framework_Assert”</a>) are used to assert that an actual value matches an expected value.</p></li></ol></div><div class="example"><a id="writing-tests-for-phpunit.examples.StackTest.php"></a><p class="title"><b>Example 4.1: Testing array operations with PHPUnit</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">require_once</span><span class="default"> </span><span class="string">'PHPUnit/Framework.php'</span><span class="keyword">;</span><br /> <br /><span class="keyword">class</span><span class="default"> </span><span class="default">StackTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testPushAndPop</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">$stack</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="keyword">array</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="default">0</span><span class="keyword">,</span><span class="default"> </span><span class="default">count</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /> <br /><span class="default"> </span><span class="default">array_push</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">,</span><span class="default"> </span><span class="string">'foo'</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="string">'foo'</span><span class="keyword">,</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">[</span><span class="default">count</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">-</span><span class="default">1</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="default">1</span><span class="keyword">,</span><span class="default"> </span><span class="default">count</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /> <br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="string">'foo'</span><span class="keyword">,</span><span class="default"> </span><span class="default">array_pop</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="default">0</span><span class="keyword">,</span><span class="default"> </span><span class="default">count</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre></div></div><br class="example-break"></br><div class="blockquote"><table border="0" width="100%" cellspacing="0" cellpadding="0" class="blockquote" summary="Block quote"><tr><td width="10%" valign="top"> </td><td width="80%" valign="top"><p>
33
</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>The tests for a class <code class="literal">Class</code> go into a class <code class="literal">ClassTest</code>.</p></li><li class="listitem"><p><code class="literal">ClassTest</code> inherits (most of the time) from <code class="literal">PHPUnit_Framework_TestCase</code>.</p></li><li class="listitem"><a id="id2555574" class="indexterm"></a><a id="id2555580" class="indexterm"></a><p>The tests are public methods that are named <code class="literal">test*</code>.</p><p><a id="id2555596" class="indexterm"></a>Alternatively, you can use the <code class="literal">@test</code> annotation in a method's docblock to mark it as a test method.</p></li><li class="listitem"><p>Inside the test methods, assertion methods such as <code class="literal">assertEquals()</code> (see <a class="xref" href="api.html#api.assert" title="PHPUnit_Framework_Assert">the section called “PHPUnit_Framework_Assert”</a>) are used to assert that an actual value matches an expected value.</p></li></ol></div><div class="example"><a id="writing-tests-for-phpunit.examples.StackTest.php"></a><p class="title"><b>Example 4.1: Testing array operations with PHPUnit</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">class</span><span class="default"> </span><span class="default">StackTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testPushAndPop</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">$stack</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="keyword">array</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="default">0</span><span class="keyword">,</span><span class="default"> </span><span class="default">count</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /> <br /><span class="default"> </span><span class="default">array_push</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">,</span><span class="default"> </span><span class="string">'foo'</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="string">'foo'</span><span class="keyword">,</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">[</span><span class="default">count</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">-</span><span class="default">1</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="default">1</span><span class="keyword">,</span><span class="default"> </span><span class="default">count</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /> <br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="string">'foo'</span><span class="keyword">,</span><span class="default"> </span><span class="default">array_pop</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="default">0</span><span class="keyword">,</span><span class="default"> </span><span class="default">count</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre></div></div><br class="example-break"></br><div class="blockquote"><table border="0" width="100%" cellspacing="0" cellpadding="0" class="blockquote" summary="Block quote"><tr><td width="10%" valign="top"> </td><td width="80%" valign="top"><p>
34
34
Whenever you are tempted to type something into a
35
35
<code class="literal">print</code> statement or a debugger expression, write it
44
44
there are implicit dependencies between test methods, hidden in the
45
45
implementation scenario of a test.
46
46
</p></td><td width="10%" valign="top"> </td></tr><tr><td width="10%" valign="top"> </td><td colspan="2" align="right" valign="top">--<span class="attribution">Adrian Kuhn et. al.</span></td></tr></table></div><p>
47
<a id="id2553999" class="indexterm"></a>
47
<a id="id2556239" class="indexterm"></a>
49
49
PHPUnit supports the declaration of explicit dependencies between test
50
50
methods. Such dependencies do not define the order in which the test
51
51
methods are to be executed but they allow the returning of an instance of
52
52
the test fixture by a producer and passing it to the dependent consumers.
53
53
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>A producer is a test method that yields its unit under test as return value.</p></li><li class="listitem"><p>A consumer is a test method that depends on one or more producers and their return values.</p></li></ul></div><p>
54
<a id="id2554029" class="indexterm"></a>
55
<a id="id2554035" class="indexterm"></a>
54
<a id="id2556269" class="indexterm"></a>
55
<a id="id2556275" class="indexterm"></a>
57
57
<a class="xref" href="writing-tests-for-phpunit.html#writing-tests-for-phpunit.examples.StackTest2.php" title="Example 4.2: Using the @depends annotation to express dependencies">Example 4.2</a> shows
58
58
how to use the <code class="literal">@depends</code> annotation to express
59
59
dependencies between test methods.
60
</p><div class="example"><a id="writing-tests-for-phpunit.examples.StackTest2.php"></a><p class="title"><b>Example 4.2: Using the <code class="literal">@depends</code> annotation to express dependencies</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">class</span><span class="default"> </span><span class="default">StackTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testEmpty</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">$stack</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="keyword">array</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertTrue</span><span class="keyword">(</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /> <br /><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /> <br /><span class="default"> </span><span class="comment">/**</span><br /><span class="comment"> * @depends testEmpty</span><br /><span class="comment"> */</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testPush</span><span class="keyword">(</span><span class="keyword">array</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">array_push</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">,</span><span class="default"> </span><span class="string">'foo'</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="string">'foo'</span><span class="keyword">,</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">[</span><span class="default">count</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">-</span><span class="default">1</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertFalse</span><span class="keyword">(</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><br /><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="default"> </span><br /><span class="default"> </span><span class="comment">/**</span><br /><span class="comment"> * @depends testPush</span><br /><span class="comment"> */</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testPop</span><span class="keyword">(</span><span class="keyword">array</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="string">'foo'</span><span class="keyword">,</span><span class="default"> </span><span class="default">array_pop</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertTrue</span><span class="keyword">(</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre></div></div><br class="example-break"></br><p>
60
</p><div class="example"><a id="writing-tests-for-phpunit.examples.StackTest2.php"></a><p class="title"><b>Example 4.2: Using the <code class="literal">@depends</code> annotation to express dependencies</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">class</span><span class="default"> </span><span class="default">StackTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testEmpty</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">$stack</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="keyword">array</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEmpty</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">;</span><br /> <br /><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /> <br /><span class="default"> </span><span class="comment">/**</span><br /><span class="comment"> * @depends testEmpty</span><br /><span class="comment"> */</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testPush</span><span class="keyword">(</span><span class="keyword">array</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">array_push</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">,</span><span class="default"> </span><span class="string">'foo'</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="string">'foo'</span><span class="keyword">,</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">[</span><span class="default">count</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">-</span><span class="default">1</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertNotEmpty</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><br /><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="default"> </span><br /><span class="default"> </span><span class="comment">/**</span><br /><span class="comment"> * @depends testPush</span><br /><span class="comment"> */</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testPop</span><span class="keyword">(</span><span class="keyword">array</span><span class="default"> </span><span class="default">$stack</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="string">'foo'</span><span class="keyword">,</span><span class="default"> </span><span class="default">array_pop</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEmpty</span><span class="keyword">(</span><span class="default">$stack</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre></div></div><br class="example-break"></br><p>
61
61
In the example above, the first test, <code class="literal">testEmpty()</code>,
62
62
creates a new array and asserts that it is empty. The test then returns
63
63
the fixture as its result. The second test, <code class="literal">testPush()</code>,
65
65
depended-upon test as its argument. Finally, <code class="literal">testPop()</code>
66
66
depends upons <code class="literal">testPush()</code>.
68
<a id="id2554122" class="indexterm"></a>
68
<a id="id2556362" class="indexterm"></a>
70
70
To quickly localize defects, we want our attention to be focussed on
71
71
relevant failing tests. This is why PHPUnit skips the execution of a test
73
73
exploiting the dependencies between tests as shown in
74
74
<a class="xref" href="writing-tests-for-phpunit.html#writing-tests-for-phpunit.examples.DependencyFailureTest.php" title="Example 4.3: Exploiting the dependencies between tests">Example 4.3</a>.
75
75
</p><div class="example"><a id="writing-tests-for-phpunit.examples.DependencyFailureTest.php"></a><p class="title"><b>Example 4.3: Exploiting the dependencies between tests</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">class</span><span class="default"> </span><span class="default">DependencyFailureTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testOne</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertTrue</span><span class="keyword">(</span><span class="default">FALSE</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="default"> </span><br /><span class="default"> </span><span class="comment">/**</span><br /><span class="comment"> * @depends testOne</span><br /><span class="comment"> */</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testTwo</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre><pre class="screen"><strong class="userinput"><code>phpunit --verbose DependencyFailureTest</code></strong>
76
PHPUnit 3.4.2 by Sebastian Bergmann.
76
PHPUnit 3.5.0 by Sebastian Bergmann.
78
78
DependencyFailureTest
98
98
ensure that the dependencies of a test can actually be met before the test
100
100
</p></div><div class="section" title="Data Providers"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="writing-tests-for-phpunit.data-providers"></a>Data Providers</h2></div></div></div><p>
101
<a id="id2554202" class="indexterm"></a>
102
<a id="id2554209" class="indexterm"></a>
101
<a id="id2556442" class="indexterm"></a>
102
<a id="id2556448" class="indexterm"></a>
103
103
A test method can accept arbitrary arguments. These arguments are to be
104
104
provided by a data provider method (<code class="literal">provider()</code> in
105
105
<a class="xref" href="writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers.examples.DataTest.php" title="Example 4.4: Using data providers">Example 4.4</a>).
112
112
is part of the collection the test method will be called with the contents
113
113
of the array as its arguments.
114
114
</p><div class="example"><a id="writing-tests-for-phpunit.data-providers.examples.DataTest.php"></a><p class="title"><b>Example 4.4: Using data providers</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">class</span><span class="default"> </span><span class="default">DataTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="comment">/**</span><br /><span class="comment"> * @dataProvider provider</span><br /><span class="comment"> */</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testAdd</span><span class="keyword">(</span><span class="default">$a</span><span class="keyword">,</span><span class="default"> </span><span class="default">$b</span><span class="keyword">,</span><span class="default"> </span><span class="default">$c</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">assertEquals</span><span class="keyword">(</span><span class="default">$c</span><span class="keyword">,</span><span class="default"> </span><span class="default">$a</span><span class="default"> </span><span class="keyword">+</span><span class="default"> </span><span class="default">$b</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /> <br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">provider</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">array</span><span class="keyword">(</span><br /><span class="default"> </span><span class="keyword">array</span><span class="keyword">(</span><span class="default">0</span><span class="keyword">,</span><span class="default"> </span><span class="default">0</span><span class="keyword">,</span><span class="default"> </span><span class="default">0</span><span class="keyword">)</span><span class="keyword">,</span><br /><span class="default"> </span><span class="keyword">array</span><span class="keyword">(</span><span class="default">0</span><span class="keyword">,</span><span class="default"> </span><span class="default">1</span><span class="keyword">,</span><span class="default"> </span><span class="default">1</span><span class="keyword">)</span><span class="keyword">,</span><br /><span class="default"> </span><span class="keyword">array</span><span class="keyword">(</span><span class="default">1</span><span class="keyword">,</span><span class="default"> </span><span class="default">0</span><span class="keyword">,</span><span class="default"> </span><span class="default">1</span><span class="keyword">)</span><span class="keyword">,</span><br /><span class="default"> </span><span class="keyword">array</span><span class="keyword">(</span><span class="default">1</span><span class="keyword">,</span><span class="default"> </span><span class="default">1</span><span class="keyword">,</span><span class="default"> </span><span class="default">3</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre><pre class="screen"><strong class="userinput"><code>phpunit DataTest</code></strong>
115
PHPUnit 3.4.2 by Sebastian Bergmann.
115
PHPUnit 3.5.0 by Sebastian Bergmann.
128
128
Tests: 4, Assertions: 4, Failures: 1.
129
129
</pre></div></div><br class="example-break"></br><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
130
<a id="id2554287" class="indexterm"></a>
131
<a id="id2554302" class="indexterm"></a>
132
<a id="id2554309" class="indexterm"></a>
130
<a id="id2556537" class="indexterm"></a>
131
<a id="id2556543" class="indexterm"></a>
132
<a id="id2556550" class="indexterm"></a>
134
134
When a test receives input from both a <code class="literal">@dataProvider</code>
135
135
method and from one or more tests it <code class="literal">@depends</code> on, the
136
136
arguments from the data provider will come before the ones from
137
137
depended-upon tests.
138
138
</p></div><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
139
<a id="id2554336" class="indexterm"></a>
140
<a id="id2554342" class="indexterm"></a>
141
<a id="id2554348" class="indexterm"></a>
139
<a id="id2556577" class="indexterm"></a>
140
<a id="id2556583" class="indexterm"></a>
141
<a id="id2556589" class="indexterm"></a>
143
143
When a test depends on a test that uses data providers, the depending
144
144
test will be executed when the test it depends upon is successful for at
145
145
least one data set. The result of a test that uses data providers cannot
146
146
be injected into a depending test.
147
147
</p></div></div><div class="section" title="Testing Exceptions"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="writing-tests-for-phpunit.exceptions"></a>Testing Exceptions</h2></div></div></div><p>
148
<a id="id2554375" class="indexterm"></a>
149
<a id="id2554381" class="indexterm"></a>
148
<a id="id2556616" class="indexterm"></a>
149
<a id="id2556622" class="indexterm"></a>
151
151
<a class="xref" href="writing-tests-for-phpunit.html#writing-tests-for-phpunit.exceptions.examples.ExceptionTest.php" title="Example 4.5: Using the @expectedException annotation">Example 4.5</a>
152
152
shows how to use the <code class="literal">@expectedException</code> annotation to
153
153
test whether an exception is thrown inside the tested code.
154
</p><div class="example"><a id="writing-tests-for-phpunit.exceptions.examples.ExceptionTest.php"></a><p class="title"><b>Example 4.5: Using the @expectedException annotation</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">require_once</span><span class="default"> </span><span class="string">'PHPUnit/Framework.php'</span><span class="keyword">;</span><br /> <br /><span class="keyword">class</span><span class="default"> </span><span class="default">ExceptionTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="comment">/**</span><br /><span class="comment"> * @expectedException InvalidArgumentException</span><br /><span class="comment"> */</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testException</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre><pre class="screen"><strong class="userinput"><code>phpunit ExceptionTest</code></strong>
155
PHPUnit 3.4.2 by Sebastian Bergmann.
154
</p><div class="example"><a id="writing-tests-for-phpunit.exceptions.examples.ExceptionTest.php"></a><p class="title"><b>Example 4.5: Using the @expectedException annotation</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">class</span><span class="default"> </span><span class="default">ExceptionTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="comment">/**</span><br /><span class="comment"> * @expectedException InvalidArgumentException</span><br /><span class="comment"> */</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testException</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre><pre class="screen"><strong class="userinput"><code>phpunit ExceptionTest</code></strong>
155
PHPUnit 3.5.0 by Sebastian Bergmann.
167
167
Tests: 1, Assertions: 1, Failures: 1.</pre></div></div><br class="example-break"></br><p>
168
168
Alternatively, you can use the <code class="literal">setExpectedException()</code>
169
169
method to set the expected exception as shown in <a class="xref" href="writing-tests-for-phpunit.html#writing-tests-for-phpunit.exceptions.examples.ExceptionTest2.php" title="Example 4.6: Expecting an exception to be raised by the tested code">Example 4.6</a>.
170
</p><div class="example"><a id="writing-tests-for-phpunit.exceptions.examples.ExceptionTest2.php"></a><p class="title"><b>Example 4.6: Expecting an exception to be raised by the tested code</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">require_once</span><span class="default"> </span><span class="string">'PHPUnit/Framework.php'</span><span class="keyword">;</span><br /> <br /><span class="keyword">class</span><span class="default"> </span><span class="default">ExceptionTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testException</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">setExpectedException</span><span class="keyword">(</span><span class="string">'InvalidArgumentException'</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre><pre class="screen"><strong class="userinput"><code>phpunit ExceptionTest</code></strong>
171
PHPUnit 3.4.2 by Sebastian Bergmann.
170
</p><div class="example"><a id="writing-tests-for-phpunit.exceptions.examples.ExceptionTest2.php"></a><p class="title"><b>Example 4.6: Expecting an exception to be raised by the tested code</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">class</span><span class="default"> </span><span class="default">ExceptionTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testException</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">setExpectedException</span><span class="keyword">(</span><span class="string">'InvalidArgumentException'</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre><pre class="screen"><strong class="userinput"><code>phpunit ExceptionTest</code></strong>
171
PHPUnit 3.5.0 by Sebastian Bergmann.
187
187
You can also use the approach shown in
188
188
<a class="xref" href="writing-tests-for-phpunit.html#writing-tests-for-phpunit.exceptions.examples.ExceptionTest3.php" title="Example 4.7: Alternative approach to testing exceptions">Example 4.7</a>
189
189
to test exceptions.
190
</p><div class="example"><a id="writing-tests-for-phpunit.exceptions.examples.ExceptionTest3.php"></a><p class="title"><b>Example 4.7: Alternative approach to testing exceptions</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">require_once</span><span class="default"> </span><span class="string">'PHPUnit/Framework.php'</span><span class="keyword">;</span><br /> <br /><span class="keyword">class</span><span class="default"> </span><span class="default">ExceptionTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testException</span><span class="keyword">(</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">try</span><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="comment">// ... Code that is expected to raise an exception ...</span><br /><span class="default"> </span><span class="keyword">}</span><br /> <br /><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">InvalidArgumentException</span><span class="default"> </span><span class="default">$expected</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">return</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /> <br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">fail</span><span class="keyword">(</span><span class="string">'An expected exception has not been raised.'</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre></div></div><br class="example-break"></br><p>
190
</p><div class="example"><a id="writing-tests-for-phpunit.exceptions.examples.ExceptionTest3.php"></a><p class="title"><b>Example 4.7: Alternative approach to testing exceptions</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">class</span><span class="default"> </span><span class="default">ExceptionTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testException</span><span class="keyword">(</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">try</span><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="comment">// ... Code that is expected to raise an exception ...</span><br /><span class="default"> </span><span class="keyword">}</span><br /> <br /><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">InvalidArgumentException</span><span class="default"> </span><span class="default">$expected</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">return</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /> <br /><span class="default"> </span><span class="default">$this</span><span class="keyword">-></span><span class="default">fail</span><span class="keyword">(</span><span class="string">'An expected exception has not been raised.'</span><span class="keyword">)</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre></div></div><br class="example-break"></br><p>
191
191
If the code that is expected to raise an exception in
192
192
<a class="xref" href="writing-tests-for-phpunit.html#writing-tests-for-phpunit.exceptions.examples.ExceptionTest3.php" title="Example 4.7: Alternative approach to testing exceptions">Example 4.7</a>
193
193
does not raise the expected exception, the subsequent call to
194
194
<code class="literal">fail()</code> (see
195
<a class="xref" href="api.html#api.assert.tables.bottleneck-methods" title="Table 22.2. Bottleneck Methods">Table 22.2</a>) will halt the
195
<a class="xref" href="api.html#api.assert.tables.bottleneck-methods" title="Table 21.2. Bottleneck Methods">Table 21.2</a>) will halt the
196
196
test and signal a problem with the test. If the expected exception is
197
197
raised, the <code class="literal">catch</code> block will be executed, and the
198
198
test will end successfully.
199
199
</p></div><div class="section" title="Testing PHP Errors"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="writing-tests-for-phpunit.errors"></a>Testing PHP Errors</h2></div></div></div><p>
200
<a id="id2554641" class="indexterm"></a>
201
<a id="id2554647" class="indexterm"></a>
202
<a id="id2554653" class="indexterm"></a>
203
<a id="id2554659" class="indexterm"></a>
204
<a id="id2554666" class="indexterm"></a>
200
<a id="id2556878" class="indexterm"></a>
201
<a id="id2556884" class="indexterm"></a>
202
<a id="id2556890" class="indexterm"></a>
203
<a id="id2556897" class="indexterm"></a>
204
<a id="id2556903" class="indexterm"></a>
206
206
By default, PHPUnit converts PHP errors, warnings, and notices that are
207
207
triggered during the execution of a test to an exception. Using these
208
208
exceptions, you can, for instance, expect a test to trigger a PHP error as
209
209
shown in <a class="xref" href="writing-tests-for-phpunit.html#writing-tests-for-phpunit.exceptions.examples.ErrorTest.php" title="Example 4.8: Expecting a PHP error using @expectedException">Example 4.8</a>.
210
210
</p><div class="example"><a id="writing-tests-for-phpunit.exceptions.examples.ErrorTest.php"></a><p class="title"><b>Example 4.8: Expecting a PHP error using @expectedException</b></p><div class="example-contents"><pre class="programlisting"><code><span class="default"><?php</span><br /><span class="keyword">class</span><span class="default"> </span><span class="default">ExpectedErrorTest</span><span class="default"> </span><span class="keyword">extends</span><span class="default"> </span><span class="default">PHPUnit_Framework_TestCase</span><br /><span class="keyword">{</span><br /><span class="default"> </span><span class="comment">/**</span><br /><span class="comment"> * @expectedException PHPUnit_Framework_Error</span><br /><span class="comment"> */</span><br /><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">testFailingInclude</span><span class="keyword">(</span><span class="keyword">)</span><br /><span class="default"> </span><span class="keyword">{</span><br /><span class="default"> </span><span class="keyword">include</span><span class="default"> </span><span class="string">'not_existing_file.php'</span><span class="keyword">;</span><br /><span class="default"> </span><span class="keyword">}</span><br /><span class="keyword">}</span><br /><span class="default">?></span><br /></code></pre><pre class="screen"><strong class="userinput"><code>phpunit ExpectedErrorTest</code></strong>
211
PHPUnit 3.4.2 by Sebastian Bergmann.
211
PHPUnit 3.5.0 by Sebastian Bergmann.
217
217
OK (1 test, 1 assertion)</pre></div></div><br class="example-break"></br><p>
218
<a id="id2554714" class="indexterm"></a>
219
<a id="id2554720" class="indexterm"></a>
218
<a id="id2556951" class="indexterm"></a>
219
<a id="id2556957" class="indexterm"></a>
221
221
<code class="literal">PHPUnit_Framework_Error_Notice</code> and
222
222
<code class="literal">PHPUnit_Framework_Error_Warning</code> represent PHP notices