Share
Embed
PHPで始める振る舞い駆動開発(Behaviour-Driven Development)
PHPで始める振る舞い駆動開発(Behaviour-Driven Development) - PHP Conference Japan 2025
https://fortee.jp/phpcon-2025/proposal/15d8064d-4085-4cf9-ab44-6972f693577b
uutan1108
June 27, 2025
Transcript
72 slides
-
#phpcon #track4 PHPで始める振る舞い駆動開発 (Behaviour-Driven Development) PHP Conference Japan 2025
うーたん PHPカンファレンス2025 公式ロゴより -
#phpcon #track4 自己紹介 • うーたん ◦ 𝕏:@uutan1108 • 株式会社ゆめみ ◦
サーバーサイドエンジニア ◦ 技術広報 イベント開催するので 来てください!! 3 -
#phpcon #track4 テスト駆動開発 (TDD) テスト駆動開発 (てすとくどうかいはつ、英: test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能
について、最初にテストを書き(これをテストファーストと言う)、そのテス トが動作する必要最低限な実装をとりあえず行なった後、コードを洗練 させる、という短い工程を繰り返すスタイルである。 多くのアジャイルソフトウェア開発手法、例えばエクストリーム・プログラ ミングにおいて強く推奨されている。近年はビヘイビア駆動開発 へと発 展を遂げている。 引用元:https://ja.wikipedia.org/wiki/テスト駆動開発 8 -
#phpcon #track4 TDDのサイクル • 最初にテストを書き • そのテストが動作する必要最低限な実装をとりあえず行 なった後 •
コードを洗練させる という短い工程を繰り返す 画像引用元:https://service.shiftinc.jp/column/4654/ 9 -
#phpcon #track4 ビヘイビア駆動開発 (英: behaviour-driven development;BDD) テスト駆動開発で記述されるテストケースは、作成したプログ ラムの動作が正しいかどうかを検証するために行う「テスト」 である。テストであるという点は同一であるが、加えて、これ
から作成しようとするプログラムに期待される 「振る舞い」 や「制約条件」 、つまり「要求仕様」 に近い形で、 自然言語 を併記しながらテストコードを記述する。 引用元:https://ja.wikipedia.org/wiki/テスト駆動開発 11 -
#phpcon #track4 要求仕様書 要求仕様書は、システム開発やソフトウェアプロジェクトにお いて、顧客やユーザーのニーズや期待を具体的に文書化 するための重要なドキュメントです。 その目的は、開発会社と発注顧客間での認識合わせを図 り、プロジェクトの進行中に生じうる誤解やミスコミュニケー ションを防ぐ
ことです。 引用元:https://biz.techvan.co.jp/tech-is/blog/infra/001258.html 13 -
#phpcon #track4 • 発注顧客 / ビジネスオーナー • プロダクトオーナー / ビジネスアナリスト
• 開発者 / プログラマー • テスター / QAエンジニア • スクラムマスター / プロジェクトマネージャー • など... プロジェクトの進行中に生じうる誤解や ミスコミュニケーションを防ぐ必要がある プロジェクトには多くの人が関わる 15 -
#phpcon #track4 BDD(振る舞い駆動開発)では、 要求仕様を自然言語で記述した テストコード を書いて開発するため、 開発関係者全員がビジネス
要件について議論 することが求められる 17 -
#phpcon #track4 テストで使うライブラリなど • Behat ◦ Behat is a
BDD framework for PHP to help you test business expectations. (引用元:https://github.com/Behat/Behat) ◦ Behat は、ビジネス要件をテストするのに役立つ PHP 用の BDD フレームワークです。 • PHP ◦ Behat で自然言語で記述したシナリオのテストの実装 • Selenium WebDriver ◦ ブラウザをネイティブに操作するために用いる 23 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること 28 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること Feature(機能):テストする機能全体を定義 29 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること As a / I can / so that(ユーザーストーリー) As a: 誰がこの機能を使うか(ユーザーの役割) I can: 何ができるか(実行可能なアクション) so that: なぜその機能が必要か(ビジネス価値・目的) 30 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること Scenario(シナリオ):具体的なテストケースを定義 31 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること Given (前提条件):操作を実行する前の状態 32 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること When(実行アクション):テスト対象となる具体的なアクショ ン 33 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること Then(期待結果):期待される結果を検証 34 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること And(追加条件):複数の条件や検証を並列で記述する 際に使用 35 -
#phpcon #track4 Given ウェブサイトのトップページを開く /** * @Given ウェブサイトのトップページを開く */
public function openHomePage(): void { try { $host = getenv('SELENIUM_HOST') ?: 'localhost'; $port = getenv('SELENIUM_PORT') ?: '4444'; $serverUrl = "http://{$host}:{$port}"; $this->driver = RemoteWebDriver::create($serverUrl, DesiredCapabilities::chrome()); $this->driver->get('http://app:80'); } catch (\Exception $e) { throw $e; } } } 37 -
#phpcon #track4 When "PHP" というキーワードで検索する /** * @When :keyword
というキーワードで検索する */ public function searchWithKeyword(string $keyword): void { try { $searchInput = $this->driver->findElement(WebDriverBy::name('query')); $searchInput->sendKeys($keyword); $searchInput->submit(); } catch (\Exception $e) { throw $e; } } 38 -
#phpcon #track4 Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること
/** * @Then 学習者が求める情報が表示されること */ public function assertLearnerInformationIsDisplayed(): void { try { // 検索結果エリアが存在することを確認 $searchResultsDiv = $this->driver->findElement(WebDriverBy::className('search-results')); Assert::assertNotNull($searchResultsDiv, '検索結果エリアが表示されていません '); // 結果アイテムが存在することを確認 $resultItems = $this->driver->findElements(WebDriverBy::className('result-item')); Assert::assertGreaterThan(0, count($resultItems), '検索結果が表示されていません '); } catch (\Exception $e) { throw new \Exception('学習者に有用な情報が表示されていません : ' . $e->getMessage()); } } 39 -
#phpcon #track4 要求仕様書 要求仕様書は、システム開発やソフトウェアプロジェクトにお いて、顧客やユーザーのニーズや期待を具体的に文書化 するための重要なドキュメントです。 その目的は、開発会社と発注顧客間での認識合わせを図 り、プロジェクトの進行中に生じうる誤解やミスコミュニケー ションを防ぐ
ことです。 引用元:https://biz.techvan.co.jp/tech-is/blog/infra/001258.html 再 掲 41 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること • 顧客やユーザーのニー ズや期待を具体的に文 書化 • 自然言語で記述し、プ ロジェクトの進行中に 生じうる誤解やミスコ ミュニケーションを防げ そう 42 -
#phpcon #track4 BDD(振る舞い駆動開発)では、 要求仕様を自然言語で記述した テストコード として開発するため、 開発関係者全員がビジネス
要件について議論 することが求められる 再 掲 45 -
#phpcon #track4 PHPで始める振る舞い駆動開発 (Behaviour-Driven Development) PHP Conference Japan 2025
うーたん PHPカンファレンス2025 公式ロゴより 再 掲 -
#phpcon #track4 要求仕様ではなくて、 BDDにおける「振る舞い」とは何なのか? 深掘りする マーティン・ファウラー
(英: Martin Fowler)氏の記事を参考にしました 48 -
#phpcon #track4 マーティン・ファウラー マーティン・ファウラー (英: Martin Fowler、1963年 - )
は、アメリ カ合衆国で活動しているソフトウェア技術者である。 ソフトウェア アーキテクチャについての、いくつかの本の著者、および講演者と して、広く知られている。 とりわけオブジェクト指向分析とオブジェ クト指向設計、統一モデリング言語 (UML) 、アナリシスパターンを はじめとしたソフトウェアパターン、エクストリーム・プログラミング (XP) を含むアジャイルソフトウェア開発方法論の、各分野におい て、活発に活動している。 引用元:https://ja.wikipedia.org/wiki/マーティン・ファウラー 49 -
#phpcon #track4 BDDにおける「振る舞い」とは何なのか? 仕様の記述「 Given-When-Then」 Given-When-Thenという形式はBDD(振る舞い駆動開発) でよく使われますが、この基本的な考え方はテストや「例によ る仕様記述」を書く際によく見られます。Meszarosはこのパ ターンを「4フェーズテスト」として紹介しており、その4つの
フェーズは、Setup(Given)、Exercise(When)、Verify (Then)、Teardownです。Bill Wakeは同様の考え方を Arrange、Act、Assert という形で提唱しました。 参考: Martin Fowler. "GivenWhenThen". Retrieved from https://martinfowler.com/bliki/GivenWhenThen.html 50 -
#phpcon #track4 BDDにおける「振る舞い」とは何なのか? 顧客の期待に応える「ビジネス指向テスト」 ビジネス指向テスト(Business-facing test)とは、顧客、ユーザー、ビジ ネスアナリストなど、開発チーム内の非プログラマーとコミュニケーショ ンを取るための支援として使われるテストのことです。
自動化された場合、システムのコンポーネント構成には触れず、ドメイン (業務)に即した用語でシステムを記述します。ビジネス指向テストは受 け入れ基準として使われることが多く、これらのテストに合格すること は、顧客が求める機能がシステムに備わっていること を示します。 参考: Martin Fowler. "BusinessFacingTest". Retrieved from https://martinfowler.com/bliki/BusinessFacingTest.html 51 -
#phpcon #track4 BDDにおける「振る舞い」とは何なのか? BDDにおける振る舞い = 顧客に提供する価値 BDDにおける「振る舞い」とは、顧客が期待する具体的な価 値を、明確で理解しやすいシナリオ
(Given-When-Then)として定義する。 それをビジネスの観点からテスト(ビジネス指向テスト)するこ とで、システムがその価値を確実に提供していることを保 証する。 これは、技術的な詳細よりも、ビジネス上の要件と顧客の期 待に応えることに重点を置いている。 54 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること 再 掲 58 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する
And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する 61 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する
And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する 技術的詳細の過度な記述 62 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する
And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する 実際のユーザーは 「検索ボックスにPHPと入力して検索ボタンを押 す」 検索時にURLに直接アクセスすることはない 63 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する
And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する 技術的詳細の過度な記述 64 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する
And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する ユーザーは「正常に動作する」ことを期待 65 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する
And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する ユーザーはDOM構造を意識しない 66 -
#phpcon #track4 自然言語のテストコード Feature: ウェブサイトでの情報検索 As a 学習者 I
can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること • As a 学習者 / I can / so that で明確に ビジネス価値を表現 • 技術的詳細(URL、 HTTPステータス、DOM 等)を一切含まない • 実際のユーザーの行動 と期待や提供価値を表 現 68 -
#phpcon #track4 まとめ • テスト駆動開発(TDD) はテストファーストでコードを洗練さ せる開発手法。 • TDDを拡張した、振る舞い駆動開発(BDD) は自然言語で
要求仕様や振る舞いを記述するテスト駆動開発。 • BDDにおける「振る舞い」は顧客に提供する具体的な価 値。 70 -
#phpcon #track4 BDD フレームワークを使うのが BDD ではない。 大切なのは、「振る舞い」を考え、共有し、 テストに落とし込むこと。
72 ご清聴ありがとうございました 🙇