Slide 1

Slide 1 text

#phpcon #track4
 PHPで始める振る舞い駆動開発 
 (Behaviour-Driven Development)
 PHP Conference Japan 2025
 うーたん
 PHPカンファレンス2025 公式ロゴより


Slide 2

Slide 2 text

#phpcon #track4
 自己紹介
 2


Slide 3

Slide 3 text

#phpcon #track4
 自己紹介
 ● うーたん
 ○ 𝕏:@uutan1108
 ● 株式会社ゆめみ
 ○ サーバーサイドエンジニア
 ○ 技術広報
 イベント開催するので 
 来てください!! 
 3


Slide 4

Slide 4 text

#phpcon #track4
 第一章
 
 振る舞い駆動開発って何? 
 4


Slide 5

Slide 5 text

#phpcon #track4
 テストを書いていますか? 
 5


Slide 6

Slide 6 text

#phpcon #track4
 テストを書くメリット 
 ● 早い段階で不具合を検知できる
 ● 要件/仕様を理解しやすくなる
 ● 開発者の負担を軽減できる
 6


Slide 7

Slide 7 text

#phpcon #track4
 テスト駆動開発 とは
 7


Slide 8

Slide 8 text

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


Slide 9

Slide 9 text

#phpcon #track4
 TDDのサイクル 
 ● 最初にテストを書き
 ● そのテストが動作する必要最低限な実装をとりあえず行 なった後
 ● コードを洗練させる
 という短い工程を繰り返す
 画像引用元:https://service.shiftinc.jp/column/4654/
 9


Slide 10

Slide 10 text

#phpcon #track4
 振る舞い駆動開発 (ビヘイビア駆動開発 )とは
 10


Slide 11

Slide 11 text

#phpcon #track4
 ビヘイビア駆動開発 
 (英: behaviour-driven development;BDD)
 テスト駆動開発で記述されるテストケースは、作成したプログ ラムの動作が正しいかどうかを検証するために行う「テスト」 である。テストであるという点は同一であるが、加えて、これ から作成しようとするプログラムに期待される 「振る舞い」 や「制約条件」 、つまり「要求仕様」 に近い形で、 自然言語 を併記しながらテストコードを記述する。 
 引用元:https://ja.wikipedia.org/wiki/テスト駆動開発
 11


Slide 12

Slide 12 text

#phpcon #track4
 要求仕様とは 
 12


Slide 13

Slide 13 text

#phpcon #track4
 要求仕様書 
 要求仕様書は、システム開発やソフトウェアプロジェクトにお いて、顧客やユーザーのニーズや期待を具体的に文書化 するための重要なドキュメントです。
 その目的は、開発会社と発注顧客間での認識合わせを図 り、プロジェクトの進行中に生じうる誤解やミスコミュニケー ションを防ぐ ことです。
 引用元:https://biz.techvan.co.jp/tech-is/blog/infra/001258.html
 13


Slide 14

Slide 14 text

#phpcon #track4
 プロジェクトには多くの人が関わる 
 14


Slide 15

Slide 15 text

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


Slide 16

Slide 16 text

#phpcon #track4
 つまり
 16


Slide 17

Slide 17 text

#phpcon #track4
 BDD(振る舞い駆動開発)では、 
 要求仕様を自然言語で記述した テストコード 
 を書いて開発するため、 開発関係者全員がビジネス 
 要件について議論 することが求められる 
 17


Slide 18

Slide 18 text

#phpcon #track4
 第二章
 
 自然言語で要求仕様を意識してテストを書く 
 18


Slide 19

Slide 19 text

#phpcon #track4
 書いてみる 
 
 コードはGitHubにあります。 
 https://github.com/OHMORIYUSUKE/php-bdd-sample
 
 19


Slide 20

Slide 20 text

#phpcon #track4
 テストするアプリケーション 
 20


Slide 21

Slide 21 text

#phpcon #track4
 テストするアプリケーション 
 ● プログラミング言語名を入力
 ● 該当のプログラミング言語の情報が表示される
 ● ない場合はメッセージが表示される
 21


Slide 22

Slide 22 text

#phpcon #track4
 テストで使うライブラリなど 
 22


Slide 23

Slide 23 text

#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


Slide 24

Slide 24 text

#phpcon #track4
 流れ
 Behat
 PHP
 Selenium WebDriver
 振る舞いを
 記述
 24


Slide 25

Slide 25 text

#phpcon #track4
 流れ
 Behat
 PHP
 Selenium WebDriver
 要求仕様の
 テストを実装
 25


Slide 26

Slide 26 text

#phpcon #track4
 流れ
 Behat
 PHP
 Selenium WebDriver
 ユーザーの
 操作
 26


Slide 27

Slide 27 text

#phpcon #track4
 Behatを用いて自然言語でテストコードを書く 
 27


Slide 28

Slide 28 text

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


Slide 29

Slide 29 text

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


Slide 30

Slide 30 text

#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


Slide 31

Slide 31 text

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


Slide 32

Slide 32 text

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


Slide 33

Slide 33 text

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


Slide 34

Slide 34 text

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


Slide 35

Slide 35 text

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


Slide 36

Slide 36 text

#phpcon #track4
 PHPで対応するテストコードを書く 
 
 コードは一部省略しています 
 36


Slide 37

Slide 37 text

#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


Slide 38

Slide 38 text

#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


Slide 39

Slide 39 text

#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


Slide 40

Slide 40 text

#phpcon #track4
 自然言語で PHP と Selenium を用いて
 要求仕様を意識したテストを書けた! 
 40


Slide 41

Slide 41 text

#phpcon #track4
 要求仕様書 
 要求仕様書は、システム開発やソフトウェアプロジェクトにお いて、顧客やユーザーのニーズや期待を具体的に文書化 するための重要なドキュメントです。
 その目的は、開発会社と発注顧客間での認識合わせを図 り、プロジェクトの進行中に生じうる誤解やミスコミュニケー ションを防ぐ ことです。
 引用元:https://biz.techvan.co.jp/tech-is/blog/infra/001258.html
 再 掲
 41


Slide 42

Slide 42 text

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


Slide 43

Slide 43 text

#phpcon #track4
 PHP の話は終わり 
 43


Slide 44

Slide 44 text

#phpcon #track4
 第三章
 
 BDDの「振る舞い」とは何か? 
 44


Slide 45

Slide 45 text

#phpcon #track4
 BDD(振る舞い駆動開発)では、 
 要求仕様を自然言語で記述した テストコード 
 として開発するため、 開発関係者全員がビジネス 
 要件について議論 することが求められる 
 再 掲
 45


Slide 46

Slide 46 text

#phpcon #track4
 BDDにおける「振る舞い」は要求仕様のこと? 
 46


Slide 47

Slide 47 text

#phpcon #track4
 PHPで始める振る舞い駆動開発 
 (Behaviour-Driven Development)
 PHP Conference Japan 2025
 うーたん
 PHPカンファレンス2025 公式ロゴより
 再 掲


Slide 48

Slide 48 text

#phpcon #track4
 要求仕様ではなくて、 
 BDDにおける「振る舞い」とは何なのか? 
 深掘りする 
 
 マーティン・ファウラー (英: Martin Fowler)氏の記事を参考にしました 
 48


Slide 49

Slide 49 text

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


Slide 50

Slide 50 text

#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


Slide 51

Slide 51 text

#phpcon #track4
 BDDにおける「振る舞い」とは何なのか? 
 顧客の期待に応える「ビジネス指向テスト」 
 ビジネス指向テスト(Business-facing test)とは、顧客、ユーザー、ビジ ネスアナリストなど、開発チーム内の非プログラマーとコミュニケーショ ンを取るための支援として使われるテストのことです。
 自動化された場合、システムのコンポーネント構成には触れず、ドメイン (業務)に即した用語でシステムを記述します。ビジネス指向テストは受 け入れ基準として使われることが多く、これらのテストに合格すること は、顧客が求める機能がシステムに備わっていること を示します。
 参考: Martin Fowler. "BusinessFacingTest". Retrieved from https://martinfowler.com/bliki/BusinessFacingTest.html
 51


Slide 52

Slide 52 text

#phpcon #track4
 BDDにおける振る舞い = 顧客に提供する価値 
 52


Slide 53

Slide 53 text

#phpcon #track4
 BDDにおける振る舞い = 顧客に提供する価値 
 私はこう解釈した
 53


Slide 54

Slide 54 text

#phpcon #track4
 BDDにおける「振る舞い」とは何なのか? 
 BDDにおける振る舞い = 顧客に提供する価値 
 BDDにおける「振る舞い」とは、顧客が期待する具体的な価 値を、明確で理解しやすいシナリオ
 (Given-When-Then)として定義する。
 それをビジネスの観点からテスト(ビジネス指向テスト)するこ とで、システムがその価値を確実に提供していることを保 証する。
 
 これは、技術的な詳細よりも、ビジネス上の要件と顧客の期 待に応えることに重点を置いている。
 54


Slide 55

Slide 55 text

#phpcon #track4
 これを踏まえて、 
 「振る舞い」とは何かを意識しないとどうなる? 
 55


Slide 56

Slide 56 text

#phpcon #track4
 テストするアプリケーション 
 ● プログラミング言語名を入力
 ● 該当のプログラミング言語の情報が表示される
 ● ない場合はメッセージが表示される
 再 掲
 56


Slide 57

Slide 57 text

#phpcon #track4
 振る舞いを意識した例 
 57


Slide 58

Slide 58 text

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


Slide 59

Slide 59 text

#phpcon #track4
 いい感じな気がする 
 59


Slide 60

Slide 60 text

#phpcon #track4
 振る舞いを意識していない例 
 60


Slide 61

Slide 61 text

#phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する 61


Slide 62

Slide 62 text

#phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する 技術的詳細の過度な記述 
 62


Slide 63

Slide 63 text

#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


Slide 64

Slide 64 text

#phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する 技術的詳細の過度な記述 
 64


Slide 65

Slide 65 text

#phpcon #track4
 自然言語のテストコード 
 Feature: ウェブサイトでの情報検索 Scenario: 興味のある技術について検索する Given データベースに接続する And SQLクエリを準備する When localhost:8080/search?q=PHPにアクセスする And search.phpが実行される Then HTTPステータス200が返る And DOM要素".results"が1個存在する ユーザーは「正常に動作する」ことを期待 
 65


Slide 66

Slide 66 text

#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


Slide 67

Slide 67 text

#phpcon #track4
 振る舞いを意識した例 
 67


Slide 68

Slide 68 text

#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


Slide 69

Slide 69 text

#phpcon #track4
 まとめ
 69


Slide 70

Slide 70 text

#phpcon #track4
 まとめ
 ● テスト駆動開発(TDD) はテストファーストでコードを洗練さ せる開発手法。
 ● TDDを拡張した、振る舞い駆動開発(BDD) は自然言語で 要求仕様や振る舞いを記述するテスト駆動開発。
 ● BDDにおける「振る舞い」は顧客に提供する具体的な価 値。
 70


Slide 71

Slide 71 text

#phpcon #track4
 BDD フレームワークを使うのが BDD ではない。 
 大切なのは、「振る舞い」を考え、共有し、 
 テストに落とし込むこと。 
 71


Slide 72

Slide 72 text

#phpcon #track4
 BDD フレームワークを使うのが BDD ではない。 
 大切なのは、「振る舞い」を考え、共有し、 
 テストに落とし込むこと。 
 72
 ご清聴ありがとうございました 🙇