Slide 1

Slide 1 text

データベースを利⽤したテストを 軽〜く実⾏したい時の味⽅ vimeo/php-mysql-engine PHPerKaigi 2021 Hideki Kinjyo GitHub: o0h / Twitter: @o0h_ [ެ։൛]

Slide 2

Slide 2 text

ࣗݾ঺հ • ⾦城秀樹 / きんじょうひでき • GitHub: @o0h / Twitter: @o0h_ • 好きなFWはCakePHP • アイコンは 美味しい鮭親⼦丼の写真です

Slide 3

Slide 3 text

テスト書いてますかー!

Slide 4

Slide 4 text

CI回してますかー!

Slide 5

Slide 5 text

テストは、速いと嬉しいぞ!

Slide 6

Slide 6 text

ͦΜͳ͜ͱ͸஌͍ͬͯΔʂʂʂ

Slide 7

Slide 7 text

我々は、 「楽して」結果を⼿に⼊れたいのだ。

Slide 8

Slide 8 text

本題

Slide 9

Slide 9 text

ある⽇、 いつものようにTwitterを眺めていると 私のタイムラインに⾯⽩げなライブラリが どんぶらこどんぶらこと 流れてきました

Slide 10

Slide 10 text

§1: php-mysql-engineって何ですか?

Slide 11

Slide 11 text

DBを使うテスト何が⾟いっけ?

Slide 12

Slide 12 text

DBΛ࢖͏ςετԿ͕ਏ͍͚ͬʁ Q. ͲΜͳࣄʹ͓ࠔΓͰ͔͢ʁ => A. ४උɾ؅ཧɾ࣌ؒ 1. Ϧιʔε໘ • ʮDBΛཱͯΔʯඞཁ͕͋Δ • ϩʔΧϧ΍CI্ͰͷϝϞϦফඅͱ͔ઃఆͱ͔ԯ߷͔΋ʁ 2. ύϑΥʔϚϯε໘ • DB͸ʮେن໛ͳσʔλΛѻ͏ʯͷʹదͨ͠ςΫϊϩδʔ • ςετ࣌ͷσʔλ͸ɺʮগྔΛʯʮසൟʹʯೖΕସ͑Δͷ͕ओ

Slide 13

Slide 13 text

ςετͱDBͷ޲͖߹͍ํɾر๬ฤ Q. Ͳ͏͠·͠ΐ͏͔ʁ => A. ͍͔ͭ͘Ξϓϩʔν͕͋Δ 1. ͦ΋ͦ΋ʮ୯ମςετͰDBΛ࢖͏ͳʯͱߟ͑Δ • ʮϨϙδτϦύλʔϯΛ༻͍ͯϞοΫ͢ΔʯͳͲ • μϛʔͷ݁ՌΛ༻ҙͯ͠(֎෦ϑΝΠϧԽͯ͠)࢖͏ͱ͔ 2. ΠϯϝϞϦDBΛ࢖͏ • SQLite࢖ͬͨΓ • ʮσʔλ͕গͳ͍ʯͳΒMySQLͷϝϞϦετϨʔδ΋͋Γ·͢͠

Slide 14

Slide 14 text

ςετͱDBͷ޲͖߹͍ํɾࣄ݅ฤ Q. ͡Ό͋ͦΕͰղܾͰ͢Ͷʁ => A. ʮ׬ᘳʯͳΜͯ΋ͷͰ͸ͳ͍ɾɾɾ 1. ͦ΋ͦ΋ʮ୯ମςετͰDBΛ࢖͏ͳʯ • ϓϩμΫτίʔυ͕ʮͦ͏͍͏ઃܭʯʹͳ͍ͬͯΔ͔ʁͱ͍͏໰୊ • ʮϞοΫͩΒ͚ʯΞϯνύλʔϯ 2. ΠϯϝϞϦDBΛ࢖͏ • ରԠ͍ͯ͠Δߏจ΍ػೳ͕ϓϩμΫγϣϯͱมΘ͍͍ͬͯͷʁ • ʮORMͰٵऩͰ͖Δ͔Βʯͱ͍͏൑அ͸ΞϦ͔΋͚ͩͲ • MySQLʹͯ͠΋ɺαʔόʔ(ͳ͍͠ϓϩηε)ͷ༻ҙɾ؅ཧͷඞཁੑ͕ੜ͡Δ

Slide 15

Slide 15 text

⾒ましょう!

Slide 16

Slide 16 text

開発者「どっちも⼤変だねぇ..」 Vimeo「じゃあどっちもやめよう」

Slide 17

Slide 17 text

vimeo/php-mysql-engine • σʔλϕʔε(MySQL)Λ༻͍ͨςετͷ೰Έͷ͓ॿ͚πʔϧ • VimeoࣾͷOSS • ੩తղੳπʔϧͷPsalm΍ ʮIt’s not legacy code — it’s PHPʯͷهࣄͰ͓ೃછΈͰ͢Ͷ • “Ninety-nine percent of our tests use it in place of an actual database”ͱͷ͜ͱ 参考: It’s not legacy code — it’s PHP. Vimeo has been using PHP in production | by Matt Brown | Vimeo Engineering Blog | Medium https://medium.com/vimeo-engineering-blog/its-not-legacy-code-it-s-php-1f0ee0462580

Slide 18

Slide 18 text

php-mysql-engineͷΞϓϩʔν ʮPHP্ͰMySQLΛγϛϡϨʔγϣϯ͢Δʯͱ͍͏ํ޲ੑ • SQLจͷղऍ΋ͯ͠ɺσʔλͷอ࣋΋͢Δ • ͭ·Γʮந৅Խͨ͠ϨϙδτϦAPIʯΛ༻ҙͤͣʹDDL΍DML ΛଧͯΔ 1BSTFS 1SPDFTTPS 2VFSZ 2VFSZ3FTVMU 4DIFNB ˒QIQNZTRMFOHJOFͷओͳొ৔ਓ෺ͨͪ

Slide 19

Slide 19 text

php-mysql-engineͷΞϓϩʔν • PDOޓ׵ͷΠϯλʔϑΣΠεΛఏڙ͢Δ • PHP։ൃऀతʹ͸ʮDB(MySQL)͕࢖͑Δʯͱ͍͏ੈք؍ɾػೳੑ͕ຬ ͨ͞ΕΔ • ͱ͍͏͔୯७ʹ\PDOΛܧঝ͍ͯ͠Δ • (୯ମ)ςετ࣌ʹݶΕ͹ɺ ʮཉ͍͠ͷ͸DBͰ͸ͳͯ͘ɺσʔλͷૢ࡞ͩʯͱ͍͏ׂΓ੾ΓΛײ͡Δ • ڧ྽ͳू߹ԋࢉ΍ɺͦͷͨΊͷ࠷దԽ͕ཉ͍͠Θ͚Ͱ͸ͳ͍

Slide 20

Slide 20 text

使い⽅はいつものPDOと同じ。 同⼀のAPIでインスタンス化して、いつも通りのSQL⽂を渡す事ができる

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

ׂѪʂ

Slide 23

Slide 23 text

§2: 速いの?

Slide 24

Slide 24 text

測ってみよーぜ!

Slide 25

Slide 25 text

࣮ࡍʹଌͬͯΈΔ • cakephp/cakephpͷORMͷςετΛ࢖ͬͯΈ·͢ • ͳΜͰCake͔ʁ => ޷͖͔ͩΒͩͶὑ

Slide 26

Slide 26 text

࣮ࡍʹଌͬͯΈΔ • CakePHPͷςετͷಛ௃ • ࣮DBͱ݁߹ͨ͠୯ମςετͷαϙʔτ • ςετ࣮ߦ1ճʹ෇͖ςʔϒϧͷ࡞੒ɾऴྃ࣌ʹυϩοϓ • FixtureͷinsertɺtruncateΛςετέʔε͝ͱʹ࣮ߦ • => ཁ͢ΔʹʮΊͬͪΌDBʹॻ͖ࠐΈΛ͢Δʯͱ͍͏༷ଶ

Slide 27

Slide 27 text

上: php-mysql-engineを利⽤ 下: 実際のMySQLを利⽤(Docker・別コンテナ)

Slide 28

Slide 28 text

ૣͦ͏ͳؾ͕͢Δ ࠷ऴతʹ4ഒҎ্ͷࠩʹ • php-mysql-engine: 31.5s • MySQL: 2m7s

Slide 29

Slide 29 text

࣮ࡍʹଌͬͯΈΔ: ࣮ߦ಺༰ • Tests: 309, Assertions: 1026, Warnings: 1, Skipped: 15 • 9,632 queries (DML+DDL+DCL) • τϥϯβΫγϣϯ؅ཧ(BEGINͱ͔COMMITͱ͔)ؚΉ • ࣮ߦ؀ڥ: php:8.0-fpm + Xdebug + CakePHP 4.2.4

Slide 30

Slide 30 text

࣮ࡍʹଌͬͯΈΔ: ४උͨ͠΋ͷ • CakePHP༻ͷಠࣗDriverΛ༻ҙ͠ɺςετεΠʔτʹͭͳ ͗͜Έ·ͨ͠ • FixtureΛར༻͍ͯ͠ΔςετΫϥεΛద౰ʹݟસ͍·ͨ͠ • ௨͍ͤͯͳ͍ςετέʔε͸Skip͍ͤͯ͞·͢ • ࣮ߦঢ়ଶʹΑΔࠩ෼Λແͨ͘͢Ί

Slide 31

Slide 31 text

さらに! - One More Thing -

Slide 32

Slide 32 text

「DB」がプロセスごとに存在する =パラレルテストも簡単にできそう!

Slide 33

Slide 33 text

上: paratest(3プロセス)を利⽤ 下: 素のPHPUnitを利⽤

Slide 34

Slide 34 text

ૣͦ͏ͳؾ͕͢Δ ࠷ऴతʹ1.4ഒ΄Ͳͷࠩʹ • paratest: 18s • ௨ৗ: 24s ಉ࣮࣌ߦ਺ͷௐ੔౳Ͱɺ ΋ͬͱྑ͘ͳΓͦ͏

Slide 35

Slide 35 text

§3: 注意点など

Slide 36

Slide 36 text

࢖༻্ͷ஫ҙ • ͋͘·ͰʮMySQLͷ”ϑϦ”Λ͢Δʯ΋ͷ • ߏจͷνΣοΫͳͲɺຊ෺Λ࢖͏҆৺ײʹ͸উͯͳ͍ • શͯͷจ΍ػೳʹରԠ͍ͯ͠ΔΘ͚Ͱ͸ͳ͍ • ྫ͑͹SHOW COLUMN΍֎෦Ωʔ੍໿΋ෆ׬શ • ෳࡶͳΫΤϦʹ͸ରԠ͖͠Εͳ͍ • αϒΫΤϦ΍UNIONͳͲʹ׬ᘳΛٻΊͳ͍ʂ

Slide 37

Slide 37 text

࢖༻্ͷ஫ҙ • ιϦϡʔγϣϯͷ๊͑ΔϦεΫΛ͔ͬ͠Γཧղ͠ɺ རӹͱͷόϥϯεͱͷ൑அྗΛલఏͱͯ͠ར༻͢Δ΂͖ • ςετͷ໨తͱΧόʔൣғΛཧղ͢Δඞཁ͕͋Δ • ʮ͜ͷߏจ͕࢖͑ͳ͍ͷ͔ʁʯͱࢥͬͨΒ ੵۃతʹPRΛ౤͍͛ͯ͘ʂʂͱ͍͏࢟੎͕͔ܽͤͳͦ͞͏

Slide 38

Slide 38 text

·ͱΊ • vimeo/php-mysql-engine͸ɺ ࣮༻Λߟ͑Δͱ·ͩυΩυΩ͢Δײ͔͡΋͠Εͳ͍ • ͏·͘࢖͍͜ͳͤ͹ศརͦ͏ • ͦΕҎ্ʹ”ͳΜ͔໘നͦ͏ͳιϑτ΢ΣΞͩͳ”ͱ͍͏ τΩϝΩΛײͨ͡ͷͰɺൃද͠·ͨ͠ɾɾɾʂ • օ͞Μ΋͓खݩͷORMͱͭͳ͍Ͱ༡ΜͰΈ͍ͯͩ͘͞ʂ

Slide 39

Slide 39 text

Appendix • ϐΫγϒඦՊࣄయͷςετʹphp-mysql-engineΛಋೖ͠·ͨ͠ - pixiv inside https://inside.pixiv.blog/2021/02/18/123000 • vimeo/php-mysql-engine: A MySQL engine written in pure PHP https://github.com/vimeo/php-mysql-engine • The great pretender: faster application tests with MySQL simulation | by Matt Brown | Vimeo Engineering Blog | Feb, 2021 | Medium https://medium.com/vimeo-engineering-blog/the-great-pretender-faster- application-tests-with-mysql-simulation-26250f13d251

Slide 40

Slide 40 text

ご清聴 ありがとうございました🎉