@@ -8,16 +8,60 @@ PHPUnitでテストを書こう
8
8
9
9
* PHPでテストコードを書くためのライブラリ
10
10
* https://phpunit.de/
11
- * デファクトスタンダードの存在があるんですね(Pythonには複数候補があります)
11
+ * デファクトスタンダードの存在があるんですね(Pythonには複数候補があります。参考『Python実践レシピ』 )
12
12
13
- インストール
13
+ PHPUnitをインストール
14
+ ============================================================
15
+
16
+ * Composer
17
+ * PHAR
18
+
19
+ どちらかをやればいいです
20
+
21
+ Composerでインストール
14
22
--------------------------------------------------
15
23
16
- * Composerでインストール
24
+ * :command: `composer require --dev phpunit/phpunit `
25
+ * ちょうぜつ本 など
26
+
27
+ .. code-block :: txt
28
+
29
+ .
30
+ ├── composer.json
31
+ ├── composer.lock
32
+ └── vendor/
33
+ └── bin/
34
+ └── phpunit
17
35
18
- * :command: `composer require --dev phpunit/phpunit `
36
+ PHARでインストール
37
+ --------------------------------------------------
38
+
39
+ * PHPUnitのドキュメントで推している
40
+ * https://docs.phpunit.de/en/10.5/installation.html#manual-download-of-phar
41
+
42
+ .. code-block :: txt
43
+
44
+ .
45
+ └── tools/
46
+ └── phpunit
47
+
48
+ Composerではautoload 🏃♂️ (skip)
49
+ --------------------------------------------------
19
50
20
- * ドキュメントは `PHARをダウンロードして、tools下に置く方法推し <https://docs.phpunit.de/en/10.5/installation.html#manual-download-of-phar >`__
51
+ .. TODO PSR-4
52
+
53
+ phpunitコマンドの使い方
54
+ --------------------------------------------------
55
+
56
+ * :command: `vendor/bin/phpunit `
57
+ * (PHARを配置した場合 :command: `tools/phpunit `)
58
+
59
+ .. code-block :: txt
60
+
61
+ Usage:
62
+ phpunit [options] <directory|file> ...
63
+
64
+ .. ディレクトリやファイルのパスを指定する
21
65
22
66
PHPUnitで書くテストは **3 ** ステップ
23
67
============================================================
@@ -38,13 +82,21 @@ Step1 ファイル作成
38
82
│ └── fizzbuzzTest.php
39
83
└── vendor/
40
84
41
- PHPUnitは、指定されたディレクトリの :file: `*Test.php ` を探す
85
+ (Composerでインストールした場合で進めます。PHARでも動作確認しています)
86
+
87
+ テストを書くファイル
88
+ --------------------------------------------------
89
+
90
+ * :file: `tests ` ディレクトリに配置
91
+ * ファイル名は :file: `*Test.php `
92
+
93
+ * ``phpunit `` コマンドにディレクトリのパスが指定されたときに探されるファイル
42
94
43
95
Step2 クラスを書く
44
96
--------------------------------------------------
45
97
46
98
* PHPUnitが提供する **TestCaseクラスを継承 ** したクラスを書く
47
- * ** 名前はTestで終わる **
99
+ * クラス名は ** \* Test **
48
100
49
101
.. code-block :: php
50
102
@@ -83,6 +135,50 @@ Step3 テストケースとしてメソッドを書く (2/2)
83
135
}
84
136
}
85
137
138
+ 今回はassertSameが適切。assertEqualsではない
139
+ --------------------------------------------------
140
+
141
+ .. code-block :: php
142
+
143
+ php > var_dump("1" === "1"); // assertSame
144
+ bool(true)
145
+ php > var_dump("1" == 1); // assertEquals
146
+ bool(true)
147
+ php > var_dump("1" === 1); // assertSameなら誤りに気づける
148
+ bool(false)
149
+
150
+ ``Test `` Attributeでもよい 🏃♂️ (skip)
151
+ --------------------------------------------------
152
+
153
+ https://docs.phpunit.de/en/10.5/attributes.html#appendixes-attributes-test
154
+
155
+ .. code-block :: php
156
+
157
+ use PHPUnit\Framework\Attributes\Test;
158
+
159
+ class FizzbuzzTest extends TestCase
160
+ {
161
+ // 関数名は3で始められないので、_を付けています(他のやり方もあると思います)
162
+ #[Test]
163
+ public function _3の倍数のときはFizzを返す(): void
164
+ {
165
+ }
166
+ }
167
+
168
+ 日本語テストメソッド 🏃♂️ (skip)
169
+ --------------------------------------------------
170
+
171
+ * IMO:関数名は **日本語を使ってもよい ** と思います
172
+ * `実践!ユニットテスト入門(PHPカンファレンス2022) <https://speakerdeck.com/panda_program/unit-testing-for-beginners-at-php-conference-japan-2022?slide=41 >`__
173
+ * `現在時刻が関わるユニットテストから、テスト容易性設計を学ぶ <https://t-wada.hatenablog.jp/entry/design-for-testability#%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88-%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%86%E3%82%B9%E3%83%88%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89 >`__
174
+
175
+ 🥟PHPUnitで書くテストは3ステップ
176
+ ============================================================
177
+
178
+ 1. テストコードのファイルを作る(:file: `*Test.php `)
179
+ 2. クラスを書く(``*Test ``)
180
+ 3. テストケースとしてメソッドを書く(``test* ``)
181
+
86
182
テスト実行
87
183
============================================================
88
184
@@ -94,20 +190,20 @@ passしたとき
94
190
95
191
.. code-block :: txt
96
192
97
- Runtime: PHP 8.3.1
193
+ Runtime: PHP 8.3.2
98
194
99
195
. 1 / 1 (100%)
100
196
101
197
Time: 00:00, Memory: 22.77 MB
102
198
103
199
OK (1 test, 1 assertion)
104
200
105
- failしたとき
201
+ failしたとき(わざと落とした)
106
202
--------------------------------------------------
107
203
108
204
.. code-block :: txt
109
205
110
- Runtime: PHP 8.3.1
206
+ Runtime: PHP 8.3.2
111
207
112
208
F 1 / 1 (100%)
113
209
@@ -147,7 +243,7 @@ failしたとき
147
243
148
244
https://xp123.com/articles/3a-arrange-act-assert/
149
245
150
- 3Aで見るdoctest
246
+ 3Aで見るPHPUnit
151
247
--------------------------------------------------
152
248
153
249
1ステップ1行になるように書き直しています
@@ -169,7 +265,7 @@ Arrange
169
265
Act
170
266
--------------------------------------------------
171
267
172
- テスト対象の関数を **実行 **
268
+ テスト対象を **実行 ** (呼び出す)
173
269
174
270
.. literalinclude :: ../../samplecode/phpunit-example/tests/fizzbuzzTest.php
175
271
:language: php
@@ -186,12 +282,21 @@ Assert
186
282
:lines: 8-17
187
283
:emphasize-lines: 7-8
188
284
285
+ .. 意図を伝えるアサーションを選ぼう
286
+
189
287
第4のA:Annihilate 🏃♂️ (skip)
190
288
--------------------------------------------------
191
289
192
290
* クリーンアップ
193
291
* 『`ロバストPython <https://www.oreilly.co.jp/books/9784814400171/ >`__』第21章より
194
292
293
+ 🥟テストコードの構成要素:3A
294
+ ============================================================
295
+
296
+ * Arrange テストの **準備 **
297
+ * Act テスト対象の **実行 **
298
+ * Assert 実行結果と期待値の **検証 **
299
+
195
300
tips✨ **パラメタ化 ** テスト
196
301
============================================================
197
302
@@ -224,12 +329,26 @@ tips✨ **パラメタ化** テスト
224
329
{
225
330
}
226
331
227
- PHPUnitでは **Data Provider ** を使おう
332
+ **テストメソッドに引数 ** (パラメタ)を渡したい
333
+ --------------------------------------------------
334
+
335
+ .. code-block :: php
336
+
337
+ class FizzbuzzTest extends TestCase
338
+ {
339
+ // $numberに3や6を渡せたら
340
+ public function test_3の倍数のときはFizzを返す($number): void
341
+ {
342
+ $this->assertSame(fizzbuzz($number), "Fizz");
343
+ }
344
+ }
345
+
346
+ PHPUnitでは **Data Provider ** でできます!
228
347
--------------------------------------------------
229
348
230
349
.. literalinclude :: ../../samplecode/phpunit-example/tests/parametrizedTest.php
231
350
:language: php
232
- :lines: 6- 7,10-22
351
+ :lines: 5, 7,10-22
233
352
234
353
Data Provider
235
354
--------------------------------------------------
@@ -239,7 +358,7 @@ Data Provider
239
358
| A data provider method must be public and static.
240
359
| It must return a value that is iterable, either an array or an object that implements the Traversable interface.
241
360
242
- Data Provider
361
+ Data Providerの例
243
362
--------------------------------------------------
244
363
245
364
.. literalinclude :: ../../samplecode/phpunit-example/tests/parametrizedTest.php
@@ -259,7 +378,7 @@ Data Provider
259
378
% tools/phpunit tests/parametrizedTest.php
260
379
PHPUnit 10.5.10 by Sebastian Bergmann and contributors.
261
380
262
- Runtime: PHP 8.3.1
381
+ Runtime: PHP 8.3.2
263
382
264
383
.. 2 / 2 (100%)
265
384
0 commit comments