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のマニュアルを徹底解剖してみる_パート1
Search
kouki.miura
May 18, 2024
Programming
1
77
PHPUnitのマニュアルを徹底解剖してみる_パート1
PHPUnitのマニュアルを詳細に見てみました。
新たな発見があるか確認してみます。
PHPUnit 11.1のマニュアル1章~2章の内容です。
kouki.miura
May 18, 2024
Tweet
Share
More Decks by kouki.miura
See All by kouki.miura
オンプレミス環境にKubernetesを構築する
koukimiura
0
52
TypeScriptがなぜ必要だったか
koukimiura
0
26
PHPUnitのマニュアルを徹底解剖してみる パート2
koukimiura
1
48
初心者向け!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
令和時代のLAMPを考える
koukimiura
0
29
Other Decks in Programming
See All in Programming
各クラウドサービスにおける.NETの対応と見解
ymd65536
0
160
StarlingMonkeyを触ってみた話 - 2024冬
syumai
3
280
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
230
命名をリントする
chiroruxx
1
440
Amazon S3 NYJavaSIG 2024-12-12
sullis
0
110
rails statsで大解剖 🔍 “B/43流” のRailsの育て方を歴史とともに振り返ります
shoheimitani
2
950
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
4
350
htmxって知っていますか?次世代のHTML
hiro_ghap1
0
350
PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録
mashirou1234
0
330
ChatGPT とつくる PHP で OS 実装
memory1994
PRO
2
130
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
520
PSR-15 はあなたのための ものではない? - phpcon2024
myamagishi
0
180
Featured
See All Featured
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
Testing 201, or: Great Expectations
jmmastey
41
7.1k
Code Review Best Practice
trishagee
65
17k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Being A Developer After 40
akosma
87
590k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Optimizing for Happiness
mojombo
376
70k
Transcript
PHPUnitのマニュアルを徹底解剖 パート1 三浦 恒樹 (MIURA KOUKI) 診療情報管理士 上級医療情報技師 医用画像情報専門技師 ドゥウェル株式会社
2024.05.18 第3回 札幌 PHP 勉強会
長男が飼っている ハリネズミがアイコン INTRODUCE ・ドゥウェル株式会社 (医療系IT開発・導入会社)に所属 ・マネージャー(プレイングマネージャー) ・仕事では Java(Linux) or C#(WindowsServer)
+ JavaScript ・趣味では PHP + JavaScript ・3児の父 ・札幌PHP勉強会、JBUG札幌、JavaDO、ゆるWeb勉強会 に参加
PHPUnitのマニュアルを細かく見る理由 ・PHPUnitを使いたくなったが、使い方が分からなかったため ・せっかく学習するなら、細かいところまで見てみたくなったため ・少し読んでみたら、開発者のこだわりが伝わってきて面白くなってきたため ・「WebServerに置かないでね」とか親切な説明が いいね! と思ったため ・日本語翻訳リポジトリは2年前に止まってしまっているため
PHPUnitのマニュアルの構成 https://docs.phpunit.de/en/11.1/ ・全10章+APPENDIX(メソッド詳細等)6章 ・”パート1”では以下の2章を見る 1. Installation(インストール) 2. Writing Tests for
PHPUnit(PHPUnitのテストの書き方)
1. Install(インストール) ・文字数 24,825 ・構成 ・PHP on the Command-Line ・Installing PHPUnit
1. Install(インストール) h2 h3 サマリ PHP on the Command-Line Installing
the PHP Command-Line Interpreter PHPUnitを使うためのPHP拡張機能。 Ubuntu: php-cli、php-json、php-mbstring、php-xml、 php-pov、php-xdebug Windows: mbstring Using the PHP Command-Line Interpreter php --versionコマンドで、phpコマンドにパスが通っていること、 php コマンドが動作すること、バージョンが正しいことを確認。 Configuring PHP for Development PHPUnitを使うためのphp.iniの設定。 error_reporting=-1(エラーを確認するため) xdebug.show_exception_trace=0(xdebugのエラー抑制) xdebug.mode=coverage(xdebugのカバレッジモード) zend.assertions=1, assert.exception=1(assert()関数の利用) memory_limit=-1(カバレッジのためのメモリ制限解除) LineCoverageだけの場合は、XdebugではなくPCOV拡張機能が パフォーマンスの点でおすすめ。 ※Xdebugをカバレッジツールだけでなく、デバッグツールとしても使 用する場合は xdebug.mode=debug,coverage
1. Install(インストール) h2 h3 サマリ Installing PHPUnit PHP Archive (PHAR)
PHPUnitのインストールと使用でおすすめの方法。 https://phar.phpunit.de/phpunit-11.phar でPHPUnit 11の最新バージョンをダウンロードできる。 ※マニュアルではまだ~ phpunit-10.pharと記載 一般的なディレクトリ構成 public(app static assets(CSS, JavaScript, images)) src(app PHP source code) tests(app test suite) tools(PHAR形式のPHPUnit等) Phiveを使用する方法もあり。(割愛) Composer composer require --dev phpunit/phpunit composer.jsonはプロジェクト依存関係を含むためバージョン管理すること。 composer.lockは必須ではないが、バージョン管理を推奨。 composer updateはメジャーバージョンを更新しないため、更新する必要がある場合は composer.jsonを修正する。 PHAR or Composer Composerの場合、ツールが必要なライブラリと開発ソフトウェアが必要なライブラリがとも にvendorディレクトリにインストールされ、依存関係の競合が発生する。 自己完結するPHARは開発ソフトウェアと依存関係の競合が発生しないため、 PHARを使 用したほうが良い。
1. Install(インストール) h2 h3 サマリ Installing PHPUnit Global Installation PHPUnitを$PATH上に配置して、すべてのプロジェクトで共有することもできる。
ただし、プロジェクトごとに異なる PHPUnitのバージョンが必要になる可能性があるため、 共有インストールは良い考えではない。共有インストールとなる OSのパッケージマネー ジャを使用したPHPUnitのインストールはしないほうが良い。 Web Server テストの作成と実行は開発時の作業のため、 PHPUnitをWebサーバーに配置してはいけ ない。 デプロイ手順でPHPUnitやその他の開発ツールが Webサーバーに公開されないように注 意すること。
2. Writing Tests for PHPUnit(PHPUnitのテストの書き方) ・文字数 24,083 ・構成 ・Asserting Return Values
・Expecting Exceptions ・Data Providers ・Testing Output ・Incomplete Tests ・Skipping Tests ・Test Dependencies ・Failure Output
2. Writing Tests for PHPUnit(PHPUnitのテストの書き方) h2 h3 サマリ Asserting Return
Values 基本的な規則と手順: 1. GreeterクラスのテストはGreeterTestクラスとする 2. GreeterTestはPHPUnit\Framework\TestCaseを継承する 3. テストはtest*というメソッドでpublicとする またはPHPUnit\Framework\Attributes\Test属性を使用できる 4. テストメソッドでassertSame()のような評価メソッドで実際の値と期待値を比較する マーチン・ファウラーの言葉: printやdebugger式を書きたくなったら代わりにテストを書いてください。 Expecting Exceptions expectException()メソッドは期待する例外がスローされる前に使用する。 例外をスローするコードの直前に expectException()メソッドを呼ぶべき。 expectExceptionCode()、expectExceptionMessage()、expectExceptionMessageMatches()も存在する テストの3つの操作は、「戻り値の評価」「例外の期待」「副作用の検証」。 Data Providers テストメソッドは任意の引数を受け取る。その引数はデータ供給者により供給することができる。 PHPUnit\Framework\Attributes\DataProviderまたはDataProviderExternal属性を使用する。 データ供給者メソッドは publicかつstaticである必要がある。 Testing Output メソッド実行時の出力を評価したい場合がある。 PHPUnit\Framwork\TestCaseクラスの出力バッファリングでこれを実現している。 expectOutputRegex()は正規表現で出力を評価する。 expectOutputString()は文字列一致で出力を評価する。
2. Writing Tests for PHPUnit(PHPUnitのテストの書き方) h2 h3 サマリ Incomplete Tests
テストメソッドが無い空のテストクラスを作る場合がある。 空のテストメソッドは失敗しないため、成功したと誤解されることが問題。 テスト成功が青、テスト失敗が赤と考えると、テスト不完全の黄色信号が必要。 markTestIncomplete()メソッドは不完全なテストとしてマークできる。 不完全なテストは、PHPUnitコマンドラインのテストランナー出力で Iが表示される。 Skipping Tests すべてのテストが、すべての環境で実行できるわけではない。 例えばMySQLドライバーのテストは MySQLサーバーが使用可能な環境でのみ実行できる。 setUp()メソッドで、環境を確認してテストを実行できないときは markTestSkipped()。 テストのスキップは、 PHPUnitコマンドラインのテストランナー出力で Sが表示される。 RequiresFunction()は指定された名前の関数が定義されていない場合はスキップする。 RequiresMethod()は指定された名前のメソッドが定義されていない場合はスキップする。 RequiresOperatingSystem()は正規表現と一致しない OSの場合はスキップする。 RequiresOperatingSystemFamily()はOSのファミリーと一致しない場合はスキップする。 RequiresPhp()はPHPバージョンが一致しない場合はスキップする。 RequiresPhpExtension()は指定したPHP拡張機能が利用できない場合はスキップする。 RequiresPhpunit()はPHPUnitのバージョンが一致しない場合はスキップする。 RequiresSetting()はPHP構成設定の値が一致しない場合はスキップする。
2. Writing Tests for PHPUnit(PHPUnitのテストの書き方) h2 h3 サマリ Test Dependencies
PHPUnitはテストメソッド間の明示的な実行順序をサポートする。 プロデューサーはテスト対象のインスタンスを戻り値とするテストメソッド。 コンシューマは1つ以上のプロデューサとその戻り値をパラメータとするテストメソッド。 依存関係が設定されている場合、依存するテストが失敗した場合はスキップされる。 複数のテスト依存関係を設定することもできる。 Failure Output テストが失敗したとき、 PHPUnitは問題の特定に役立つ内容をできるだけ提供する。 例えば巨大な配列の一致が失敗した場合、失敗したインデックス周辺の数行を出力する。 エッジケース: 比較が失敗すると、 PHPUnitは入力値のテキスト表現でも比較する。
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章 不完全なテストの定義、スキップ、テスト間の依存関係(順序) ご清聴ありがとうございました。