Slide 1

Slide 1 text

2023/03/23 PHPerKaigi 2023 @02 PHPUnit 10 概論

Slide 2

Slide 2 text

#phperkaigi #a © 2012-2023 BASE, Inc. Web Application Enginner 02 大津 和槻 :@cocoeyes02 2021/02~ BASE, Inc. 自己紹介 PHP系カンファレンス登壇 執筆 登壇応援中!

Slide 3

Slide 3 text

#phperkaigi #a © 2012-2023 BASE, Inc. 3年ぶりのPHPUnit メジャーバージョンアップ 3 https://phpunit.de/index.html

Slide 4

Slide 4 text

#phperkaigi #a © 2012-2023 BASE, Inc. 4 https://phpunit.de/index.html 3年ぶりのPHPUnit メジャーバージョンアップ

Slide 5

Slide 5 text

#phperkaigi #a © 2012-2023 BASE, Inc. 🎉 5 3年ぶりのPHPUnit メジャーバージョンアップ

Slide 6

Slide 6 text

#phperkaigi #a © 2012-2023 BASE, Inc. 6 https://github.com/sebastianbergmann/phpunit/blob/main/ChangeLog-10.0.md 3年ぶりのPHPUnit メジャーバージョンアップ

Slide 7

Slide 7 text

#phperkaigi #a © 2012-2023 BASE, Inc. 多い 7 3年ぶりのPHPUnit メジャーバージョンアップ

Slide 8

Slide 8 text

#phperkaigi #a © 2012-2023 BASE, Inc. 今日はPHPUnit 10のアップデート について時間が許す限り解説します 8 3年ぶりのPHPUnit メジャーバージョンアップ

Slide 9

Slide 9 text

#phperkaigi #a © 2012-2023 BASE, Inc. 今日話す内容 9 ● PHP8.1以上が必須に ● 新しいテストイベントシステムの追加 ● 各テストの結果やテスト自体の問題を区別する ● PHP8.0のAttributeを用いたメタデータの仕様変更 ● 色覚多様性を考慮したコードカバレッジレポートの仕様変更 ● DataProviderの仕様変更 ● 文法の誤りや差別的な用語を消す ● 削除されたが代替手段の提供がないメソッド

Slide 10

Slide 10 text

PHP8.1以上が必須に

Slide 11

Slide 11 text

#phperkaigi #a © 2012-2023 BASE, Inc. PHP8.1以上が必須に 11 https://phpunit.de/index.html

Slide 12

Slide 12 text

#phperkaigi #a © 2012-2023 BASE, Inc. PHP8.1以上が必須に 12 https://www.php.net/supported-versions.php

Slide 13

Slide 13 text

新しいテストイベント システムの追加

Slide 14

Slide 14 text

#phperkaigi #a © 2012-2023 BASE, Inc. 新しいテストイベント システムの追加 14 テストイベント(テスト開始・終了、合格・不合格など)にまつわるシステムが 抜本的に変わりました。 これまで使用していた既存のテストイベントにまつわるシステム(TestListenerや Test Hookなど)は10.0で削除され、新しいシステムを使用することになります。

Slide 15

Slide 15 text

#phperkaigi #a © 2012-2023 BASE, Inc. 15 対象となるテストイベントの数はなんと49個 https://thephp.cc/presentations/phpunit-10-the-new-event-subsystem 新しいテストイベント システムの追加

Slide 16

Slide 16 text

#phperkaigi #a © 2012-2023 BASE, Inc. 16 基本的な使い方は3ステップ 1. 関連するイベントのSubscriberを作成する 2. Subscriberを設定するExtensionを作成する 3. Extensionをphpunit.xml等に設定する 新しいテストイベント システムの追加

Slide 17

Slide 17 text

#phperkaigi #a © 2012-2023 BASE, Inc. 17 1. 関連するイベントのSubscriberを作成する https://docs.phpunit.de/en/10.0/extending-phpunit.html#extending-phpunit-event-system-extending-the-test-runner-examples-executionfinishedsubscriber-php 新しいテストイベント システムの追加

Slide 18

Slide 18 text

#phperkaigi #a © 2012-2023 BASE, Inc. 18 1. 関連するイベントのSubscriberを作成する https://docs.phpunit.de/en/10.0/extending-phpunit.html#extending-phpunit-event-system-extending-the-test-runner-examples-executionfinishedsubscriber-php 新しいテストイベント システムの追加

Slide 19

Slide 19 text

#phperkaigi #a © 2012-2023 BASE, Inc. 19 2. Subscriberを設定するExtensionを作成する https://docs.phpunit.de/en/10.0/extending-phpunit.html#event-system-subscribing-to-events-examples-extension-php 新しいテストイベント システムの追加

Slide 20

Slide 20 text

#phperkaigi #a © 2012-2023 BASE, Inc. 20 2. Subscriberを設定するExtensionを作成する https://docs.phpunit.de/en/10.0/extending-phpunit.html#event-system-subscribing-to-events-examples-extension-php 新しいテストイベント システムの追加

Slide 21

Slide 21 text

#phperkaigi #a © 2012-2023 BASE, Inc. 21 3. Extensionをphpunit.xml等に設定する https://docs.phpunit.de/en/10.0/extending-phpunit.html#extending-phpunit-event-system-extending-the-test-runner-examples-phpunit-xml 新しいテストイベント システムの追加

Slide 22

Slide 22 text

各テストの結果や テスト自体の問題を 区別する

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

#phperkaigi #a © 2012-2023 BASE, Inc. 24 各テストの結果やテスト自体の問題のそれぞれを区別することによる影響 ● テストを中止する条件の変更 ● デフォルトでは、deprecations, notices, warningsなどを出力しない ● 特定のテストの結果やテスト自体の問題が発生しても、例外を投げない 各テストの結果や テスト自体の問題を区別する

Slide 25

Slide 25 text

#phperkaigi #a © 2012-2023 BASE, Inc. 25 テストを中止する条件の変更 いくつかのテストの結果やテスト自体の問題では、発生してもテストを中止しないよう になりました。 中止しないようになったイベントは以下です。 ● Deprecated ● Notice ● Strict ● Warning 各テストの結果や テスト自体の問題を区別する

Slide 26

Slide 26 text

#phperkaigi #a © 2012-2023 BASE, Inc. 26 26 テストを中止する条件の変更 https://phpunit.de/announcements/phpunit-10.html 各テストの結果や テスト自体の問題を区別する

Slide 27

Slide 27 text

#phperkaigi #a © 2012-2023 BASE, Inc. 27 27 テストを中止する条件の変更 https://phpunit.de/announcements/phpunit-10.html 各テストの結果や テスト自体の問題を区別する

Slide 28

Slide 28 text

#phperkaigi #a © 2012-2023 BASE, Inc. 28 28 テストを中止する条件の変更 https://phpunit.de/announcements/phpunit-10.html 各テストの結果や テスト自体の問題を区別する

Slide 29

Slide 29 text

#phperkaigi #a © 2012-2023 BASE, Inc. 29 29 テストを中止する条件の変更 https://phpunit.de/announcements/phpunit-10.html 各テストの結果や テスト自体の問題を区別する

Slide 30

Slide 30 text

#phperkaigi #a © 2012-2023 BASE, Inc. 30 30 テストを中止する条件の変更 https://phpunit.de/announcements/phpunit-10.html 各テストの結果や テスト自体の問題を区別する

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

#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 各テストの結果や テスト自体の問題を区別する

Slide 33

Slide 33 text

#phperkaigi #a © 2012-2023 BASE, Inc. 33 33 デフォルトでは、deprecations, notices, warningsなどを出力しない https://phpunit.de/announcements/phpunit-10.html 各テストの結果や テスト自体の問題を区別する

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

#phperkaigi #a © 2012-2023 BASE, Inc. 35 特定のテストの結果やテスト自体の問題が発生しても、例外を投げない また、例外として検知しなくなった以下のメソッドも削除になりました。 ● expectDeprecation()、expectDeprecationMessage() 、 expectDeprecationMessageMatches() ● expectError()、expectErrorMessage()、expectErrorMessageMatches() ● expectNotice()、expectNoticeMessage()、 expectNoticeMessageMatches() ● expectWarning()、expectWarningMessage()、 expectWarningMessageMatches() 各テストの結果や テスト自体の問題を区別する

Slide 36

Slide 36 text

#phperkaigi #a © 2012-2023 BASE, Inc. 36 特定のテストの結果やテスト自体の問題が発生しても、例外を投げない 残念ながら現時点では代替手段の提供はありません。 各テストの結果や テスト自体の問題を区別する

Slide 37

Slide 37 text

PHP8.0のAttributeを 用いたメタデータの仕様変更

Slide 38

Slide 38 text

#phperkaigi #a © 2012-2023 BASE, Inc. PHP8.0のAttributeを用いた メタデータの仕様変更 38 PHP8.0 でAttributesが実装されたので、PHPUnitでもAttributesを使ってメタデータ を指定できるようになりました。 優先度が Attributesのメタデータ > コメントのメタデータ になる他、 コメントのメタデータはPHPUnit11で非推奨、PHPUnit12では削除になるようです。

Slide 39

Slide 39 text

#phperkaigi #a © 2012-2023 BASE, Inc. 39 例:DataProviderをAttributeを用いて呼び出す場合

Slide 40

Slide 40 text

#phperkaigi #a © 2012-2023 BASE, Inc. 40 例:DataProviderをAttributeを用いて呼び出す場合

Slide 41

Slide 41 text

#phperkaigi #a © 2012-2023 BASE, Inc. 41 また、PHPUnit内ではプロパティをAttributeと読んでいましたが、 Attribute → Propertyへと名前を変える方針になりました。 そのため、Attributeと名のつくassertメソッドが全て削除されます (代替手段がないメソッドもあり) PHP8.0のAttributeを用いた メタデータの仕様変更

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

#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を用いた メタデータの仕様変更

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

色覚多様性を考慮した コードカバレッジレポートの 仕様変更

Slide 46

Slide 46 text

#phperkaigi #a © 2012-2023 BASE, Inc. 色覚多様性を考慮した コードカバレッジレポートの仕様変更 46 https://github.com/sebastianbergmann/php-code-coverage/issues/556

Slide 47

Slide 47 text

#phperkaigi #a © 2012-2023 BASE, Inc. 色覚多様性を考慮した コードカバレッジレポートの仕様変更 47 phpunit.xml等で、Success(Low, Medium, High)、Warning、Dangerの色を 任意の色へと指定できるようになりました

Slide 48

Slide 48 text

DataProviderの仕様変更

Slide 49

Slide 49 text

#phperkaigi #a © 2012-2023 BASE, Inc. DataProviderの仕様変更 49 以下の条件に当てはまるDataProviderが非推奨になりました。 ● staticではない ● publicではない ● 引数を必要とする 逆にいえば、以下のような形式のDataProviderを推奨しているということですね。 public static XXX() {}

Slide 50

Slide 50 text

文法の誤りや 差別的な用語を消す

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

#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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

#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 オプション

Slide 55

Slide 55 text

削除されたが代替手段の提供 がないメソッド

Slide 56

Slide 56 text

#phperkaigi #a © 2012-2023 BASE, Inc. 削除されたが 代替手段の提供がないメソッド 56 2つほど紹介します。 どちらもPHPUnit9の時点で、非推奨になったメソッドです。 ● at ● withConsecutive

Slide 57

Slide 57 text

#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 削除されたが 代替手段の提供がないメソッド

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

#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 削除されたが 代替手段の提供がないメソッド

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

#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を出したりする方が 早く事が運ぶかもしれませんね。 削除されたが 代替手段の提供がないメソッド

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

#phperkaigi #a © 2012-2023 BASE, Inc. 最後に 64 バックエンド エンジニア SRE フロントエンド エンジニア セキュリティ エンジニア QA エンジニア データ エンジニア etc… We are hiring! https://binc.jp/jobs

Slide 65

Slide 65 text

#phperkaigi #a © 2012-2023 BASE, Inc. 今回触れたChangeLog 65 PHP8.1以上が必須に ● PHP 7.3, PHP 7.4, and PHP 8.0 are no longer supported

Slide 66

Slide 66 text

#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

Slide 67

Slide 67 text

#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

Slide 68

Slide 68 text

#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

Slide 69

Slide 69 text

#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

Slide 70

Slide 70 text

#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

Slide 71

Slide 71 text

#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()

Slide 72

Slide 72 text

#phperkaigi #a © 2012-2023 BASE, Inc. 今回触れたChangeLog 72 削除されたが代替手段の提供がないメソッド ● #4298: Remove at() matcher ● #4564: Remove withConsecutive()