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

PHPUnitで単発/月額決済ありサービスを自動テストしている話

meijin
November 25, 2020

 PHPUnitで単発/月額決済ありサービスを自動テストしている話

meijin

November 25, 2020
Tweet

More Decks by meijin

Other Decks in Technology

Transcript

  1. 自己紹介 - twitter:   @meijin_garden - career: 奈良高専 → LIFULL

    → NoSchool CTO - skill: Laravel/Nuxt.ts/Next.js/Nest.JS/AWS(Fargate)/Firebase 4
  2. 入出力の結合テストだけでも書く - APIを叩く結合テストだけは絶対に書く - 入力 - 決済エンドポイントにトークン等のPOST - 出力 -

    DBへの保存、Pay.jpへの通信、メール等の通知実行 - 単体テストは必要に応じて - 結合テストさえあればリファクタや改修に取り組める 10
  3. Pay.jpラッパーを作ると嬉しいこと 13 - (前提)Pay.jpのAPIは公式SDK経由で実行する - https://github.com/payjp/payjp-php - ラッパーによってSDKへの依存度が下がる - コードから直接Pay.jp

    SDKを実行すると依存度が強くなる - SDKの仕様変更の影響範囲がテストコードも含め増えてしまう - ラッパーへのin/outは内製のValueObjectにする
  4. 所感① - [KEEP]実際の決済処理を実行せずにテストできる - 開発が高速 - Pay.jpのテスト環境を汚さない - リファクタが捗る(リリース後、改修のたびにリファクタをしている) -

    [PROBLEM]Mock化のコードなどが職人芸になりがち - 職人芸をまとめたオリジナルの基底TestCaseクラスを作ったり READMEを書いたりして職人芸の緩和に務める 16
  5. 所感② - [TRY]interfaceにして、app->bind()で差し替える - class PayjpCharge implements ChargeInterface - app->bind(ChargeInterface::class,

    MockChargeInterface::class) - Mockery::mock('alias:(以下略)’)の書き方よりは慣れ親しんでいる &型安全 - 決済以外の処理は基本的にInterfaceに寄せているので合わせていきたい - 必ずErrorをthrowする実装クラスでTransactionのテストもできる 17
  6. Webエンジニア採用中!(副業でお試し勤務OK) - Nuxt.js/Next.js/NestJS/Laravel/AWS(Fargate)/Firebase/Pay.jp - テストコード(PHPUnit/jest)×GitHub Actions×Dockerデプロイ - 現在フルタイム3名(内開発1名...寂しい)、ご家庭・先生方の双方のニーズや課題 をヒアリングしつつ売上を立てていく日々 -

    ベンチャーなのでもちろんSOも検討します オンライン家庭教師という新しい生き方を広めつつ、 既存の学習市場のニーズを満たしていく事業の話を聞きたい方、お声がけください! 27 名人さん | マナリンクCTO https://twitter.com/Meijin_garden