カテゎリヌ
コンピュヌタヌ 文化

📖 読曞感想文5『Googleの゜フトりェア゚ンゞニアリング―持続可胜なプログラミングを支える技術、文化、プロセス』Titus Winters、Tom Manshreck、Hyrum Wright 線、竹蟺 靖昭 監蚳、久富朚 隆䞀 蚳 https://amzn.to/3YrMBEn

14章 倧芏暡テスト

結論から蚀うず、実際にはGoogleは倧芏暡テストを倚数甚いおおり、倧芏暡テストは健党な゜フトりェア゚ンゞニアリングに必芁ずなるリスク緩和戊略を構成する重芁な䞀芁玠である。

14.1 倧芏暡テストずは䜕か

  • 倧芏暡テストは遅いかもしれない。Googleでは、倧テストには15分か1時間のデフォルトのタむムアりト時間があるが、䜕時間、それどころか䜕日間も実行されるテストもある。
  • 倧芏暡テストは密閉されおいないかもしれない。倧テストは、他のテストやトラフィックず、リ゜ヌスを共有しおいるかもしれない。
  • 倧芏暡テストは非決定性かもしれない。倧テストが密閉されおいないなら、決定性を保蚌するのはほが䞍可胜である。぀たり、他のテストやナヌザ状態が倧テストに干枉するかもしれない。

このようなデメリットがあっおも、なお信頌を提䟛できるのであれば、倧テストの䟡倀がある。

14.1.1 忠実性

本番環境自䜓は、圓然ながらテストにおける忠実性が最高の環境だ。  略  本番環境からコピヌされたテストデヌタは珟実に察しおかなり忠実だが(そのような方法で取埗されたものなので)、しかし倧きな課題ずなるのは、その新しいコヌドを初めおロヌンチする前に、珟実に即したテスト甚トラフィックを䜜成する方法である。

確かに甚意できないものを甚意するこずはできない。

14.1.2 ナニットテストでよくある䞍足郚分

倧芏暡なテストはたた、小芏暡なテストが機胜しない堎で必芁ずなるこずがある。

以䞋、ナニットテストが苊手なずころがリストアップされおいく。

14.1.2.1 忠実でないテストダブル

しかし、その゚ンゞニアはたいおいの堎合、モックの察象ずなるものを曞いたわけではないのであり、モック察象の実際の挙動に぀いお誀解しおいるこずもありうる。

 略 

さらに、モックは陳腐化する。モックに基づいたナニットテストが本物の実装の䜜者には認識されおおらず、本物の実装が倉化する堎合、そのテスト(ずテストされるコヌド)が本物の実装の倉化に远随するように倉曎されるべきだず知らせるシグナルは存圚しない。

぀たり、モック化される察象に぀いお完璧に理解しおいるわけではないし、時間が経おばモック化した察象が倉わっおいる事が起こり埗るがそれに気づくこずもできない、ずいった問題がある。

14.1.2.2 蚭定の問題

もしそれらの蚭定ファむルに問題があるか、たたはそれらの蚭定ファむルの保存内容に定矩された状態ず圓該バむナリにより定矩された状態ずの間の互換性に問題がある堎合、ナヌザにずっお倧問題になりかねない。ナニットテストだけでは、この互換性の怜蚌はできない。

ナニットテストはそれぞれの環境での蚭定が正しいかどうかを怜蚌するこずには向いおない。

Googleでは蚭定倉曎が倧障害の原因の第1䜍である。

どこでもそうなんだね。Googleでもそうなんだ。

14.1.2.3 負荷がかかるず起こる問題

しかし、パフォヌマンス、負荷、ストレスのテストでは、あるバむナリぞの倧容量のトラフィック送信が必芁ずなるこずが倚い。䞀般的なナニットテストのモデル内では、こうした倧容量トラフィックはテストが難しくなる。

぀たり、ロゞック以倖のこずをテストしたい時は、ナニットテストは圹に立たない。

14.1.2.4 予期しない挙動、入力、副䜜甚

しかし、ナヌザが補品に関しお発芋する問題は、倧郚分が予期しないものだったりする(さもなければ、その問題が゚ンドナヌザヌのずころたで問題ずしお行き着く芋蟌みはないだろう)。この事実は、予期しない挙動のテストをするために、テストに別のテクニックが必芁ずされおいるこずを瀺唆しおいる。

問題が発芋されたら、問題を再珟するナニットテストを曞き、そしお問題を修正し、再床ナニットテストを実行しお成功するように修正しおいく、ずいう流れを思い出した。

14.1.2.5 䞍意に起こる挙動ず「真空効果」

぀たりナニットテストは、真空の空間内に安眮され、珟実䞖界の混乱の届かないずころに巧劙に隠匿されおいる。その状態は速床ず信頌性のためには玠晎らしいが、その状態のために、ある欠陥のカテゎリヌを捕捉し損ねおいる。

䞊述の「負荷がかかるず起こる問題」もこれの䞀郚分のように思える。

14.1.3 䜕故倧芏暡テストを備えないのか

倧芏暡テストの第二の課題は、暙準化(あるいはその欠劂)の䞀皮だ。ナニットテストず違い、倧芏暡テストは、それらのテストが曞かれ、実行され、デバッグされる際に䜿うむンフラストラクチャヌずプロセスの面での暙準化の欠劂に苛たれおいる。

14.2 Googleの倧芏暡テスト

C/J Build (Googleの初の継続的ビルドフレヌムワヌク) は、ロヌンチ時にはナニットテストず他のテストを区別しなかったが、2぀の決定的に重芁な事情が新たに出おきたためにテスト皮類の分割に至った。第䞀にGoogleは、ナニットテストを重芖したこず。テストのピラミッドを奚励し、曞かれるのテストの圧倒的倧郚分がナニットテストであるこずが保蚌されるよう望んだためだ。第二に、TAPがGoogleの正匏な継続的ビルドシステムずしお C/J Build に取っお倉わった際、TAPがその圹目を果たせたのはTAPの適栌芁件を満たすテスト向けのみだったこず。

ナニットテストを重芖するずいうポリシヌのもず、倧芏暡テストをどうするか暡玢しおいった、ずいう流れ。

14.2.1 倧芏暡テストず時間

開発の最初の数日以内にナニットテストを構築しおテストピラミッドの圢に向けお進み、その埌は自動むンテグレヌションテストの導入ず手動の゚ンドツヌ゚ンドテストからの脱华によりテストピラミッドを完成させるこずが、長期的な健党性のためには決定的に重芁だ。我々の堎合は、ナニットテストをリポゞトリぞのコヌド提出のための芁件にするこずで成功したが、長期的な健党性のためにはナニットテストず手動テストの間の間隙ぞの察凊が必芁ずなる。

コヌドの存続期間に応じお、䟋えばナニットテストが必芁か䞍芁かずいったこずが決たっおくる。存続期間が長いずみなしお必ずナニットテストを曞くスタンスがGoogleのようだ。

14.2.2 Googleスケヌルでの倧芏暡テスト

したがっお、このスケヌルでうたく動䜜する方匏で倧芏暡テストを実装し぀぀も、忠実性を適床に高く維持するこずが、決定的に重芁ずなる。

忠実性はすぐ䞋がっおしたうものなので、それはテストダブルによっお、䞋げないように努力するこずがずおも倧事ずいうこずはわかった。説明のための文章がちょっずよくわからなかった。

ヒント : 「可胜な限り最小のテスト」

むンテグレヌションテストにずっおさえ、小さいこずは良いこずである。すなわち、巚倧なテスト1぀より、いく぀かの倧テストの方が奜たしい。

 略 

連鎖させるずいうのは、テストの実行のみを指しおいるわけではなく、党䜓のシナリオを衚す、察になった耇数の比范的小さなむンテグレヌションテストを䜜成するずいうこずだ。

これによっお忠実性を保぀ずいうこずだず思う。

14.3 倧テストの構造

倧テストは通垞、以䞋の段階があるワヌクフロヌで構成される。

  • テスト察象システムを取埗する
  • 必芁なテストデヌタをシヌドずしお䞎える
  • テスト察象システムを甚いお動䜜を実行する
  • 挙動を怜蚌する

倧テストずいうよりも、ナニットテストよりも倧きい芏暡のテストに圓おはたるずいう感じがする。

14.3.1 テスト察象システム

SUTの各圢匏は、2぀の䞻芁な芁因に基づいお刀定可胜である。

密閉性

これは、圓該テスト以倖の郚品の利甚ず盞互䜜甚からSUTが分離されおいる床合いだ。

忠実性

SUTが、テスト察象の本番環境システムを反映する正確さ。

この2぀の項目が、それぞれどれくらいあるかでテスト察象システムを分類しおいる。

14.3.1.1 密閉されたSUTの利点

぀たり、本番環境内テストは、それ自䜓では本番環境ぞのテスト察象コヌドのリリヌスを阻止できないずいうこずだ。぀たりそのSUTは本質的に手遅れなのである。

プログラムコヌドを本番環境にデプロむしない限り、本番環境でのテストはできないわけだからバグが芋぀かっお嬉しいずしおも、本番環境でバグを出したくない芳点から芋れば手遅れ、ずいうこずになる。

次のステップはクラりド分離たたはマシン密閉SUTぞの察応だ。そのような環境は、コヌドリリヌスのため競合ず予玄芁件を回避するこずで状況を改善する。

䜕蚀っおいるのか理解できおいない。。。

14.3.1.2 問題の境界でSUTの芏暡を瞮小する

避けるに倀するかもしれない、特に苊劎の倚いテスト境界が存圚する。ナヌザむンタヌフェむス(UI)のテストだ。UIテストの信頌性のなさずコストの高さは悪名高く、そのためフロント゚ンドずバック゚ンドの䞡方に関䞎するテストは悩たしいものずなる。

  • UIの倉化は、UIのテスト脆くするが、実際にはUIの基底にある挙動には圱響しないルックアンドフィヌル面で起こるこずが倚い。
  • UIにはテストが難しい非同期の挙動があるこずが倚い。

これはずおもよくわかる。バック゚ンドをAPIずしお切り出しそちらだけ自動テストするようにし、フロント゚ンド偎は䜕もテストしない。これが珟圚の自分の環境での状態だ。

忠実性ずコスト信頌性ずのトレヌドオフを特定し、たた劥圓な境界を特定するこずが、ここでの鍵だ。

結局はコスト、劎力、ずのトレヌドオフになる。

14.3.1.3 蚘録再生の代理機胜

Googleが行っおいるのは少々違ったこずだ。Googleで最も人気のあるアプロヌチ(https://oreil.ly/-wvYi 。このために公開APIがある)では、倧芏暡テスト生䜿っお小芏暡テストを生成する倧芏暡テストを実行する際に、倖郚サヌビスのトラフィックを蚘録し、小芏暡テストを実行する際に、それを再生するこずにより小芏暡テストを生成しおいる。

わかりそうでわからない。未知の領域。

14.3.2 テストデヌタ

デヌタは、以䞋のように様々な方法で生成されうる。

手動䜜成のデヌタ

 略 

コピヌされたデヌタ

通垞は本番環境からデヌタをコピヌできる。  略 

暙本ずしお抜出されたデヌタ

デヌタをコピヌするず、提䟛されるデヌタが倚すぎお適切に扱えないこずがありうる。デヌタから暙本を抜出するこずでデヌタ量を枛らすこずができ、それによっおテストの時間が短くなり、テストが実際には䜕を行っおいるのかを掚論するこずが容易になる。

 略 

生成され方の敎理はなるほどそうだず思った。暙本ずしお抜出するメリットずしお、テスト時間が短くなり、掚論が容易になるずいう2点はなるほどず思った。

14.3.3 怜蚌

手動

 略 

アサヌション

 略 

A/B比范差分

 略  意図された挙動は明瀺的には定矩されおいない。぀たり人間が手動で差分を調べ、あらゆる倉曎が意図通りであるこずを確かめなければならない。

想像以䞊に、自動ではなく手動だった。

14.4 倧芏暡テストの類型

゜フトりェア蚭蚈の䞀郚は、テスト蚈画の草案を曞くこずであり、テスト蚈画の鍵ずなる郚分は、どの類型のテストが各々どれだけの量必芁かに぀いおの戊略的抂芁である。このテスト戊略が特定するのは、䞻芁なリスクのベクタヌ(vector: 䟵入経路)ずそれらのリスクベクタヌの圱響の緩和に必芁なテストのアプロヌチである。 Googleには「テスト゚ンゞニア」の専門職があり、優れたテスト゚ンゞニアずなるためには、Google補品甚のテスト戊略の抂芁を策定する胜力が資質ずしお求められる。

Googleでもテスト゚ンゞニアずは倧芏暡テストを瞊暪無尜に操䜜できるような圹割が求められおいるずわかった。それだけ倧芏暡テストは属人的であり、自動化が難しいずいうのがこれたでの内容からもわかる。

以䞋、類型ごずに文章があるが、ただ自分には䜿いこなせない箇所でもあるので、タむトルだけ残し、䞋線を匕いた郚分の抜粋やそれに察するコメントはやめおおく。

14.4.1 盞互に䜜甚し合う1぀以䞊のバむナリの機胜テスト

14.4.2 ブラりザヌずデバむスのテスト

14.4.3 パフォヌマンス、負荷、ストレスのテスト

14.4.4 デプロむ蚭定のテスト

14.4.5 探玢的テスト

14.4.6 A/B差分リグレッションテスト

14.4.7 ナヌザヌ受け入れテストUAT

14.4.8 プロヌバヌずカナリア分析

14.4.9 障害埩旧ずカオス゚ンゞニアリング

14.4.10 ナヌザヌ評䟡

14.5 倧テストず開発者ワヌクフロヌ

誰が倧テストを行うべきかに぀いおは語っおこなかった。 倧芏暡テストを開発者ワヌクフロヌに統合する堎合の堎所ずしお暙準的なナニットテストのむンフラストラクチャヌは適しおいないかもしれないが、それでも開発者ワヌクフロヌぞの統合は決定的に重芁だ。

開発フロヌから独立したずしおも倧芏暡テストはやるべきず匷く薊めおいる、ずいうこずだず思う。

14.5.1 倧テストの䜜成

ナニットテストは、ネむティブ蚀語サポヌトJUnitはか぀お難解なものだったが珟圚は䞻流ずなっおいるのおかげで容易に曞ける。我々は、機胜的むンテグレヌションテストにこうしたアサヌションラむブラリヌを再利甚しおいる。

テスト範囲のより広いむンテグレヌションテストでもJUnitのようなラむブラリヌを䜿っおいる、ずいうこずだず思う。

14.5.2 倧テストの実行

倧芏暡テストが゚ンゞニアにずっお銎染み深い方法で実行されるようにしようず、我々は可胜な限り詊みおきた。  略  しかし倚くの倧テストは専甚蚭蚈であるがゆえに、必芁に応じお実行する方法に぀いおの具䜓的なドキュメンテヌションを必芁ずする。これが銎染みのない゚ンゞニアを苛立たせる原因ずなるこずがある。

結局倧芏暡テストに共通フレヌムワヌクはなく、教育コストが高い。

14.5.2.1 テストの高速化

内郚システムのタむムアりトず遅延を枛らす

 略 

テストのビルド時間を最適化する

目新しさは感じないが、これくらいしか打ち手はない、たたは、これが有効だずしお生き残っおきたのだろう。

14.5.2.2 信頌䞍胜性を排陀する

信頌䞍胜性はナニットテストにずっおは既に十分に有害だが、倧芏暡テストにおいおは、信頌䞍胜性のせいで利甚䞍胜になりうるほどの圱響を受ける。  略  信頌䞍胜性の最小化は、テストの範囲を狭めるこずから始たる。

クラスやメ゜ッドの責任範囲を明確にしお狭めお単䞀責任にしおいくこずに通ずるず感じた。

14.5.2.3 テストを理解可胜にする

開発者ワヌクフロヌぞのテスト統合が難しくなりうる具䜓的な堎合ずしお、テストを実行しおいる゚ンゞニアがテストにより生成される結果を理解できなくなっおいる状態がある。  略  しかし倧芏暡テストでは、こうした混乱は克服しようがないものになりかねない。

難しいものは匷い゚ンゞニアでも難しい、倚分蚈算の難しさ系ずいうより人間関係の難しさ系に近いのではないか。

倱敗しおいるのが䜕なのか明確に特定するメッセヌゞを備える

 略 

優れた゚ラヌずいうものは、テストを実行する者がコヌドに銎染みがないこずを予期し、背景情報を䞎える以䞋のようなメッセヌゞを提䟛する。

 略 

䞍䞀臎の根本原因を特定するために芁する劎力を最小化する スタックトレヌスは倧芏暡テストには有甚ではない。関数呌び出しチェヌンが耇数のプロセス境界にたたがる可胜性があるからだ。

 略 

サポヌトずコンタクトの情報を提䟛する

テストから埗られるヒント、人間からのサポヌトを最倧化する。

14.5.3 倧芏暡テストのオヌナヌずなる

倧芏暡テストには、ドキュメントに蚘茉されたオヌナヌが存圚しなければならない。

 略  然るべきオヌナヌシップを欠くず、テストは以䞋の問題の犠牲ずなる。

  • テストぞのコントリビュヌタヌにずっお、テストの倉曎ず曎新が難しくなる。
  • テストの倱敗の解決に時間が長くかかるようになる。 そしおそのテストは朜ち果おる。

 略 

誰であれテストのオヌナヌずなる者は、テストの党䜓的な健党性を担保する暩限を䞎えられおいなければならず、たたテストの保守をサポヌトする胜力ならびにサポヌトを行うむンセンティブの双方かなければならない。

いく぀もテストを朜ち果おさせたのだろうか。

テストオヌナヌに裁量ず評䟡を䞎えるべきずあるが、Googleでおこなわれおいないずいうよりも広がっおいない浞透しおいないず感じおいる、ずいうこずではないか。

14.6 結論

キヌワヌドを抜き出すだけでも面癜い。

「忠実性」「察象」「倧芏暡テストが必芁だ」

「耇雑化し」「遅く」「適切なオヌナヌ」「保守」

「可胜な限り小さく」

14.7 芁玄

  • 倧芏暡テストはナニットテストが扱えないものを扱う。
  • 倧テストは、「テスト察象システム」、「デヌタ」、「動䜜」、「怜蚌」から構成されおいる。
  • 優れた蚭蚈には、リスク䞊びにそのリスクの軜枛のための倧芏暡テストを芋極めるテスト戊略が含たれおいる。
  • 倧芏暡テストが開発者ワヌクフロヌの䞭で摩擊を生むこずを防ぐために、倧芏暡テストには䜙分に劎力を割かなければならない。

この䞊は特になじみがないが故に難しいず感じた。芁玄を転蚘しおちらちらず芋返せるようにしおおく。

おわりに。14章を読んで

読むこず自䜓は2025幎1月18日(土)に終わった。この章は普段の自分に銎染みがなく、玍埗感や珟実に問題に盎面したこずずしお捉えるこずが難しかった。よっお、抜曞きも、文章に察しお思ったこずずいうよりも、どちらかずいえば芁玄ずなっおしたうず思う。䞋線を匕いた箇所ぞのコメントは、今から取り組む。

本曞の、テスト、ずりわけナニットテスト、自動テスト、に関わる章はこれで読み終わったず思う。他にも気になる章はいく぀かある。ドキュメンテヌションが特に気になるが、䞀旊別の本を読む、でもいいかなず考えおいる。

読曞の今のやり方、印曞的な郚分に䞋線を匕きコメントを぀けるやり方に぀いお。わからないこずに察しお理解しようずするための読曞方法、発芋する、未知ず遭遇しそれを深めおいく、ずいうこずには䞍向きな読曞方法ず思った。

そうではなく、なんずなくわかっおいる事、経隓した事、それでいおうたく蚀語化できおいなかった事、を蚀語化し敎理し玍埗し深めおいく、ずいうこずはできるず思った。

そしお、匕いた䞋線を抜曞きしおコメントを぀くのは、2月9日(日)に終わった。6日で読み、玄20日を、読んだ埌の蚘録に残す䜜業にかけたこずになる。時間がかかりすぎず感じる䞀方で、䞋線をひいたずころの前埌を読み、そしお内容を思い出そうずしたり、感想述べたりするこずが自分自身の孊習に圹に立っおいるずも思える。今埌の孊習をどう進めおいくか悩む。時間がかかりすぎおいる感芚からどうにか玍埗いく圢に倉化しおいければ良いず思うが、アむデアはない。

コメントを残す