Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPUnit 10 概論 / Introduction of PHPUnit 10

02
March 23, 2023

PHPUnit 10 概論 / Introduction of PHPUnit 10

2023/03/23 PHPerKaigi 2023のトークで使用したスライドです。
https://fortee.jp/phperkaigi-2023/proposal/4379c965-b88d-49c8-b316-e27e2e6b4db1

02

March 23, 2023
Tweet

More Decks by 02

Other Decks in Programming

Transcript

  1. #phperkaigi #a © 2012-2023 BASE, Inc. Web Application Enginner 02

    大津 和槻 :@cocoeyes02 2021/02~ BASE, Inc. 自己紹介 PHP系カンファレンス登壇 執筆 登壇応援中!
  2. #phperkaigi #a © 2012-2023 BASE, Inc. 今日話す内容 9 • PHP8.1以上が必須に

    • 新しいテストイベントシステムの追加 • 各テストの結果やテスト自体の問題を区別する • PHP8.0のAttributeを用いたメタデータの仕様変更 • 色覚多様性を考慮したコードカバレッジレポートの仕様変更 • DataProviderの仕様変更 • 文法の誤りや差別的な用語を消す • 削除されたが代替手段の提供がないメソッド
  3. #phperkaigi #a © 2012-2023 BASE, Inc. 新しいテストイベント システムの追加 14 テストイベント(テスト開始・終了、合格・不合格など)にまつわるシステムが

    抜本的に変わりました。 これまで使用していた既存のテストイベントにまつわるシステム(TestListenerや Test Hookなど)は10.0で削除され、新しいシステムを使用することになります。
  4. #phperkaigi #a © 2012-2023 BASE, Inc. 16 基本的な使い方は3ステップ 1. 関連するイベントのSubscriberを作成する

    2. Subscriberを設定するExtensionを作成する 3. Extensionをphpunit.xml等に設定する 新しいテストイベント システムの追加
  5. #phperkaigi #a © 2012-2023 BASE, Inc. 各テストの結果や テスト自体の問題を区別する 23 各テストの結果(Errored,

    Failed, Incomplete, Skipped, Passed, etc) や テスト自体の問題(Considered risky, Warning, etc) のそれぞれを 明確に区別する方針になりました。 この方針に基づいた変更がいくつかあります。
  6. #phperkaigi #a © 2012-2023 BASE, Inc. 24 各テストの結果やテスト自体の問題のそれぞれを区別することによる影響 • テストを中止する条件の変更

    • デフォルトでは、deprecations, notices, warningsなどを出力しない • 特定のテストの結果やテスト自体の問題が発生しても、例外を投げない 各テストの結果や テスト自体の問題を区別する
  7. #phperkaigi #a © 2012-2023 BASE, Inc. 25 テストを中止する条件の変更 いくつかのテストの結果やテスト自体の問題では、発生してもテストを中止しないよう になりました。

    中止しないようになったイベントは以下です。 • Deprecated • Notice • Strict • Warning 各テストの結果や テスト自体の問題を区別する
  8. #phperkaigi #a © 2012-2023 BASE, Inc. 31 デフォルトでは、deprecations, notices, warningsなどを出力しない

    特定のテストの結果やテスト自体の問題については、デフォルトでは出力しない仕様へ と変わりました。 • Incomplete • Skipped • Deprecated • Error • Notice • Warning 各テストの結果や テスト自体の問題を区別する
  9. #phperkaigi #a © 2012-2023 BASE, Inc. 32 デフォルトでは、deprecations, notices, warningsなどを出力しない

    オプションを使用、もしくはphpunit.xmlの設定を変更すれば表示されます。 • --display-incomplete、displayDetailsOnIncompleteTests • --display-skipped、displayDetailsOnSkippedTests • --display-deprecations、displayDetailsOnTestsThatTriggerDeprecations • --display-errors、displayDetailsOnTestsThatTriggerErrors • --display-notices、displayDetailsOnTestsThatTriggerNotices • --display-warnings、displayDetailsOnTestsThatTriggerWarnings 各テストの結果や テスト自体の問題を区別する
  10. #phperkaigi #a © 2012-2023 BASE, Inc. 33 33 デフォルトでは、deprecations, notices,

    warningsなどを出力しない https://phpunit.de/announcements/phpunit-10.html 各テストの結果や テスト自体の問題を区別する
  11. #phperkaigi #a © 2012-2023 BASE, Inc. 34 特定のテストの結果やテスト自体の問題が発生しても、例外を投げない 以下のテストの結果やテスト自体の問題が発生しても、 例外を投げないようになりました。

    • Deprecated • Error • Notice • Warning expectException()を使っても、上記のテストイベントは検知しないということです。 各テストの結果や テスト自体の問題を区別する
  12. #phperkaigi #a © 2012-2023 BASE, Inc. 35 特定のテストの結果やテスト自体の問題が発生しても、例外を投げない また、例外として検知しなくなった以下のメソッドも削除になりました。 •

    expectDeprecation()、expectDeprecationMessage() 、 expectDeprecationMessageMatches() • expectError()、expectErrorMessage()、expectErrorMessageMatches() • expectNotice()、expectNoticeMessage()、 expectNoticeMessageMatches() • expectWarning()、expectWarningMessage()、 expectWarningMessageMatches() 各テストの結果や テスト自体の問題を区別する
  13. #phperkaigi #a © 2012-2023 BASE, Inc. PHP8.0のAttributeを用いた メタデータの仕様変更 38 PHP8.0

    でAttributesが実装されたので、PHPUnitでもAttributesを使ってメタデータ を指定できるようになりました。 優先度が Attributesのメタデータ > コメントのメタデータ になる他、 コメントのメタデータはPHPUnit11で非推奨、PHPUnit12では削除になるようです。
  14. #phperkaigi #a © 2012-2023 BASE, Inc. 39 例:DataProviderをAttributeを用いて呼び出す場合 <?php declare(strict_types=1);

    namespace example; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; #[DataProvider(Foo::$dataProviderMethod())] final class FooTest extends TestCase { // ... } PHP8.0のAttributeを用いた メタデータの仕様変更
  15. #phperkaigi #a © 2012-2023 BASE, Inc. 40 例:DataProviderをAttributeを用いて呼び出す場合 <?php declare(strict_types=1);

    namespace example; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; #[DataProvider(Foo::$dataProviderMethod())] final class FooTest extends TestCase { // ... } PHP8.0のAttributeを用いた メタデータの仕様変更
  16. #phperkaigi #a © 2012-2023 BASE, Inc. 41 また、PHPUnit内ではプロパティをAttributeと読んでいましたが、 Attribute →

    Propertyへと名前を変える方針になりました。 そのため、Attributeと名のつくassertメソッドが全て削除されます (代替手段がないメソッドもあり) PHP8.0のAttributeを用いた メタデータの仕様変更
  17. #phperkaigi #a © 2012-2023 BASE, Inc. 42 削除予定のAttributeと名のつくassertメソッド • assertClassHasAttribute()

    • assertClassNotHasAttribute() • assertClassHasStaticAttribute() • assertClassNotHasStaticAttribute() • assertObjectHasAttribute() • assertObjectNotHasAttribute() • classHasAttribute() • classHasStaticAttribute() • objectHasAttribute() PHP8.0のAttributeを用いた メタデータの仕様変更
  18. #phperkaigi #a © 2012-2023 BASE, Inc. 43 削除予定のAttributeと名のつくassertメソッド • assertClassHasAttribute()

    • assertClassNotHasAttribute() • assertClassHasStaticAttribute() • assertClassNotHasStaticAttribute() • assertObjectHasAttribute() • assertObjectNotHasAttribute() • classHasAttribute() • classHasStaticAttribute() • objectHasAttribute() 以下はPHPUnit10.1にて実装予定 → assertObjectHasProperty() → assertObjectNotHasProperty() PHP8.0のAttributeを用いた メタデータの仕様変更
  19. #phperkaigi #a © 2012-2023 BASE, Inc. 44 削除予定のAttributeと名のつくassertメソッド • assertClassHasAttribute()

    • assertClassNotHasAttribute() • assertClassHasStaticAttribute() • assertClassNotHasStaticAttribute() • assertObjectHasAttribute() • assertObjectNotHasAttribute() • classHasAttribute() • classHasStaticAttribute() • objectHasAttribute() → ? → ? → ? → ? → assertObjectHasProperty() → assertObjectNotHasProperty() → ? → ? → ? PHP8.0のAttributeを用いた メタデータの仕様変更
  20. #phperkaigi #a © 2012-2023 BASE, Inc. 色覚多様性を考慮した コードカバレッジレポートの仕様変更 47 phpunit.xml等で、Success(Low,

    Medium, High)、Warning、Dangerの色を 任意の色へと指定できるようになりました <logging> <log type="coverage-html" target="report" colorSuccessLow="#{any color code}" colorSuccessMedium="#{any color code}" colorSuccessHigh="#{any color code}" colorWarning="#{any color code}" colorDanger="#{any color code}" /> </logging>
  21. #phperkaigi #a © 2012-2023 BASE, Inc. DataProviderの仕様変更 49 以下の条件に当てはまるDataProviderが非推奨になりました。 •

    staticではない • publicではない • 引数を必要とする 逆にいえば、以下のような形式のDataProviderを推奨しているということですね。 public static XXX() {}
  22. #phperkaigi #a © 2012-2023 BASE, Inc. 文法の誤りや差別的な用語を消す 51 文法の誤りや判断しづらいメソッドが削除されました。 •

    assertNotIsReadable • assertNotIsWritable • assertDirectoryNotExists • assertDirectoryNotIsReadable • assertDirectoryNotIsWritable • assertFileNotExists • assertFileNotIsReadable • assertRegExp • assertNotRegExp
  23. #phperkaigi #a © 2012-2023 BASE, Inc. 文法の誤りや差別的な用語を消す 52 文法の誤りや判断しづらいメソッドが削除されました。 •

    assertNotIsReadable • assertNotIsWritable • assertDirectoryNotExists • assertDirectoryNotIsReadable • assertDirectoryNotIsWritable • assertFileNotExists • assertFileNotIsReadable • assertRegExp • assertNotRegExp → assertIsNotReadable → assertIsNotWritable → assertDirectoryDoesNotExist → assertDirectoryIsNotReadable → assertDirectoryIsNotWritable → assertFileDoesNotExist → assertFileIsNotReadable → assertMatchesRegularExpression → assertDoesNotMatchRegularExpression
  24. #phperkaigi #a © 2012-2023 BASE, Inc. 文法の誤りや差別的な用語を消す 53 差別的な用語を用いているクラスやプロパティ、オプションも削除されました。 •

    PHPUnit\Util\Blacklist • PHPUnit\Framework\TestCase::$backupGlobalsBlacklist • PHPUnit\Framework\TestCase::$backupStaticAttributesBlacklist • --whitelist オプション
  25. #phperkaigi #a © 2012-2023 BASE, Inc. 文法の誤りや差別的な用語を消す 54 差別的な用語を用いているクラスやプロパティ、オプションも削除されました。 •

    PHPUnit\Util\Blacklist → PHPUnit\Util\Excludelist • PHPUnit\Framework\TestCase::$backupGlobalsBlacklist → PHPUnit\Framework\TestCase::$backupGlobalsExcludeList • PHPUnit\Framework\TestCase::$backupStaticAttributesBlacklist → PHPUnit\Framework\TestCase::$backupStaticAttributesExcludeList • --whitelist オプション → --coverage-filter オプション
  26. #phperkaigi #a © 2012-2023 BASE, Inc. 削除されたが 代替手段の提供がないメソッド 56 2つほど紹介します。

    どちらもPHPUnit9の時点で、非推奨になったメソッドです。 • at • withConsecutive
  27. #phperkaigi #a © 2012-2023 BASE, Inc. 57 PHPUnit\Framework\MockObject\Matcher\InvokedAtIndex at(int $index)

    評価対象のメソッドが $index 回目に実行された際にマッチするオブジェクトを返しま す。 https://docs.phpunit.de/en/9.6/test-doubles.html 削除されたが 代替手段の提供がないメソッド
  28. #phperkaigi #a © 2012-2023 BASE, Inc. 58 PHPUnit\Framework\MockObject\Matcher\InvokedAtIndex at(int $index)

    issueに書いてあったコメントでは、withConsecutiveメソッドへの置き換えを提案、 もしくは置き換えの実施をしていたケースが多かったです。 https://github.com/sebastianbergmann/phpunit/issues/4297 削除されたが 代替手段の提供がないメソッド
  29. #phperkaigi #a © 2012-2023 BASE, Inc. 59 PHPUnit\Framework\MockObject\Matcher\InvokedAtIndex at(int $index)

    issueに書いてあったコメントでは、withConsecutiveメソッドへの置き換えを提案、 もしくは置き換えの実施をしていたケースが多かったです。 https://github.com/sebastianbergmann/phpunit/issues/4297 削除されたが 代替手段の提供がないメソッド
  30. #phperkaigi #a © 2012-2023 BASE, Inc. 60 PHPUnit\Framework\MockObject\Builder\InvocationMocker withConsecutive(array ...$arguments)

    withConsecutive() メソッドには、 テスト対象の呼び出しにあわせて、引数の配列を 好きなだけ渡せます。 個々の配列は制約のリストです。 with() と同様に、これがモッ ク対象メソッドのそれぞれの引数に対応します。 https://docs.phpunit.de/en/9.6/test-doubles.html 削除されたが 代替手段の提供がないメソッド
  31. #phperkaigi #a © 2012-2023 BASE, Inc. 61 PHPUnit\Framework\MockObject\Builder\InvocationMocker withConsecutive(array ...$arguments)

    https://github.com/sebastianbergmann/phpunit/issues/4564 削除されたが 代替手段の提供がないメソッド
  32. #phperkaigi #a © 2012-2023 BASE, Inc. 62 PHPUnit\Framework\MockObject\Builder\InvocationMocker withConsecutive(array ...$arguments)

    残念ながら代替手段がないままPHPUnit 10で削除されてしまい、 現在も代替手段として何が良いのか議論している最中です。 https://github.com/sebastianbergmann/phpunit/issues/4026 良いアイディアがあれば、issueにコメントしたりPRを出したりする方が 早く事が運ぶかもしれませんね。 削除されたが 代替手段の提供がないメソッド
  33. #phperkaigi #a © 2012-2023 BASE, Inc. 最後に 63 今回どのChangeLogに触れたかは、スライドの最後に載せています。 時間の都合で一部のみの解説になりましたが、

    まだまだ解説していない機能がたくさんあります! • 新規追加、仕様変更のあった、削除されたassertメソッドやオプション • TestCaseクラスの(スーパー)グローバル変数の仕様変更 • キャッシュ先のディレクトリ変更 • XML周りの変更 今回の発表で話せなかった部分は、後日テックブログに載せようと思います! BASEプロダクトチームブログをよろしくお願いします!
  34. #phperkaigi #a © 2012-2023 BASE, Inc. 最後に 64 バックエンド エンジニア

    SRE フロントエンド エンジニア セキュリティ エンジニア QA エンジニア データ エンジニア etc… We are hiring! https://binc.jp/jobs
  35. #phperkaigi #a © 2012-2023 BASE, Inc. 今回触れたChangeLog 66 新しいテストイベントシステムの追加 •

    #4676: Event System for extending PHPUnit's test runner • #3389: Remove PHPUnit\Framework\TestListener and PHPUnit\Framework\TestListenerDefaultImplementation • #4596: Remove Test Hooks
  36. #phperkaigi #a © 2012-2023 BASE, Inc. 今回触れたChangeLog 67 各テストの結果やテスト自体の問題を区別する •

    A test method now continues execution after test(ed) code triggered E_(USER_)DEPRECATED, E_(USER_)NOTICE, E_STRICT, or E_(USER_)WARNING • The CLI test runner now only stops after a test errored when --stop-on-error or --stop-on-defect is used • The CLI test runner now only stops after a test failed when --stop-on-failure or --stop-on-defect is used • The CLI test runner now only stops after a test triggered a warning when --stop-on-warning or --stop-on-defect is used • The CLI test runner now only stops after a test was marked as risky when --stop-on-risky or --stop-on-defect is used • The CLI test runner now only stops after a test was skipped when --stop-on-skipped is used
  37. #phperkaigi #a © 2012-2023 BASE, Inc. 今回触れたChangeLog 68 各テストの結果やテスト自体の問題を区別する •

    The CLI test runner now only stops after a test was marked as incomplete when --stop-on-incomplete is used • #3777: Remove PHPUnit\Framework\Error* classes • Removed the expectDeprecation(), expectDeprecationMessage(), and expectDeprecationMessageMatches() methods • Removed the expectError(), expectErrorMessage(), and expectErrorMessageMatches() methods • Removed the expectNotice(), expectNoticeMessage(), and expectNoticeMessageMatches() methods • Removed the expectWarning(), expectWarningMessage(), and expectWarningMessageMatches() methods
  38. #phperkaigi #a © 2012-2023 BASE, Inc. 今回触れたChangeLog 69 PHP8.0のAttributeを用いたメタデータの仕様変更 •

    #4502: Support PHP 8 attributes for adding metadata to test classes and test methods as well as tested code units • #4603: Use "property" instead of "attribute" for configuring the backup of static fields • #4601: Remove assertions that operate on class/object properties
  39. #phperkaigi #a © 2012-2023 BASE, Inc. 今回触れたChangeLog 70 色覚多様性に関するアクセシビリティを考慮したコードカバレッジレポートの仕様変更 •

    #4893: Make path to custom.css for HTML code coverage report configurable DataProviderの仕様変更 • Using a non-static method as a data provider is now deprecated • Using a non-public method as a data provider is now deprecated • Declaring a data provider method to require an argument is now deprecated
  40. #phperkaigi #a © 2012-2023 BASE, Inc. 今回触れたChangeLog 71 文法の誤りや差別的な用語を消す •

    #4063: Remove assertNotIsReadable() • #4066: Remove assertNotIsWritable() • #4069: Remove assertDirectoryNotExists() • #4072: Remove assertDirectoryNotIsReadable() • #4075: Remove assertDirectoryNotIsWritable() • #4078: Remove assertFileNotExists() • #4081: Remove assertFileNotIsReadable() • #4087: Remove assertRegExp() • #4090: Remove assertNotRegExp() • #4272: Remove PHPUnit\Util\Blacklist • #4273: Remove PHPUnit\Framework\TestCase::$backupGlobalsBlacklist • #4274: Remove PHPUnit\Framework\TestCase::$backupStaticAttributesBlacklist • #4278: Remove --whitelist option • #4536: Remove assertFileNotIsWritable()