Slide 1

Slide 1 text

PHPUnit11の新しい仲間たち 第164回 PHP勉強会@東京 / 2024-05-29 Hideki Kinjyo GitHub: o0h / X: @o0h_

Slide 2

Slide 2 text

自己紹介 • 金城秀樹 / きんじょうひでき • GitHub:@o0h / Twitter:@o0h_ • 好きなFWはCakePHP • アイコンは 美味しい鮭親子丼の写真です • 最近の悩み: 「よく使う操作でKeynoteがクラッシュする」

Slide 3

Slide 3 text

ちわ、どうも・・本日のお話・・・ • PHPUnitの最新版は11.xです • どんな事が変わってるんだ???の一部を復習していきます • 一部 = アサーションメソッドの差分

Slide 4

Slide 4 text

詳しく丁寧な話は、コチラに期待!! \02さん@phpconfuk/

Slide 5

Slide 5 text

今日は アサーションメソッドに 注目していきます

Slide 6

Slide 6 text

なんでアサーションメソッドが好きなの? • テストコードは、欠陥を発見されるために作成される • => 読まれるのは欠陥が発見された時 • 存在意義を果たすには、「なぜ欠陥なのか」を伝える事が重要 • => コードやメッセージが 「概念レベル(機械寄りではなく、人の認知に近いレベル)」で まとまっていて欲しい

Slide 7

Slide 7 text

なんでアサーションメソッドが好きなの? • 表現力豊かなテスト(Expressive Tests)は、 xUnit Test Patterns「自動化テストのゴール」群の1つ • 関連パターンに「Custom Assertion」など • "Create a purpose-built Assertion Method that compares only those attributes of the object that define test-specific equality." • アサーションメソッド ≒ 語彙力となる、と思う 参考: http://xunitpatterns.com/Goals%20of%20Test%20Automation.html http://xunitpatterns.com/Custom%20Assertion.html

Slide 8

Slide 8 text

参考、どぞ・・ 一緒に働いていた人が最近の考えを晒していたのでご紹介 (身内のメガネ抜きにして、個人的にも好物な話だったので是非) https://asumikam.com/entry/2024/05/18/002702 https://speakerdeck.com/asumikam/good-assertion

Slide 9

Slide 9 text

あわせて読みたい • https://github.com/rectorphp/rector-phpunit ※ rulesetはphpunit100まで。phpunit-code-quality等を併用で対応 • https://github.com/phpstan/phpstan-phpunit • https://github.com/Yoast/PHPUnit-Polyfills ※ 対応しているのは10.xまで

Slide 10

Slide 10 text

比較してみよう • 10.x => 11.xには、どんなアサーションが入ったんだい??が関心事 • PHPUnitの特徴 • ChangeLogが充実している(ソースと一緒にコミットされている) • => ただしマイナーバージョンごと(ex: ChangeLog-11.1.md) • 新しいメソッドはマイナーバージョンで(も)追加される

Slide 11

Slide 11 text

私「0.2ver.以上ジャンプすると追うのが面倒そう…」

Slide 12

Slide 12 text

「11までに入ったアサーションメソッド」を 知りたい・・・知りたくない?

Slide 13

Slide 13 text

仕事なら / 真面目にちまちま (changelogを)読むけれど…

Slide 14

Slide 14 text

今の私は、 「新しいものを見せびらかしてドヤ顔したい」 だけなのに!!

Slide 15

Slide 15 text

よし、じゃあ雑にやろう

Slide 16

Slide 16 text

コード本体に吐かせてみるか

Slide 17

Slide 17 text

やったこと 1. PHPUnitのソースコードを持ってきて 2. (ほとんどの)アサーションメソッドが入っている`Assert`クラスを 3. ReflectionClassにくわせて 4. メソッド一覧を、2つのバージョンで比較して 5. 新しく定義されたものを抜いてくる 結果は https://gist.github.com/o0h/fe9bf8d952362bf7332d41462335bc73 に

Slide 18

Slide 18 text

Packagistから 各バージョン情報セットを 持ってきて

Slide 19

Slide 19 text

比較したいバージョンの ソース(zip)を取得

Slide 20

Slide 20 text

解凍&配置をして

Slide 21

Slide 21 text

落ちてきた `PHPUnit\Framework\Assert` クラスを

Slide 22

Slide 22 text

FQCNが衝突しないように小細工しつつ 読み込んで

Slide 23

Slide 23 text

evalで無理やりクラス定義して

Slide 24

Slide 24 text

ReflectionClassを作って

Slide 25

Slide 25 text

assertで始まるメソッドを抽出

Slide 26

Slide 26 text

存在する/しないを比較して なんかゴニョる

Slide 27

Slide 27 text

• 結果こんな感じ • removedなものはなかった (本当か?)

Slide 28

Slide 28 text

10.0 -> 11.1の間に生えたメソッド • assertArrayIsEqualToArrayOnlyConsideringListOfKeys • assertArrayIsEqualToArrayIgnoringListOfKeys • assertArrayIsIdenticalToArrayOnlyConsideringListOfKeys • assertArrayIsIdenticalToArrayIgnoringListOfKeys • assertObjectHasProperty • assertObjectNotHasProperty • assertFileMatchesFormat

Slide 29

Slide 29 text

assertArrayIsEqualToArrayOnlyConsideringListOfKeys 関心のあるキーに限定してequalsになってるかを検査

Slide 30

Slide 30 text

assertArrayIsEqualToArrayIgnoringListOfKeys 指定したキーを除外してequalsになってるかを検査

Slide 31

Slide 31 text

assertObjectHasProperty • これは名前の通り • 「むしろ今まで無かったですっけ??」って気持ちになる・・・ • 10.1で追加 • https://github.com/sebastianbergmann/phpunit/commit/ bf3c8defbb6bbb59c549ff3186d52275371f30ee • https://github.com/sebastianbergmann/phpunit/blob/10.1.0/ ChangeLog-10.1.md

Slide 32

Slide 32 text

assertFileMatchesFormat 指定したファイルの中身が期待するフォーマットに沿っているかを検査

Slide 33

Slide 33 text

assertFileMatchesFormat • 使える指定子はこんな感 じ。内部的には正規表現の マッチ • src: https://github.com/ sebastianbergmann/phpunit/blob/11.1.3/ src/Framework/Constraint/String/ StringMatchesFormatDescription.php#L87- L100 • この「フォーマットでの マッチ」は昔からあるもの

Slide 34

Slide 34 text

まとめ • 「細かいアサーションメソッドを使いこなしまくる」の pros/consもありますよね • アンテナを張っておく => ドンピシャのものが来たら突っこむ!! が良いのかな〜という気がする • 無理に突っ込むのはちょっと待ちたい • 使いたいのが生えたら、 Rectorのカスタムルールでゴリゴリすると良いかも

Slide 35

Slide 35 text

おしまい! お付き合いいただき ありがとうございました!!