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
61
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
TypeScriptがなぜ必要だったか
koukimiura
0
22
PHPUnitのマニュアルを徹底解剖してみる パート2
koukimiura
1
43
初心者向け!OSSコントリビュート概要 ~ Keycloakにプルリクエストしてみた話
koukimiura
0
120
Vuetify - Data Table Componentの検証
koukimiura
0
39
PostgreSQL-Windows x86-64インストーラでインストール
koukimiura
0
44
QuarkusによるCloudNativeなJava
koukimiura
0
77
リーン、アジャイルと自社プロセスの比較
koukimiura
0
150
令和時代のLAMPを考える
koukimiura
0
27
Other Decks in Programming
See All in Programming
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
Quine, Polyglot, 良いコード
qnighy
4
650
React への依存を最小にするフロントエンド設計
takonda
18
4.5k
Missing parts when designing and implementing Android UI
ericksli
0
190
Modular Monolith Monorepo ~シンプルさを保ちながらmonorepoのメリットを最大化する~
yuisakamoto
9
790
3rd party scriptでもReactを使いたい! Preact + Reactのハイブリッド開発
righttouch
PRO
1
610
シェーダーで魅せるMapLibreの動的ラスタータイル
satoshi7190
1
480
DevTools extensions で 独自の DevTool を開発する | FlutterKaigi 2024
kokiyoshida
0
120
Less waste, more joy, and a lot more green: How Quarkus makes Java better
hollycummins
0
100
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
200
Hotwire or React? ~アフタートーク・本編に含めなかった話~ / Hotwire or React? after talk
harunatsujita
1
120
初めてDefinitelyTypedにPRを出した話
syumai
0
430
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
GitHub's CSS Performance
jonrohan
1030
460k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
380
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
120
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Unsuck your backbone
ammeep
668
57k
Facilitating Awesome Meetings
lara
50
6.1k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
The Art of Programming - Codeland 2020
erikaheidi
52
13k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
430
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
47
2.1k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
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章 不完全なテストの定義、スキップ、テスト間の依存関係(順序) ご清聴ありがとうございました。