Slide 1

Slide 1 text

そのbeforeEach本当に 必要?TIPSをご紹介 JaSST nano vol.39 bun913

Slide 2

Slide 2 text

自己紹介 bun913 ● 職種: SDET
 ○ Software Development Engineer in Test
 ● ISTQB AL TA/TTA/TM 取得 
 ● AWSと開発も少しだけできる 
 ● 英語猛烈学習中


Slide 3

Slide 3 text

テストコード書いてますか?

Slide 4

Slide 4 text

きっと大好きですよね!!

Slide 5

Slide 5 text

今日話すこと ● ユニットテストの前処理の小話
 ● 具体的には beforeEach などの話
 ○ beforeAll
 ○ beforeOnce
 ○ など
 ● 意識したいポイントを紹介します
 
 ※ どちらかというと開発者向けです


Slide 6

Slide 6 text

beforeEach とかって何なのさ

Slide 7

Slide 7 text

Jestなど様々なフレームワークで用意されている仕組み ● 特定の検証の前処理、後処理などを スマートに書く方法の一つ
 ● beforeEach
 ○ グルーピングした全てのテストケースの前 に毎回実行するイメージ
 ● beforeAll
 ○ グルーピングした全てのテストケースの前 に1回だけ実行するイメージ
 引用: Jest | セットアップと破棄

Slide 8

Slide 8 text

同じような初期化を毎回しない でいいってこと?

Slide 9

Slide 9 text

これを・・・

Slide 10

Slide 10 text

こうってこと!?

Slide 11

Slide 11 text

DRYってやつじゃない!? いいんじゃない!?

Slide 12

Slide 12 text

ちょっと待ってください。

Slide 13

Slide 13 text

利用時の注意点

Slide 14

Slide 14 text

忘れがち(無視しがち)な 2つのこと beforeAll とか beforeEachを使う時に割 とあるのが・・・ ● 「特定の状態」を「複数のテストケース間 で共有」してしまう場合 ● 単純にスクロールの上下運動がキツく なっていくこと

Slide 15

Slide 15 text

1: 「特定の状態」を「複数のテストケース間で共有している」場合 ・意図せず複数のテストケース間で同じ「インスタンス」や「変数」を持ち回し
 ・実は特定の関数に副作用があり、インスタンスの状態を変更してしまっていたり
 ・そのせいで特定の順番でだけテストケースがパスするようになっていたり


Slide 16

Slide 16 text

・上にスクロールしないと「この変数って何?どこで・どんなふうに初期化された?」が分からな い
 ・(人間なので)ついbeforeEachに全ての前処理をダラダラコメント付きで書いたり 
 2: スクロールの上下運動がキツくなっていく

Slide 17

Slide 17 text

こんな風に beforeEachに書いていたのは私だけではないはず

Slide 18

Slide 18 text

ヘルパー関数がおすすめです

Slide 19

Slide 19 text

ヘルパー関数やファクトリー関数を利用する ・ヘルパー関数を用意
 ・itやtest内で完結できる記述量
 ・テストケース間で共有する状態を意識し なくていいようにする
 ・コメントではなく関数名に意図をこめる こともできる 
 ・地味だけどエディタ補完も効く 


Slide 20

Slide 20 text

コード量が最初と あまり変わってないじゃん!

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

普通にbeforeEachやbeforeAllを使うことも勿論あります ● 統合テストでメモリ外部の依存を扱う必要がある時
 ● 例えば
 ○ DBの状態を特定の状態にしないといけない時
 ○ ユーザーがログインした状態を再現する時
 ● そういう時にも適切に利用していきたい
 ○ (そもそもの設計を工夫して)DBなどの外部への依存との接する部分を極力小さ く。多くの関数は外部から状態を注入しやすく作る。
 ○ ヘルパー関数を使うなどbeforeEachに縦に長くダラダラ書かない


Slide 26

Slide 26 text

書きながら自分の胸が痛い

Slide 27

Slide 27 text

ちなみにですが

Slide 28

Slide 28 text

今回の登壇資料の元ネタ・参考書籍など ・「Zenn | ユニットテストでbeforeEachなどのセットアップを使う際の注意点と改善例」に話 の元ネタを記載
 ・参考にした書籍の情報などもありますのでご興味のある方はご覧ください


Slide 29

Slide 29 text

まとめ

Slide 30

Slide 30 text

beforeEach とかの前処理はとても便利 ● だけど注意したい点もあります
 ○ 意図せず状態を複数のテストケース間で共有していたり 
 ○ beforeEach に全ての前処理を集めて縦に長くなり、コメントでごまかしたり 
 ● ヘルパー関数やファクトリー関数で 意図が伝わりやすいテストコードを書く のはおすすめです


Slide 31

Slide 31 text

最後に少しだけ宣伝を

Slide 32

Slide 32 text

お決まりの? We are Hiring!

Slide 33

Slide 33 text

QAエンジニアの募集も勿論ありますよ!

Slide 34

Slide 34 text

求人ページ

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

No content