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
100
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
生成AIによる PHP = Node.js 変換の検証
koukimiura
0
38
Javaの学習・実行環境-JBangの概要
koukimiura
0
49
オンプレミス環境にKubernetesを構築する
koukimiura
0
100
TypeScriptがなぜ必要だったか
koukimiura
0
43
PHPUnitのマニュアルを徹底解剖してみる パート2
koukimiura
1
61
初心者向け!OSSコントリビュート概要 ~ Keycloakにプルリクエストしてみた話
koukimiura
0
170
Vuetify - Data Table Componentの検証
koukimiura
0
56
PostgreSQL-Windows x86-64インストーラでインストール
koukimiura
0
75
QuarkusによるCloudNativeなJava
koukimiura
0
110
Other Decks in Programming
See All in Programming
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
36
14k
Multi Step Form, Decentralized Autonomous Organization
pumpkiinbell
1
730
Pythonでもちょっとリッチな見た目のアプリを設計してみる
ueponx
1
550
Spring gRPC について / About Spring gRPC
mackey0225
0
220
『品質』という言葉が嫌いな理由
korimu
0
160
時計仕掛けのCompose
mkeeda
1
290
Honoとフロントエンドの 型安全性について
yodaka
7
1.2k
Pulsar2 を雰囲気で使ってみよう
anoken
0
240
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
250
一休.com のログイン体験を支える技術 〜Web Components x Vue.js 活用事例と最適化について〜
atsumim
0
450
color-scheme: light dark; を完全に理解する
uhyo
3
280
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
140
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
Mobile First: as difficult as doing things right
swwweet
223
9.3k
Navigating Team Friction
lara
183
15k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
A better future with KSS
kneath
238
17k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
330
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
The World Runs on Bad Software
bkeepers
PRO
67
11k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
410
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章 不完全なテストの定義、スキップ、テスト間の依存関係(順序) ご清聴ありがとうございました。