Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPUnitのマニュアルを徹底解剖してみる パート2
Search
kouki.miura
September 09, 2024
Programming
1
48
PHPUnitのマニュアルを徹底解剖してみる パート2
PHPUnutのマニュアルを要約しながら、実装されている機能・オプション等を見ていきます。
kouki.miura
September 09, 2024
Tweet
Share
More Decks by kouki.miura
See All by kouki.miura
オンプレミス環境にKubernetesを構築する
koukimiura
0
49
TypeScriptがなぜ必要だったか
koukimiura
0
26
初心者向け!OSSコントリビュート概要 ~ Keycloakにプルリクエストしてみた話
koukimiura
0
120
Vuetify - Data Table Componentの検証
koukimiura
0
46
PostgreSQL-Windows x86-64インストーラでインストール
koukimiura
0
61
QuarkusによるCloudNativeなJava
koukimiura
0
86
リーン、アジャイルと自社プロセスの比較
koukimiura
0
160
PHPUnitのマニュアルを徹底解剖してみる_パート1
koukimiura
1
77
令和時代のLAMPを考える
koukimiura
0
29
Other Decks in Programming
See All in Programming
歴史と現在から考えるスケーラブルなソフトウェア開発のプラクティス
i10416
0
120
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
630
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
300
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
arthur1
1
340
Effective Signals in Angular 19+: Rules and Helpers
manfredsteyer
PRO
0
120
DevFest - Serverless 101 with Google Cloud Functions
tunmise
0
110
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
640
rails statsで大解剖 🔍 “B/43流” のRailsの育て方を歴史とともに振り返ります
shoheimitani
2
950
Webエンジニア主体のモバイルチームの 生産性を高く保つためにやったこと
igreenwood
0
340
fs2-io を試してたらバグを見つけて直した話
chencmd
0
240
Cloudflare MCP ServerでClaude Desktop からWeb APIを構築
kutakutat
1
560
命名をリントする
chiroruxx
1
440
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
Designing for Performance
lara
604
68k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
The World Runs on Bad Software
bkeepers
PRO
66
11k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
48
2.2k
Transcript
PHPUnitのマニュアルを徹底解剖 パート2 三浦 恒樹 (MIURA KOUKI) 診療情報管理士 上級医療情報技師 医用画像情報専門技師 ドゥウェル株式会社
2024.09.07 第4回 札幌 PHP 勉強会
長男が飼っている ハリネズミがアイコン INTRODUCE ・ドゥウェル株式会社 (医療系IT開発・導入会社)に所属 ・マネージャー(プレイングマネージャー) ・仕事では Java,C#,Node.js + JavaScript,TypeScript
・趣味では PHP,Node.js + JavaScript ・3児の父 ・札幌PHP勉強会、JBUG札幌、JavaDO、ゆるWeb勉強会 等に参加
PHPUnitのマニュアルを細かく見る理由 ・PHPUnitを使いたくなったが、使い方が分からなかったため ・せっかく学習するなら、細かいところまで見てみたくなったため ・少し読んでみたら、開発者のこだわりが伝わってきて面白くなってきたため ・「WebServerに置かないでね」とか親切な説明が いいね! と思ったため ・日本語翻訳リポジトリは2年前に止まってしまっているため パート1
PHPUnitのマニュアルの構成 https://docs.phpunit.de/en/11.1/ ・全10章+APPENDIX(メソッド詳細等)6章 ・”パート1”では以下の2章を見る 1. Installation(インストール) 2. Writing Tests for
PHPUnit(PHPUnitのテストの書き方) パート1
パート1 SUMMARY ・1章 PHP拡張機能は cli, json, mbstring, xml, pov, xdebug ・1章 PHPUnitのためのphp.iniの設定
・1章 インストールはPHARがおすすめ ・1章 Global Installationはおすすめしない ・2章 expectException()で例外の発生をテスト ・2章 属性でDataProviderを指定できる ・2章 expectOutputRegex|String()で出力をテスト ・2章 不完全なテストの定義、スキップ、テスト間の依存関係(順序) パート1
PHPUnitのマニュアルの構成 https://docs.phpunit.de/en/11.3/ ・全10章+APPENDIX(メソッド詳細等)6章 ・”パート2”では以下の3章を見る 3. The Command-Line Test Runner(コマンドラインテストランナー) 4.
Organizing Tests(テストを構成する) 5. Fixtures(準備)
3. The Command-Line Test Runner ・文字数 11,938 ・構成 ・Outcome and Issues
・Command-Line Options
h2 h3 サマリ phpunitコマンドでテストランナーを起動。 Phpunit tests/ArrayTest.php を実行すると、カレントディレクトリからtests/ArrayTest.phpファイルを ロードしてArrayTestテストケースクラスを見つけて、テストを実行。 Outcome and
Issues テストの結果をエラー、失敗、不完全、スキップ、合格および、テストの危険、 警告に分類する。 失敗とエラーを区別する。 エラーは失敗よりも修正が簡単なため、問題のリストが大量にある場合、先 にエラーの対応をする方が良い。 進行状況: .=合格、F=失敗、E=エラー、W=警告、R=危険、D=非推奨、N=注意、I= 不完全、S=スキップ 3. The Command-Line Test Runner
h2 h3 サマリ Command-Line Options Configuration --bootstrap <file> テスト実行前に読込むPHPスクリプト。テスト対象 コードをロードする以外はするべきではない。
-c | --configuration <file> XML構成ファイルを指定。カレントディレ クトリにphpunit.xml, phpunit.dist.xml, phpunit.xml.distファイル がある場合は不要。 --no-configuration カレントディレクトリにあるXML構成ファイルを使 用しない。 --no-extensions XML構成ファイルでい指定したディレクトリのPHARs からテストランナー拡張機能をロードしない。 --include-path <path> include_path先頭にパスを追加。 – d <key=value> php.iniパラメータを設定。 --cache-directory <dir> テスト結果、情報、分析等をキャッシュする ディレクトリ。 --generate-configuration XML構成ファイルを推奨デフォルト値で出 力。 --migrate-configuration 旧バージョンのXML構成ファイルを現在バー ジョンに更新。 3. The Command-Line Test Runner
h2 h3 サマリ Command-Line Options Selection --list-suites XML構成ファイルに定義されたテストスイートをリスト表示。 --testsuite <name>
XML構成ファイルに定義され、カンマ区切りで指 定したテストスイートを実行。 --exclude-testsuite <name> XML構成ファイルに定義され、カンマ 区切りで指定したテストスイート以外を実行。 --list-groups 利用可能なテストグループをリスト表示。 --group <name> カンマ区切りで指定したグループのテストを実行。 --exclude-group <name> カンマ区切りで指定したテストスイート以外 を実行。 --covers <name> 指定したクラス・メソッド・関数をカバーするテストを 実行。 --uses <name> 指定したクラスを使うテストを実行。 --list-tests テストをリスト表示。 --list-tests-xml <file> テストのリストを指定したXMLに出力。 --filter <pattern> 指定したテスト名パターンのテストを実行。複数パ ターン指定可。 --test-suffix <suffixes> 指定したファイル名末尾のテストを実行。 3. The Command-Line Test Runner
h2 h3 サマリ Command-Line Options Execution Isolation --process-isolation 各テストを個別のプロセスで実行。 --globals-backup
各テスト前にグローバル変数・スーパーグローバル変数を保存、テスト後に復 元。 --static-backup 各テスト前にクラスの静的プロパティを保存、テストに復元。 Risky Tests --strict-coverage コードカバレッジの測定を厳密にする。 --strict-global-state グローバル状態の変更を厳密にする。 --disallow-test-output テスト中の出力を厳密にする。 --enforce-time-limit テストサイズに基づく時間制限を適用。 --default-time-limit <sec> 時間制限がないテストのデフォルト時間制限。 --dont-report-useless-tests 何もしないテストは報告しない。 Automatically stop when… --stop-on-defect 最初にエラー、失敗、警告、危険が発生した場合にテストを停止。 --stop-on-error|failure|warning|risky|deprecation|notice|skipped|incomplete エラー、失敗、警告、危険、非推奨、通知、スキップ、不完全を確認したときにテストを停止。 Exit with error code when… --fail-on-warning|risky|deprecation|notice|incomplete|skipped 警告、危険、非推 奨、通知、不完全、スキップが1件以上あればテストを失敗とする。 Test Result Cache --cache-result 並び替え等のためにテスト結果をキャッシュする。 --do-not-cache-result テスト結果をキャッシュしない。 Test Order --order-by <order> default, defects, depends, duration, no-depends, random, reverse, sizeのカンマ区切りでテストを並び変える。 --random-order-seed <N> ランダムで並び変える場合のシードを指定する。 3. The Command-Line Test Runner
h2 h3 サマリ Command-Line Options Reporting Console --colors <flag> never,
auto, always を指定して出力結果に色を付 ける。 --columns <n> 進捗状況出力の列数。 --columns max 進捗状況出力の列数を最大にする。 --stderr stdoutではなく、stderrに出力する。 Progress and Result Printing --no-progress 進捗状況を出力しない。 --no-results テスト結果を出力しない。 --no-output 何も出力しない。 Details about Issues --display-incomplete|skipped|deprecations|errors|notices| warnings 不完全、スキップ、非推奨、エラー、通知、警告の詳細を表示。 --reverse-list 欠陥を逆順で出力。 Alternative Output --teamcity 進捗状況とテスト結果をTeamCity形式で出力。 --testdox テスト結果をTestDox形式で出力。 3. The Command-Line Test Runner
h2 h3 サマリ Command-Line Options Logging --log-junit <file> テスト結果をJUnit XML形式でファイルに出力。
--log-teamcity <file> テスト結果をTeamCity形式でファイルに出力。 --testdox-html <file> テスト結果をTestDox形式(HTML)でファイルに出力。 --testdox-text <file> テスト結果をTestDox形式(TEXT)でファイルに出力。 --log-events-text <file> イベントをファイルに出力。 --log-events-verbose-text <file> 。テレメトリ情報を含むイベントをファイルに出力。 --no-logging XML構成ファイルで指定されたログ出力設定を無視してログ出力しない。 Code Coverage --coverage-clover <file> コードカバレッジレポートをClover XML形式でファイルに出力。 --coverage-cobertura <file> コードカバレッジレポートをCobertura XML形式でファイルに 出力。 --coverage-crap4j <file> コードカバレッジレポートをCrap4J XML形式でファイルに出力。 --coverage-html <dir> コードカバレッジレポートをHTML形式でファイルに出力。 --coverage-php <file> シリアル化されたコードカバレッジレポートをファイルに出力。 --coverage-text=<file> コードカバレッジレポートをテキスト形式でファイルに出力。 --coverage-xml <dir> コードカバレッジレポートをXML形式で指定したディレクトリに出力。 --warm-coverage-cache コードカバレッジレポートに必要な静的分析用キャッシュ。 --coverage-filter <dir> コードカバレッジレポートにdirを含む。 --path-coverage パスカバレッジを計測する。 --disable-coverage-ignore コードカバレッジを無視するためのメタデータを無効にする。 --no-coverage XML構成ファイルで指定したコードカバレッジを無視してカバレッジ計測しない。 Miscellaneous -h|--help 使用状況を出力。 --version バージョンを出力。 --atleast-version <min> バージョンがminより大きいか確認する。 --check-version PHPUnitが最新版か確認する。 3. The Command-Line Test Runner
4. Organizing Tests(テストを構成する) ・文字数 7,538 ・構成 ・Composing a Test Suite Using
the Filesystem ・Composing a Test Suite Using XML Configuration
h2 h3 サマリ PHPUnitはプロジェクト全体のテストや一部のコンポーネントのすべてのクラスのテスト 等を構成できる。 Composing a Test Suite Using
the Filesystem シンプルなパターンはすべてのテストケースのファイルをテストディレクトリに保存するこ と。PHPUnitはテストディレクトリを再帰的に検索してテストを自動検出する。 通常、srcディレクトリのクラス構造をテストディレクトリのクラス構造に反映する。 src/ : ソースコード test/unit : ソースコードに対応するテストコード test/integration : 統合テストコード PHPUnitテストランナーにtestディレクトリを指定するとすべてのテストを実行する。 特定のテストコードのみや--filterオプションで実行するテストを細かく制御できる。 Composing a Test Suite Using XML Configuration XML構成ファイルを使用してテストスイートを構成できる。 XML構成ファイルを使用すれば引数やオプションなしでテストランナーを実行できる。 --list-suitesオプションでXML構成ファイルに定義されたすべてのテストスイートのリス トを出力する。 --testsuiteオプションでXML構成ファイルに定義された特定のテストスイートを実行で きる。 4. Organizing Tests(テストを構成する)
5. Fixtures(備品) ・文字数 9,649 ・構成 ・More setUp() than tearDown() ・Sharing Fixture
・Global State
h2 h3 サマリ テストは通常、「配置、実行、アサート」の構造になる。「配置」=Fixtures(準備)。 準備が単一オブジェクトの場合もあれば、複雑なオブジェクトグラフの場合もある。 PHPUnitはテスト間でのセットアップコードの再利用をサポートする。 テストメソッド実行前にsetUp()テンプレートメソッドが呼ばれる。 テストメソッド実行後に成功・失敗に関係なくtearDown()テンプレートメソッドが呼ばれる。 setUp、tearDownは各テストメソッドに対して1回ずつ実行される。 setUp、tearDownは必要が無いテストメソッドでも呼び出されることに注意すること。
継承関係のテストクラスでparent::setUp()呼び出しを忘れるリスクがあるが、 PHPUnit\Framework\Attributes\Before|Afterを利用すればリスクを軽減できる。 More setUp() than tearDown() setUp()でファイルやソケット等の外部リソース割り当てた場合のみtearDown()を実装する必要 がある(完全に対照的ではない)。 Sharing Fixture 複数テスト間でデータベース接続を共有するとテスト実行を高速化できる。 setUpBeforeClass()、tearDownAfterClass()テンプレートメソッドは、テストケースクラス の最初のテスト実行前と、最後のテスト実行後に呼ばれる。 テスト間でフィクスチャを共有する設計は本来正しくない(密結合)。 Global State グローバル変数やクラスの静的プロパティを使用するコードをテストするのは困難。 --globals-backupオプションまたはXML構成ファイルでbackupGlobals=”true”を設定する とグローバル変数への変更が他のテストに影響しないようにできる。 5. Fixtures(準備)
PHPUnit実行(Windows環境での最小限) php.ini-production -> php.ini wget -O phpunit.phar https://phar.phpunit.de/phpunit-11.phar powershell
PHPUnit実行(Windows環境での最小限) ・配置 ・実行 ・アサート
PHPUnit実行(Windows環境での最小限)
PHPUnit実行(Windows環境での最小限)
SUMMARY ・3章 テストランナーの使い方・オプション ・3章 テストランナーでのテストの選択(selection) ・3章 テストランナーの実行方法(execution) ・3章 テストランナーの表示(reporting)、ログ(logging) ・4章 テストの構成方法、フォルダ構成 ・5章 テストの準備 ・5章 setUp()、tearDown()テンプレートメソッド ・5章 setUpBeforeClass()、tearDownAfterClass()テンプレートメソッド ご清聴ありがとうございました。