20. Erratic Test (1)
●
成功したり失敗したり、動きが一定でない
●
Symptoms
●
いつ実行したかや誰が実行したかによってテストの
結果が異なる
●
同じ Test Runner で実行しても結果がバラバラな
ことがある
21. Erratic Test (2)
●
Impact
●
いつも Test Suite を緑にしたいので Erratic Test
を suite から外し、Lost Test (p268) につながる
●
Suite に入れたままにしたらしたで、他のテストで
赤が出たときに気づかなかったりする
25. Erratic Test Causes
● Assertion Roulette
● Erratic Test
● Interacting Tests
● Interacting Test Suites
● Lonely Test
● Resource Leakage
● Resource Optimism
● Unrepeatable Test
● Test Run War
● Nondeterministic Test
● Fragile Test
● Frequent Debugging
● Manual Intervention
● Slow Tests
26. Erratic Test Causes
●
Erratic Test
●
Interacting Tests
●
Interacting Test Suites
●
Lonely Test
●
Resource Leakage
●
Resource Optimism
●
Unrepeatable Test
●
Test Run War
●
Nondeterministic Test
27. Interacting Tests (1)
●
テストが他のテストに何らかの形で依存してい
る
●
バリエーション
●
Interacting Test Suite
●
Lonely Test
28. Interacting Tests (2)
●
Symptoms
●
独立して動かすときには成功しているテストが以下
の状況下で失敗する
– 他のテストが suite に追加 / 削除されたとき
– Suite の他のテストが失敗 / 成功したとき
– テスト自身、もしくは他のテストのファイル名が変更さ
れたとき
– Test Runner の新バージョンがインストールされたとき
29. Interacting Tests (3)
●
Root Cause
●
多くの場合、 Shared Fixture (p317) を使ってい
てかつ他のテストの (Shared Fixture への) 出力に
依存しているために発生する
●
二つの側面から説明できる
– The mechanism of interaction
– The reason of interaction
36. Erratic Test Causes
●
Erratic Test
●
Interacting Tests
●
Interacting Test Suites
●
Lonely Test
●
Resource Leakage
●
Resource Optimism
●
Unrepeatable Test
●
Test Run War
●
Nondeterministic Test
37. Interacting Test Suites (1)
●
Symptoms
●
Suite 単体では成功するが、 Suite の Suite とい
う構成にすると失敗する
●
Root Cause
●
よくあるのは、同じリソースを Suite が作成しよ
うとし、後から実行された Suite のほうが失敗す
るケース
38. Interacting Test Suites (2)
●
探すには
●
失敗したテストを見る
●
それでも分からない時には
– 成功している方の Suite からテストを一つずつ取り除く
●
失敗しなくなったときに取り除いたテストが依存元
●
場所はどこか
– Shared Fixture
– Test Method 内
– Setup method
– Test Utility
39. Interacting Test Suites (3)
●
Root Cause (Cont'd)
●
依存しあっているのは一つのテストとは限らない
●
テストケースではなく Suite Fixture Setup や
Setup Decorator が引き金となっているかもしれ
ない
●
NUnit についてまたいろいろ書いているが割愛
41. Erratic Test Causes
●
Erratic Test
●
Interacting Tests
●
Interacting Test Suites
●
Lonely Test
●
Resource Leakage
●
Resource Optimism
●
Unrepeatable Test
●
Test Run War
●
Nondeterministic Test
43. Erratic Test Causes
●
Erratic Test
●
Interacting Tests
●
Interacting Test Suites
●
Lonely Test
●
Resource Leakage
●
Resource Optimism
●
Unrepeatable Test
●
Test Run War
●
Nondeterministic Test
44. Resource Leakage (1)
● Symptoms
● テストがだんだん遅くなり、ついには失敗しだすように
なる
● Test Runner / SUT / Database Sandbox(p650) をク
リーンアップするとテストが通るようになる
● Root Cause
● 有限リソースをテストが消費し、それの開放に失敗して
いる
● テストがどんどん遅くなる
● テストを連続して続けるとリソースが使い尽くされ、後
続のテストが失敗し始める
45. Resource Leakage (2)
●
Root Cause (Cont'd)
●
SUT がリソースの開放に失敗している
– これが判明したら、直すのも難しくない
●
テストが fixture setup でリソースを消費し、開
放に失敗している
47. Erratic Test Causes
●
Erratic Test
●
Interacting Tests
●
Interacting Test Suites
●
Lonely Test
●
Resource Leakage
●
Resource Optimism
●
Unrepeatable Test
●
Test Run War
●
Nondeterministic Test
49. Erratic Test Causes
●
Erratic Test
●
Interacting Tests
●
Interacting Test Suites
●
Lonely Test
●
Resource Leakage
●
Resource Optimism
●
Unrepeatable Test
●
Test Run War
●
Nondeterministic Test
53. Erratic Test Causes
●
Erratic Test
●
Interacting Tests
●
Interacting Test Suites
●
Lonely Test
●
Resource Leakage
●
Resource Optimism
●
Unrepeatable Test
●
Test Run War
●
Nondeterministic Test
54. Test Run War (1)
●
Symptoms
●
一人でテストを実行する時はテストが成功するが、
複数人が同時にテストを実行すると失敗する
●
Impact
●
カットオフ間近に発生しがちだからイライラする!
●
「テストが落ちたら最後の変更を疑え」ルールが機
能しなくなる
55. Test Run War (2)
●
Root Cause
●
Shared Fixture (Database)
– 行の UPDATE / DELETE / SELECT などの競合
– 悲観ロック
●
Shared Fixture (File)
– 既に他の人がファイルを開いているなど
56. Test Run War (3)
●
Possible Solution
●
Fresh Fixture (★何回目?)
●
Test Runner 毎に Database Sandbox を使う
– しかしこれではまだ Shared Fixture 経由の
Interacting Test は解決しない
●
Immutable Shared Fixture
– Test の変更が若干必要かも
●
データベースに残る残骸が問題なら Automated
Teardown
– Test Run War の根本解決にはならないが、確率が減る
57. Erratic Test Causes
●
Erratic Test
●
Interacting Tests
●
Interacting Test Suites
●
Lonely Test
●
Resource Leakage
●
Resource Optimism
●
Unrepeatable Test
●
Test Run War
●
Nondeterministic Test
58. Nondeterministic Test (1)
●
Symptoms
●
テストがランダムに失敗する
– 人や環境、同時実行にも関係なさそう
●
複数の Nondeterministic Test が suite にあると
問題判別が難しい
●
Impact
●
デバッグに時間がかかりすぎるし、イライラする
78. Fragile Test Causes
●
Fragile Test
●
Interface Sensitivity
●
Behavior Sensitivity
●
Data Sensitivity
●
Context Sensitivity
●
Overspecified Software
●
Sensitive Equality
●
Fragile Fixture
79. Data Sensitivity
●
Symptoms
●
テストデータが変更されるとテストの実行に失敗す
る
– 既存テストデータの追加、更新、削除
– Standard Fixture のセットアップコードが変更された
– テスト実行前に Shared Fixture が変更されている
●
Root Cause
●
データが変わっている!
– 検索に余計に引っかかるとか
– 無くなっているとか
80. Data Sensitivity (2)
●
Possible Solution
●
多くの場合 result verification で発生する
– Verification logic を見直す
●
一番良いのは Fresh Fixture
●
Database Partitioning Scheme
●
Delta Assertions
81. Fragile Test Causes
●
Fragile Test
●
Interface Sensitivity
●
Behavior Sensitivity
●
Data Sensitivity
●
Context Sensitivity
●
Overspecified Software
●
Sensitive Equality
●
Fragile Fixture
82. Context Sensitivity
● Symptoms
● 成功していたテストが突然失敗し始める
– Erratic Test との違いは、再現性があること
● Root Cause
● 時刻や日付に依存している
● SUT が他システムや OS に依存している
● 本当にユニットテストになっているか確認しよう。テス
ト範囲が広すぎて Context Sensitivity に陥っていない
か
● 広すぎると誰かが DOC を変更しただけでもテストは失
敗する
83. Context Sensitivity (2)
●
Root Cause (Cont'd)
●
時刻や日付に依存しているコードがあるか
●
他システムからの入力に依存しているコードがある
か
●
実は問題が発生したりしなかったりするようなら
Erratic Test の知識を生かすべし
●
Possible Solution
●
Test Stub (p529) に置き換える
●
時刻依存なら Virtual Clock [VCTP] に置き換える
– (Fowler の FakeClock もみてみよう)
84. Fragile Test Causes
●
Fragile Test
●
Interface Sensitivity
●
Behavior Sensitivity
●
Data Sensitivity
●
Context Sensitivity
●
Overspecified Software
●
Sensitive Equality
●
Fragile Fixture
85. Overspecified Software
●
テストが SUT がどう振る舞うべきかについて
「過剰に」記述されている
●
Test Double を使った Behavior Verification でよ
く発生する
●
Mock Object の使いすぎ
●
原因は「What」ではなく「How」をテストで
記述してしまっていること
●
実装依存になりすぎている
●
Use the Front Door First !! (p40)
86. Fragile Test Causes
●
Fragile Test
●
Interface Sensitivity
●
Behavior Sensitivity
●
Data Sensitivity
●
Context Sensitivity
●
Overspecified Software
●
Sensitive Equality
●
Fragile Fixture