Slide 1

Slide 1 text

GitHub Flowでの高速なデリバ リーをささえるテスト基盤について

Slide 2

Slide 2 text

自己紹介 金 祺庸 ▪ 2022年2月 BuysellTechnologies入社 ▫ BE エンジニア ■ Go歴 2 ~ 3年 ▫ BST.go (社内go community)の立ち上げ・運 営 ▪ 趣味 ▫ 読書 ▫ ジム ▫ 冷水シャワー

Slide 3

Slide 3 text

Agenda ▪ 開発環境・手法の紹介 ▫ テスト基盤にこだわる理由 ▪ テストへのこだわり ▫ テストケース毎にDBをRollback ▫ 宣言的なFixture ▫ E2Eテスト

Slide 4

Slide 4 text

1 開発環境・手法の紹介

Slide 5

Slide 5 text

開発環境 ▪ Microservices

Slide 6

Slide 6 text

開発環境 ▪ Microservices この辺り開発 しています

Slide 7

Slide 7 text

開発環境 ▪ BEの構成 ▫ Hasura + Go API Server(Sidecar) ■ 主にGraphQLで通信 ■ MSが提唱するSidecar Pattern ■ Hasura(Primary Application) ● DBのschemaからGraphQL APIを自動生成してくれる ● 認可制御・基本的なCRUD操作が可能 ■ Go API Server(Sidecar) ● Hasura APIでは対応しきれない副作用的な処理を実行する ● 他Serviceとの通信部分 ● メインは99designs/gqlgen ○ RESTも使う(Pub/Sub) ● 複雑なLogicが集中しやすい

Slide 8

Slide 8 text

開発環境 ▪ ブランチ戦略 ▫ Github Flow ■ 運用するbranchはmainブランチとfeatureブランチのみ ● mainブランチへのPRがmergeされると即Production環境へDeploy ▫ Feature Flag ■ コードを書き換えずフラグを使って機能の有効/無効を切り替える ● Deploy後、Feature Flagを切り替えることで機能がReleaseされる ■ ブランチの状態をRelease作業を切り離せる

Slide 9

Slide 9 text

Testを書きたい

Slide 10

Slide 10 text

2 テストへのこだわり

Slide 11

Slide 11 text

テストケース毎にDBをRollback ▪ DBはmockしない ▪ DATA-DOG/go-txdbを活用 ▫ テストケース毎に Transactionをはる ▫ CloseするだけでRollback が可能

Slide 12

Slide 12 text

テストケース毎にDBをRollback ▪ DBはmockしない ▪ DATA-DOG/go-txdbを活用 ▫ テストケース毎に Transactionをはる ▫ CloseするだけでRollback が可能 宣言したdriverを 使うことで transactionがは れる

Slide 13

Slide 13 text

宣言的なFixture ▪ kyong0612/polluterを使用 ▫ Mysql,PostgreSQL,Redisに対応 ▫ yaml形式でFixtureを用意できる ■ 再利用性が高い ■ パターンを用意することで面 倒なFixtureの挿入作業を簡 略化できる

Slide 14

Slide 14 text

宣言的なFixture ▪ kyong0612/polluterを使用 ▫ Mysql,PostgreSQL,Redisに対応 ▫ yaml形式でFixtureを用意できる ■ 再利用性が高い ■ パターンを用意することで面 倒なFixtureの挿入作業を簡 略化できる Fixtureを適用

Slide 15

Slide 15 text

E2Eテスト ▪ ClientからのRequestを再現できるE2E の機構を用意 ▫ 99design/gqlgenのclinet pkgを活用 ▫ http.Handlerを引数にE2E Serverを立てる

Slide 16

Slide 16 text

E2Eテスト ▪ ClientからのRequestを再現できるE2E の機構を用意 ▫ 99design/gqlgenのclinet pkgを活用 ▫ http.Handlerを引数にE2E Serverを立てる Clientを生成

Slide 17

Slide 17 text

E2Eテスト ▪ ClientからのRequestを再現できるE2E の機構を用意 ▫ 99design/gqlgenのclinet pkgを活用 ▫ http.Handlerを引数にE2E Serverを立てる Requestを実行

Slide 18

Slide 18 text

他にも 18 ▪ stretchr/testify ▫ Test関係のutilsを提供 ▫ Testing pkgの学習コスト軽減 ▪ gostaticanalysis/skeleton + gqlgo/gqlanalysisでの自作linter ▫ graphQL schemaに対して独自の静的解析を実行 攻めのための守りを改善しています