-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path12-tests.html
174 lines (152 loc) · 6.77 KB
/
12-tests.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<section id="test">
<section>
<h2>Tests</h2>
</section>
<section>
<h3>Installation</h3>
<p>Afin de pouvoir créer nos tests, nous allons commencer par installer les packages nécessaires :</p>
<pre><code class="language-bash">composer require --dev symfony/test-pack</code></pre>
</section>
<section>
<h3>3 types de tests</h3>
<ul>
<li><strong>Tests unitaires</strong> : Permet de tester de manière individuelle une classe.</li>
<li><strong>Tests d'intégration</strong> : Permet de tester un ensemble de classes pouvant intéragir avec le conteneur de services de Symfony.</li>
<li><strong>Tests d'application</strong> : Permet de tester une application dans son ensemble en réalisant des requêtes HTTP et en vérifiant les données retournées par celles-ci.</li>
</ul>
</section>
<section>
<h3>PHPUnit</h3>
<div class="container">
<div class="col">
<p>
PHPUnit est un package PHP permettant d'écrire des tests unitaires en PHP.
</p>
</div>
<div class="col">
<img src="/assets/images/phunit.png" alt="PHPUnit">
</div>
</div>
</section>
<section>
<h3>Tests Unitaires</h3>
<p>Les tests unitaires ont pour objectif de tester de manière individuelle le comportement d'une classe.</p>
<p>Dans l'exemple suivant, nous allons tester la méthode <code class="language-php">getFullName()</code> d'une entité <code class="language-php">Person</code>.</p>
<p>Nous allons commencer par générer la classe PersonTest en utilisant MakerBundle :</p>
<pre><code class="language-php">php bin/console make:test</code></pre>
<p>Saisissez ensuite les options <code class="language-bash">TestCase</code> puis <code class="language-bash">PersonUnitTest</code>.</p>
</section>
<section>
<h3>Tests Unitaires</h3>
<p>Modifiez ensuite le fichier PHP généré pour tester la méthode <code class="language-php">getFullName()</code> :</p>
<pre><code class="language-php"><?php
namespace App\Tests;
use App\Entity\Person;
use PHPUnit\Framework\TestCase;
class PersonTest extends TestCase
{
public function testFullName(): void
{
$person = new Person();
$person->setFirstName('John');
$person->setLastName('Doe');
$this->assertSame('John Doe', $person->getFullName());
}
}</code></pre>
</section>
<section>
<h3>Tests Unitaires</h3>
<p>Enfin, vous pouvez exécuter les tests avec la commande suivante :</p>
<pre><code class="language-bash">php bin/phpunit</code></pre>
</section>
<section>
<h3>Tests d'Intégration</h3>
<pre><code class="language-php">php bin/console make:test</code></pre>
<p>Saisissez ensuite les options <code class="language-bash">KernelTestCase</code> puis <code class="language-bash">PersonIntegrationTest</code>.</p>
</section>
<section>
<h3>Tests d'Intégration</h3>
<p>Nous allons maintenant configurer l'environnement de test et plus particulièrement la connexion à la base de données en créant un fichier <code>.env.test</code> :</p>
<pre><code class="language-dotenv">DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"</code></pre>
<p>Puis, nous allons créer la base de données avec les données de test :</p>
<pre><code class="language-bash">php bin/console --env=test doctrine:database:create
php bin/console --env=test doctrine:migration:migrate
php bin/console --env=test doctrine:fixtures:load</code></pre>
<p>Nous allons également utiliser un package pour s'assurer que la base de données soit ré-initialisée avant chaque test :</p>
<pre><code class="language-bash">composer require --dev dama/doctrine-test-bundle</code></pre>
<pre><code class="language-xml"><!-- phpunit.xml.dist -->
<phpunit>
<extensions>
<extension class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension"/>
</extensions>
</phpunit></code></pre>
</section>
<section>
<h3>Tests d'Intégration</h3>
<pre><code class="language-php">class PersonIntegretionTest extends KernelTestCase
{
private ?EntityManager $entityManager;
protected function setUp(): void
{
$kernel = self::bootKernel();
$this->entityManager = $kernel->getContainer()->get('doctrine')->getManager();
}
public function testPersonFindAll(): void
{
$persons = $this->entityManager->getRepository(Person::class)->findAll();
$this->assertCount(3, $persons);
}
protected function tearDown(): void
{
parent::tearDown();
// doing this is recommended to avoid memory leaks
$this->entityManager->close();
$this->entityManager = null;
}
}</code></pre>
</section>
<section>
<h3>Tests d'Application</h3>
<pre><code class="language-php">php bin/console make:test</code></pre>
<p>Saisissez ensuite les options <code class="language-bash">WebTestCase</code> puis <code class="language-bash">PersonControllerTest</code>.</p>
</section>
<section>
<h3>Tests d'Application</h3>
<pre><code class="language-php">class PersonControllerTest extends WebTestCase
{
public function testSomething(): void
{
$client = static::createClient();
$crawler = $client->request('GET', '/person');
$this->assertResponseIsSuccessful();
$this->assertSelectorTextContains('h1', 'Persons list');
}
}</code></pre>
</section>
<section>
<h3>Tests d'Application</h3>
<p>Il sera alors possible de naviguer sur les différentes pages et de vérifier si le contenu de celle-ci est correct.</p>
<p>La variable <code class="language-php">$client</code> permet d'effectuer de nombreuses actions telles que :</p>
<ul>
<li>
Parcourir le site :
<code class="language-php">$client->back();</code>
<code class="language-php">$client->forward();</code>
<code class="language-php">$client->reload();</code>
</li>
<li>
Suivre des redirections :
<code class="language-php">$client->followRedirect();</code>
</li>
<li>
Connecter un utilisateur :
<code class="language-php">$client->loginUser();</code>
</li>
<li>
Faire des requêtes AJAX :
<code class="language-php">$client->xmlHttpRequest();</code>
</li>
<li>...</li>
</ul>
</section>
</section>