Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPで始める振る舞い駆動開発(Behaviour-Driven Development)

PHPで始める振る舞い駆動開発(Behaviour-Driven Development)

PHPで始める振る舞い駆動開発(Behaviour-Driven Development) - PHP Conference Japan 2025
https://fortee.jp/phpcon-2025/proposal/15d8064d-4085-4cf9-ab44-6972f693577b

Avatar for uutan1108

uutan1108

June 27, 2025
Tweet

More Decks by uutan1108

Other Decks in Programming

Transcript

  1. #phpcon #track4
 自己紹介
 • うーたん
 ◦ 𝕏:@uutan1108
 • 株式会社ゆめみ
 ◦

    サーバーサイドエンジニア
 ◦ 技術広報
 イベント開催するので 
 来てください!! 
 3

  2. #phpcon #track4
 テスト駆動開発 (TDD)
 テスト駆動開発 (てすとくどうかいはつ、英: test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能

    について、最初にテストを書き(これをテストファーストと言う)、そのテス トが動作する必要最低限な実装をとりあえず行なった後、コードを洗練 させる、という短い工程を繰り返すスタイルである。
 多くのアジャイルソフトウェア開発手法、例えばエクストリーム・プログラ ミングにおいて強く推奨されている。近年はビヘイビア駆動開発 へと発 展を遂げている。
 引用元:https://ja.wikipedia.org/wiki/テスト駆動開発
 8

  3. #phpcon #track4
 TDDのサイクル 
 • 最初にテストを書き
 • そのテストが動作する必要最低限な実装をとりあえず行 なった後
 •

    コードを洗練させる
 という短い工程を繰り返す
 画像引用元:https://service.shiftinc.jp/column/4654/
 9

  4. #phpcon #track4
 ビヘイビア駆動開発 
 (英: behaviour-driven development;BDD)
 テスト駆動開発で記述されるテストケースは、作成したプログ ラムの動作が正しいかどうかを検証するために行う「テスト」 である。テストであるという点は同一であるが、加えて、これ

    から作成しようとするプログラムに期待される 「振る舞い」 や「制約条件」 、つまり「要求仕様」 に近い形で、 自然言語 を併記しながらテストコードを記述する。 
 引用元:https://ja.wikipedia.org/wiki/テスト駆動開発
 11

  5. #phpcon #track4
 • 発注顧客 / ビジネスオーナー
 • プロダクトオーナー / ビジネスアナリスト


    • 開発者 / プログラマー
 • テスター / QAエンジニア
 • スクラムマスター / プロジェクトマネージャー
 • など...
 プロジェクトの進行中に生じうる誤解や 
 ミスコミュニケーションを防ぐ必要がある 
 プロジェクトには多くの人が関わる 
 15

  6. #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

  7. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 As a 学習者 I

    can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること 28

  8. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 As a 学習者 I

    can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること Feature(機能):テストする機能全体を定義 
 29

  9. #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

  10. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 As a 学習者 I

    can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること Scenario(シナリオ):具体的なテストケースを定義 
 31

  11. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 As a 学習者 I

    can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること Given (前提条件):操作を実行する前の状態 
 32

  12. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 As a 学習者 I

    can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること When(実行アクション):テスト対象となる具体的なアクショ ン
 33

  13. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 As a 学習者 I

    can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること Then(期待結果):期待される結果を検証 
 34

  14. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 As a 学習者 I

    can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること And(追加条件):複数の条件や検証を並列で記述する 際に使用
 35

  15. #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

  16. #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

  17. #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

  18. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 As a 学習者 I

    can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること • 顧客やユーザーのニー ズや期待を具体的に文 書化
 • 自然言語で記述し、プ ロジェクトの進行中に 生じうる誤解やミスコ ミュニケーションを防げ そう
 42

  19. #phpcon #track4
 マーティン・ファウラー 
 マーティン・ファウラー (英: Martin Fowler、1963年 - )

    は、アメリ カ合衆国で活動しているソフトウェア技術者である。 ソフトウェア アーキテクチャについての、いくつかの本の著者、および講演者と して、広く知られている。 とりわけオブジェクト指向分析とオブジェ クト指向設計、統一モデリング言語 (UML) 、アナリシスパターンを はじめとしたソフトウェアパターン、エクストリーム・プログラミング (XP) を含むアジャイルソフトウェア開発方法論の、各分野におい て、活発に活動している。
 引用元:https://ja.wikipedia.org/wiki/マーティン・ファウラー
 49

  20. #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

  21. #phpcon #track4
 BDDにおける「振る舞い」とは何なのか? 
 顧客の期待に応える「ビジネス指向テスト」 
 ビジネス指向テスト(Business-facing test)とは、顧客、ユーザー、ビジ ネスアナリストなど、開発チーム内の非プログラマーとコミュニケーショ ンを取るための支援として使われるテストのことです。


    自動化された場合、システムのコンポーネント構成には触れず、ドメイン (業務)に即した用語でシステムを記述します。ビジネス指向テストは受 け入れ基準として使われることが多く、これらのテストに合格すること は、顧客が求める機能がシステムに備わっていること を示します。
 参考: Martin Fowler. "BusinessFacingTest". Retrieved from https://martinfowler.com/bliki/BusinessFacingTest.html
 51

  22. #phpcon #track4
 BDDにおける「振る舞い」とは何なのか? 
 BDDにおける振る舞い = 顧客に提供する価値 
 BDDにおける「振る舞い」とは、顧客が期待する具体的な価 値を、明確で理解しやすいシナリオ


    (Given-When-Then)として定義する。
 それをビジネスの観点からテスト(ビジネス指向テスト)するこ とで、システムがその価値を確実に提供していることを保 証する。
 
 これは、技術的な詳細よりも、ビジネス上の要件と顧客の期 待に応えることに重点を置いている。
 54

  23. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 As a 学習者 I

    can ウェブサイトでキーワード検索を実行する so that 必要な技術情報を素早く見つけて学習効率を向上させる Scenario: 興味のある技術について検索する Given ウェブサイトのトップページを開く When "PHP" というキーワードで検索する Then 検索結果に "PHP" が含まれていること And 学習者が求める情報が表示されること 再 掲
 58

  24. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する

    And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する 61

  25. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する

    And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する 技術的詳細の過度な記述 
 62

  26. #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

  27. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する

    And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する 技術的詳細の過度な記述 
 64

  28. #phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する

    And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する ユーザーは「正常に動作する」ことを期待 
 65

  29. #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

  30. #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

  31. #phpcon #track4
 まとめ
 • テスト駆動開発(TDD) はテストファーストでコードを洗練さ せる開発手法。
 • TDDを拡張した、振る舞い駆動開発(BDD) は自然言語で

    要求仕様や振る舞いを記述するテスト駆動開発。
 • BDDにおける「振る舞い」は顧客に提供する具体的な価 値。
 70