RDBを使う単体テストの前に 用意しておきたい環境を考え てみたの
by
bun
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
RDBを使う単体テストの前に 用意しておきたい環境を考え てみたの やめて!私のために争わないで!?
Slide 2
Slide 2 text
みなさん、自動テストしてますか? (ご挨拶
Slide 3
Slide 3 text
自己紹介 > クラスメソッド株式会社 開発3年、クラウドエンジニア2年 先日JSTQB FL合格しました > 経歴 ダイの大冒険 > 好きなもの モダンアプリケーションコンサルティング部 >名前 bun913(今泉大樹)
Slide 4
Slide 4 text
私の立場と話すこと > 領域 アジャイル開発を想定しています > 開発手法 > テストレベル Webアプリケーションが主領域(AWS、バックエンド開発、ちょっとフロントエンド) >立場 開発に近い立場として、テストやQAについて真剣に考えています 単体・(コンポーネントレベル)統合テスト
Slide 5
Slide 5 text
最近 JSTQB テストマネージャ 試験の学習をしています
Slide 6
Slide 6 text
テスト計画 テストのプロセス テスト分析 テスト設計 テスト実装 テスト実行 終了に向けて ※「終了基準の評価とレポート」などがJSTQB テストマネージャのシラバスに記載されています https://jstqb.jp/dl/JSTQB-Syllabus.Advanced_TM_Version2012.J03.pdf
Slide 7
Slide 7 text
テスト環境づくりもマネージャの仕事 > テスト実装には、テストチームがテスト実行を 開始する準備が整っていることの最終チェックも 含む。このチェックには、必要なテスト環境、テ ストデータ、テストコードが整っていることの確 認(省略)およびすべてのテストケースを記述 し、レビューし、実行の準備が整っていることの 確認を含む。 ※シラバスp13より(前ページと同じ出典のためリンクは省略)
Slide 8
Slide 8 text
アジャイルの場合、開発者が単体・統合 テストを実装・実行することが多い
Slide 9
Slide 9 text
1人の開発者目線で RDBを使う環境におけるテスト環境 について語ります
Slide 10
Slide 10 text
3つの競合を回避できる環境づくり サブタイトルの「争わないで」を回収しています
Slide 11
Slide 11 text
1. 他の開発者との競合
Slide 12
Slide 12 text
開発用のDBくんだよ 仲良くしてあげてね まれにある状況 偉い人 共用DB
Slide 13
Slide 13 text
こういう状態 共用DB 変更 変更 変更
Slide 14
Slide 14 text
こうなる あいつのテーブル変更の せいでテスト通らない あいつがテーブルに変な データ入れた!
Slide 15
Slide 15 text
つまりこう やめて私のために争わな いで! 共用DB
Slide 16
Slide 16 text
コンテナ仮想技術がおすすめ DockerやPodmanなど、コンテナ用のツー ル・サービスを利用しましょう MySQL・PostgreSQLなどのDBMSを少ないオ ーバーヘッドで起動できます 個々の開発者がどんどん壊せる環境を用意し ましょう。セットアップも簡単!
Slide 17
Slide 17 text
2. 他のテストケースとの競合
Slide 18
Slide 18 text
DBを個別に用意するだけでは (個人的に)ちょっと足りない
Slide 19
Slide 19 text
テストケースを記載中(単体テストの自動化) (前処理)テストユーザー作成(user1) テストユーザーログイン成功 テストユーザーログアウト成功 開発者A
Slide 20
Slide 20 text
こんなこともあるでしょう 開発者Aの作ったレコードと ユニーク制約で競合する 適当にuser2とかするか 開発者Aの作ったレコードと ユニーク制約で競合する 適当にuser2とかするか 開発者B 開発者C
Slide 21
Slide 21 text
テストケースのソースコードは当然共有 他のテストケースや順番を考えたくない →テストケース間で隔離された環境が欲しい
Slide 22
Slide 22 text
やめて!わたしのために(略) つまりこう
Slide 23
Slide 23 text
各テストケースの後処理でデータ消せば いいだけじゃないの?
Slide 24
Slide 24 text
こんなこと考えられませんか? テストツールがテストケースを並行実行でき るなら? 後処理前に他のテストケースが実行される どこかで途中でテストが終了したら? 後処理しないテストデータが残る (リセットしないと)次のテスト実行が失 敗する
Slide 25
Slide 25 text
トランザクショナルな仕組みを活用したい DBMSのトランザクション機能をいい感じに使 って、他のテストケースと隔離される テストケースが終わったらロールバック 途中で失敗してもコミットされてない テストケース間でのDB操作がお互いに影響し ない RSpec: use_transactional_fixtures Spring: @Transactional アノテーション
Slide 26
Slide 26 text
PrismaとJest環境の場合
Slide 27
Slide 27 text
3. 過去の自分の操作との競合
Slide 28
Slide 28 text
ここまでの対策で十分なのか? 本当の敵は自分自身なんじゃないの?
Slide 29
Slide 29 text
ID name email(Unique) hogefuga test
[email protected]
開発者A ローカルでちょっとした動作確認を行う Post /users データ作成
Slide 30
Slide 30 text
ID name email(Unique) hogefuga test
[email protected]
fugafuag test_user
[email protected]
テストケースでも同じようなレコードを作成していた (前処理)テストユーザー作成(test_user) テストユーザーログイン成功 テストユーザーログアウト成功 ユニーク制約でレコード作成失敗 テストケースの実行も失敗
Slide 31
Slide 31 text
やめ(略)わた(略) つまりこう 5分前に動作確認でDBレコードを作った自分自身
Slide 32
Slide 32 text
Ruby on Railsなどでは・・・ ローカルでの開発時とテスト時で接続するDB を変更できる
Slide 33
Slide 33 text
とはいえ考えるべきことも・・・ テスト実行前にテスト用DBにもDBマイグレー ションを適用する必要がある テスト実行時に環境変数を読み込ませるな ど、テスト用DBに接続しにいける準備が必要 そもそも、そこまでする必要があるのか? 発生してもDBリセットや辻褄合わせすれ ばよい(許容できるか)
Slide 34
Slide 34 text
まとめ 開発者に気持ちよくRDBが絡むテストを書いてもらうために考えていること
Slide 35
Slide 35 text
テスト作成ハードルを下げるために3つの競合を意識 1他の開発者との競合 個別のDBインスタンスやDockerコンテナ 2 テストケース間での競合 トランザクショナルな仕組み 3 ローカルでの自分自身のオペレーションとの競合 (テスト外で作ったデータなど) テストとローカル動作確認用のDBを分ける 個人的に1と2は必須レベルで欲しい
Slide 36
Slide 36 text
テストを書く心理的ハードル を少しでも下げたい
Slide 37
Slide 37 text
ご清聴ありがとうございました