Save 37% off PRO during our Black Friday Sale! »

データベースを利用したテストを軽〜く実行したい時の味方: vimeo/php-mysql-engine / phperkaigi2021-lightning-talk

データベースを利用したテストを軽〜く実行したい時の味方: vimeo/php-mysql-engine / phperkaigi2021-lightning-talk

PHPerKaigi2021でのLTの資料です。
https://fortee.jp/phperkaigi-2021/proposal/e1e0ebd8-d60c-42ed-b6e6-9a7602258d42

★デモ動画
vimeo/php-mysql-engine を使ってテスト叩く様子 #phperkaigi - YouTube https://www.youtube.com/watch?v=PFNpLbBprb4

C90bac78c0fb61105cfd8239767f903d?s=128

hideki kinjyo
PRO

March 28, 2021
Tweet

Transcript

  1. データベースを利⽤したテストを 軽〜く実⾏したい時の味⽅ vimeo/php-mysql-engine PHPerKaigi 2021 Hideki Kinjyo GitHub: o0h /

    Twitter: @o0h_ [ެ։൛]
  2. ࣗݾ঺հ • ⾦城秀樹 / きんじょうひでき • GitHub: @o0h / Twitter:

    @o0h_ • 好きなFWはCakePHP • アイコンは 美味しい鮭親⼦丼の写真です
  3. テスト書いてますかー!

  4. CI回してますかー!

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

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

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

  8. 本題

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

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

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

  12. DBΛ࢖͏ςετԿ͕ਏ͍͚ͬʁ Q. ͲΜͳࣄʹ͓ࠔΓͰ͔͢ʁ => A. ४උɾ؅ཧɾ࣌ؒ 1. Ϧιʔε໘ • ʮDBΛཱͯΔʯඞཁ͕͋Δ

    • ϩʔΧϧ΍CI্ͰͷϝϞϦফඅͱ͔ઃఆͱ͔ԯ߷͔΋ʁ 2. ύϑΥʔϚϯε໘ • DB͸ʮେن໛ͳσʔλΛѻ͏ʯͷʹదͨ͠ςΫϊϩδʔ • ςετ࣌ͷσʔλ͸ɺʮগྔΛʯʮසൟʹʯೖΕସ͑Δͷ͕ओ
  13. ςετͱDBͷ޲͖߹͍ํɾر๬ฤ Q. Ͳ͏͠·͠ΐ͏͔ʁ => A. ͍͔ͭ͘Ξϓϩʔν͕͋Δ 1. ͦ΋ͦ΋ʮ୯ମςετͰDBΛ࢖͏ͳʯͱߟ͑Δ • ʮϨϙδτϦύλʔϯΛ༻͍ͯϞοΫ͢ΔʯͳͲ

    • μϛʔͷ݁ՌΛ༻ҙͯ͠(֎෦ϑΝΠϧԽͯ͠)࢖͏ͱ͔ 2. ΠϯϝϞϦDBΛ࢖͏ • SQLite࢖ͬͨΓ • ʮσʔλ͕গͳ͍ʯͳΒMySQLͷϝϞϦετϨʔδ΋͋Γ·͢͠
  14. ςετͱDBͷ޲͖߹͍ํɾࣄ݅ฤ Q. ͡Ό͋ͦΕͰղܾͰ͢Ͷʁ => A. ʮ׬ᘳʯͳΜͯ΋ͷͰ͸ͳ͍ɾɾɾ 1. ͦ΋ͦ΋ʮ୯ମςετͰDBΛ࢖͏ͳʯ • ϓϩμΫτίʔυ͕ʮͦ͏͍͏ઃܭʯʹͳ͍ͬͯΔ͔ʁͱ͍͏໰୊

    • ʮϞοΫͩΒ͚ʯΞϯνύλʔϯ 2. ΠϯϝϞϦDBΛ࢖͏ • ରԠ͍ͯ͠Δߏจ΍ػೳ͕ϓϩμΫγϣϯͱมΘ͍͍ͬͯͷʁ • ʮORMͰٵऩͰ͖Δ͔Βʯͱ͍͏൑அ͸ΞϦ͔΋͚ͩͲ • MySQLʹͯ͠΋ɺαʔόʔ(ͳ͍͠ϓϩηε)ͷ༻ҙɾ؅ཧͷඞཁੑ͕ੜ͡Δ
  15. ⾒ましょう!

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

  17. 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
  18. php-mysql-engineͷΞϓϩʔν ʮPHP্ͰMySQLΛγϛϡϨʔγϣϯ͢Δʯͱ͍͏ํ޲ੑ • SQLจͷղऍ΋ͯ͠ɺσʔλͷอ࣋΋͢Δ • ͭ·Γʮந৅Խͨ͠ϨϙδτϦAPIʯΛ༻ҙͤͣʹDDL΍DML ΛଧͯΔ 1BSTFS 1SPDFTTPS 2VFSZ

    2VFSZ3FTVMU 4DIFNB ˒QIQNZTRMFOHJOFͷओͳొ৔ਓ෺ͨͪ
  19. php-mysql-engineͷΞϓϩʔν • PDOޓ׵ͷΠϯλʔϑΣΠεΛఏڙ͢Δ • PHP։ൃऀతʹ͸ʮDB(MySQL)͕࢖͑Δʯͱ͍͏ੈք؍ɾػೳੑ͕ຬ ͨ͞ΕΔ • ͱ͍͏͔୯७ʹ\PDOΛܧঝ͍ͯ͠Δ • (୯ମ)ςετ࣌ʹݶΕ͹ɺ

    ʮཉ͍͠ͷ͸DBͰ͸ͳͯ͘ɺσʔλͷૢ࡞ͩʯͱ͍͏ׂΓ੾ΓΛײ͡Δ • ڧ྽ͳू߹ԋࢉ΍ɺͦͷͨΊͷ࠷దԽ͕ཉ͍͠Θ͚Ͱ͸ͳ͍
  20. 使い⽅はいつものPDOと同じ。 同⼀のAPIでインスタンス化して、いつも通りのSQL⽂を渡す事ができる

  21. None
  22. ׂѪʂ

  23. §2: 速いの?

  24. 測ってみよーぜ!

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

  26. ࣮ࡍʹଌͬͯΈΔ • CakePHPͷςετͷಛ௃ • ࣮DBͱ݁߹ͨ͠୯ମςετͷαϙʔτ • ςετ࣮ߦ1ճʹ෇͖ςʔϒϧͷ࡞੒ɾऴྃ࣌ʹυϩοϓ • FixtureͷinsertɺtruncateΛςετέʔε͝ͱʹ࣮ߦ •

    => ཁ͢ΔʹʮΊͬͪΌDBʹॻ͖ࠐΈΛ͢Δʯͱ͍͏༷ଶ
  27. 上: php-mysql-engineを利⽤ 下: 実際のMySQLを利⽤(Docker・別コンテナ)

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

  29. ࣮ࡍʹଌͬͯΈΔ: ࣮ߦ಺༰ • 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
  30. ࣮ࡍʹଌͬͯΈΔ: ४උͨ͠΋ͷ • CakePHP༻ͷಠࣗDriverΛ༻ҙ͠ɺςετεΠʔτʹͭͳ ͗͜Έ·ͨ͠ • FixtureΛར༻͍ͯ͠ΔςετΫϥεΛద౰ʹݟસ͍·ͨ͠ • ௨͍ͤͯͳ͍ςετέʔε͸Skip͍ͤͯ͞·͢ •

    ࣮ߦঢ়ଶʹΑΔࠩ෼Λແͨ͘͢Ί
  31. さらに! - One More Thing -

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

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

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

  35. §3: 注意点など

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

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

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

    օ͞Μ΋͓खݩͷORMͱͭͳ͍Ͱ༡ΜͰΈ͍ͯͩ͘͞ʂ
  39. 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
  40. ご清聴 ありがとうございました🎉