ここ2、3日で、くりあきさんのXで、エンドツーエンド関連の話題でちょっとバズってましたよね。
今回ちょっとその話していけたらなと思ってるんですけど。 はい、そうですね。2つ、まあでもどっちもエンドツーエンドテストに関わる話で、
1つは、エンドツーエンドテストを全振りしている人の話でしたね。 全振りしているっていうことが別にいいんじゃないかっていうふうな話っていうのが1つと、
もう1つは私の持論で、エンドツーエンドテストの立ち位置、どこなのかとか、どういうふうにしてテストの設計をしていくべきなのかみたいな、そういうふうな2つのツイートがそれなりに好評いただいたみたいですね。
はい、じゃあ今回ちょっとその話していけたらなというのと、まずはあれですね、エンドツーエンドテストを全部寄せた方がいいんじゃないかっていう主張に対して、
まあちょっとそれは違うんじゃないみたいな感じで、国明さんが突っ込んだやつが、まあだいたい今見ると393いいねと、あとは5万インプレッションって言うんですかね。
インプレッションぐらいされてるみたいな、まあちょっとバズってるっていうようなところなんですけど、これについてちょっと説明してもらってもいいですか、詳細。
いや、なんでみんなこんなエンドツーエンドテスト好きなんですかね。 エンドツーエンドテスト好きすぎるなと思ってて、いや私の考えだとエンドツーエンドテストってそんなにいいものではないんですよね。
なので、なんでみんなそんなにエンドツーエンドテストに関心があるのっていうのはちょっとよくわからないっていうところはちょっとあるんですけど、
ちょっとエンドツーエンドテストっていうのがどういう立ち位置なのかっていうのを一度整理したいなと思います。
エンドツーエンドテストは元々は、エンドって一体何かというと端っこですね。端っこ。端っこという端っこってことは、つまりシステムを全部くっつけて、
端っこ、隅から隅まで、要するにユーザーインターフェースからデータベースまで一気通貫でテストをしましょうっていう全てを結合したテストのことをエンドツーエンドテストと呼びます。
今回のツイートの文脈だとさらにこれが自動で行われるエンドツーエンドテストを意図されていることが、本当はマニュアルベースのシステムテストとかシステム統合テストって呼ばれてるのもエンドツーエンドテスト
なんですけど、
それは一旦今回は考えない。マニュアルベースは考えない。自動のものとして想定してくださいと。
人が実行するエンドツーエンドUIのボタンとかを押すんじゃなくてCIとかで実行するようなテストですね。そういうものがあって、よく聞くのはウェブドライバーとか
プレイライトとかっていうのがウェブとかだとよく使われているやつかなと思います。それがよく知られているエンドツーエンドテストだと思います。
このエンドツーエンドテストで見つけられる問題が何かってことをよくちょっと慎重に吟味した方がいいなと思っています。
エンドツーエンドテストで、いくつかエンドツーエンドテストにもバリエーションがあるんですけど、一つはビジュアルリギュレーションテストと呼ばれている
前と比べてスクショが変わってないかと調べるテスト。これは画面崩れた顔を見られるんですけど、
一番最初のサンプルは人間が見ないときで、人間が一個一個写真を見て、これ崩れたね、オッケーオッケーオッケーオッケーってお墨付けを与えると、それからずれてないよねっていうふうなことを与えるテストになる
っていうふうなものもあるんですけど、
でも典型的なビジュアルリギュレーションじゃないテストっていうのは、基本的にボタンが押せるか押せないかとか、
いいとした場所にそういう表示が出てるかとか、その程度のことしか見られないっていうのが普通のエンドツーエンドテストです。
見られるものが少ないってことですかね?
いや、少ないわけではないんだけれども、人間に比べるともちろん少ないです。人間の方が例えばここの言い回しに変であるとか、
あとは例えばここだけ日本語フォントじゃなくて中国フォントが使われてるとかっていうのとか気づくじゃないですか。でもエンドツーエンドテストだと気づかないんで普通は。
そういうところとかはやっぱり人間の方がいい感度を持っている。
なるほど。人間がチェックするときの感度的に、多分今までの経験とかそういったので気づくところが機械的なテストだったらすり抜けちゃうよねっていうところかも。
そうです。じゃあそういうふうに人間のエンドツーエンドテストと比較するとそうなんですけど、他のテスト、例えば結合テストとか単体テストと比べるとどうかっていうことを考えてみると、
基本的に単体テストで見つけられる問題ってエンドツーエンドテストでも見つけられるんですよ。
ちょっとすごく細かい言い回しをすると、他にはいくつか前提はつくんですけど、それはちょっと細かいところ置いといて。
基本的に単体テストで例えば失敗する、例えばある入力を与えると例外が起きてしまうっていうふうな入力がどっかのコンポーネントテストで起こっていたとしても、エンドツーエンドテストで同じようにそこを踏んであげ
れば例外が起きてクラッシュするということをエンドツーエンドテストで確かめられるので、
基本的に単体テストの上位互換なんです。エンドツーエンドテストって。
再現できるってことですね。単体テストで発生するフェイルっていうのはエンドツーエンドテストでも条件揃えられれば発生するよね。
なので検出感度って意味だとエンドツーエンドテストは完全にユニットテストの上位互換なんです。
じゃあなんでみんなエンドツーエンドテストだけにしなかったか、みんな単体テストとかしようとかって言い出したかっていうと、エンドツーエンドテストはコストが高い、本当に高いっていうのが最大の問題点なん
ですね。
ここで言っているコストって、もうちょっと詳しく言うと、2つ言うと保守コストと実行コスト。この2つです。
保守コストっていうのは維持していく。そのテスト、エンドツーエンドのテストが正しいことを保証していくというのがとても大変だというところと、実行コストっていうのは単純に時間ですかね。
実行時間です。そうです。この2つがとってもとっても高いので、エンドツーエンドテストって本当に贅沢品なんですよ。
いっぱい揃えて全部エンドツーエンドテストで回してやるみたいなことっていうのは普通はできないんですね。
無限に時間があって、無限にお金がかけられるんだったらできる。そうできる。そしたらもうユニットテストなんていらんのやっていう話になるんですよ。
理想的にはそうだね。理想的にはそう。だけど実はそうじゃなくて、私たちは有限のコストと有限の時間と有限の保守コスト、保守要因しかいないわけですよ。
なのでどこかで妥協することになるわけですね。私はエンドツーエンドテストだけで1本で行くテストのセットと、単体テストとかいろんなものと組み合わせるセット、どっちの方が同じコストでバグを多く見つけられるか
っていうと、組み合わせた方が多く見つけられると思っています。
その理由を説明していこうかなと思います。まずコンポーネントって結合していくやはしていくほどテストケースが増えていくって話をまずしようと思います。
まず関数が1個あります。こいつは m 通り、n 通り、5通りってあるとします。
5通り。でもう一つは10通りのコンポーネントがあるとします。これをその5通りのやつを呼び出して後に10通りのやつをその出力を使って入力させると何通りになりますか?
5×10ってか50通りですよね。そう50通り。じゃあこれ単体で見た時ってどうなりますか?
単体で見た時は5通りと10通り。15通りですかね。これだけで何が起こっているのかわかりますよね。テストケース数が全然違うんですよ。
爆発的に増えていってしまうっていうのがあって、なので例えばエンドツーエンドテストでその C0 カバレッジとかを取る。
C0って言ってるのは命令カバレッジって言われてる。全ての行が実行されたみたいなやつなんですけど、あれ取るのはめちゃめちゃ難しいです。
組み合わせ爆発になってしまう。すごく難しいんですよ。なので普通は全ての行を実行したいじゃないですか。最低限よく実行しろって言われるのがこの C0って呼ばれてるカバレッジなので、それをエンドツーエンドテ
ストだけで取るのは非常に困難なんですよ。
だけど単体テストを使うとそれがあっさりと実現される。 じゃあ単体テスト全部単体テストでええなって話になりませんか。
これがそうはならないんですよ。なぜ組み合わせって話になるかっていうと、先ほどエンドツーエンドテストの感度は単体テストの上位互換だって話をしたと思うんですけど、
ってことは単体テストで見つけられないんだけどエンドツーエンドテストでは見つけられる。そういうものがあるってことなんですね。
これはじゃあどういうものかっていうと結合バグって言われるものです。 組み合わせた時に何か発生する問題って。
例えばちょっと例を見てみようと思うんですけど、フィズバズ、私フィズバズがみんな大好きなんで、フィズバズでよく例えるんですけど、フィズバズって
数を入れたらそれがフィズかバズかとかあるいは数字かみたいなとか出してくるようなやつですよね。 これで例えばそのターミナルのプログラムで数字をポチって入れてエンター押すとフィズとか返ってくる。
そんな感じのプログラムをフィズバズだとしましょう。 こうした時に私は2つのコンポーネントに例えば分けるとします。
1つは入れられた文字列っていうのがちゃんと数字かどうかを判定して数字だけ返すってやつ。 バリエーション的なやつですね。
ともう一つはその与えられた整数っていうのがフィズなのかバズなのかあるいは普通の文字列なのかっていう風に変換するやつ。
これは例えばその文字の部分のバリエーションは簡単ですよね。Aとか入れられたら弾く。 1って入れられたら1を通す。
でもう片方は1って入れられたら1を返すし3って入れられたらフィズを返すし 15って入れられたらフィズバズを返す。
いいじゃん。それぞれテストかけますよね。テスト通った。くっつけた。そしたらエラーになりました。なぜか。なぜかというと
1とかそのバリエーションする方が文字列で返しちゃってた。
だけどもう片方は整数を期待していた。 これ両方ともコンポーネントテストは通るんですよ。そういう仕様だったんだねっていう話。
単体だったら通るけどそれらを組み合わせて使った時には落ちてしまう。
落ちてしまう。片エラーで落ちることになるわけですけど。性的な型検査がない言語だと実行時エラーで落ちますね。
ということが起こるわけで。じゃあこれは何だったのかというとこれがまさに結合バグって言っているもので
一個一個は正しいんだけどその一個一個の仕様がくっつかないんですね。
くっつかない。馴染みが悪いって言うんですかね。そういうふうなことが起こるっていうのが結合バグです。
エンドツーエンドテストはこの結合バグを見つける親玉です。全てがくっついてるんで。全てがくっついてるんで全てのところの結合バグを見つけられるっていうのがこのエンドツーエンドテスト。
そういう感じですね。なので単体テストでは見つけられないんだけどエンドツーエンドテストで見つけられるのはこの結合バグっていうのが主なフォーカスになってくるわけですね。
ってことは使い分けとしてはそのただの条件分岐のミスとかそういうものとかっていうのは全部単体テストで見つけたい。
コンポーネントテストで見つけたい。それじゃなくてコンポーネントとコンポーネントをくっつけた時に何が起こるのかがよくわかんない。それをエンドツーエンドテストで確かめる。
結合テストで確かめる。それがエンドテストの使い分けって言ってる部分ですね。
なるほど。今の話であればエンドツーエンドのテストで全てのユースケースっていうか全てのインプットをモーラ的にテストするのではなくてそのコンポーネント単位でちゃんと仕様を決めてその仕様が満たしているって
いうことを保証するのがエンドツーエンドのテストってことなんですかね。
で実は階層構造があって一番上にあるのがトップレベル仕様って言われているもので私たちは例えばウェブサービスとかを扱うんだったら画面遷移図みたいなものがトップレベル仕様です。
今一番最初に何もない状態でログイン画面が出てログイン画面でログイン入れて正しいやつを入れるとokでとかそういう風な画面遷移図があるじゃないですか。
これを通りにエンドツーエンドテストって大体組むわけですよね。
なのでこの画面遷移図っていう仕様がエンドツーエンドテストにとっての仕様だし、
例えばユニットテストとかそのコンポーネントテストって言われているのはもっとJavaDocとかに書かれるような例えば1たす1が2になるみたいなそんな感じの仕様が書かれている。
関数単位での仕様。
そうそう関数単位での仕様が書いてある。
なのでこれはもっともっとちっちゃい分解された仕様なんですね。
なのでどっちも仕様なんだけどちょっとその間には区別が必要ですね。
トップレベルの仕様なのかそれともコンポーネントの仕様なのか。
なるほど。
そこまでいくとこの使い分けエンドツーエンドテストを使うべきところと単体テストを使うべきところの分けっていうのが結構難しくないかなと思っちゃったんですけど。
この仕様っていう話がそのコンポーネント単位による仕様であれば単体テストで行けますと。
ただプロダクトレベルの画面単位とかプロダクトレベルの仕様であればエンドツーエンドテストの範囲なんだけど
全体を見て俯瞰しているエンジニアでないとこれを使い分けるって結構難しいんじゃないかなと思っちゃいました。
いい質問ですね。それは本当にその通りで。
そうなんですよ。難しい。
それは本当はテスト設計とかテスト計画とかやったりするようなテスト戦略とかやったりするようなものでそれ自体がすごく難しいことではあるんですよね。
ただ現実にはほとんどの人はQAっていうかマニュアルテストする要因とコンポーネントテストする要因は分かれちゃっていて
お互いがお互い好き勝手やってるっていうのがよくある現場での例ですよね。
なのでそこに戦略もヘッダクレもないんですけど本当はインテストで担保していることはエンドツーエンドテストでテストしなくていいし
というふうな本当はそういうのがあるって感じですね。
お互いが強調し合ってどちらもどちらをちゃんとテストケースを見た上でちゃんと分けて管理した方がコスト的に安いし時間も節約になるし健老になるしってことなんですね。
これはすごく端的に本当にその通りでエンドツーエンドテストって先ほど事故コスト高いって言ったんですけど2倍とか3倍とかだったら全然いいんですよ。
それだったらエンドツーエンドテストに私も全部寄せるんですけどそういう単位じゃないんですよね。
100倍とか1000倍の単位で遅いんですよ。
だからエンドツーエンドテスト1個通してる間にユニットテストのテストケースだと100件とか1000件とか普通に通せちゃうんですよね。
なのでそれはもう圧倒的に違うじゃないですか。
エンドツーエンドテストとか5個もたもたシナリオテストしてる間にユニットテストは5000件のマトリックスできるって言ったら全然遥かにテストできる範囲が違うんで。
だからエンドツーエンドテストでマトリックスとか組んで24時間経っても終わらないんだけどこのテストみたいなの作らずにユニットテストでそういう細かな条件分岐は拾いましょうという風な使い分けの方がより多
くのバグを見つけられるという風に私は思っている感じですね。
最終的な目標としてはバグを見つけるもしくは壊れていないことが保証できるテストとして。
そうですね。ただテストはバグを見つけることはできるんだけどバグがないことを保証するってことはちょっと特殊な方法を使わない限りはできないんですね。
あくまで証明みたいな。
さっき言った通り結合すればするほどテストケースが増えていってその全部をテストしたんだったらバグがないってことのお済みつきが得られるわけですけど。
実際ちょっと考えてみると簡単なんですけど設定画面行って戻って行って戻って行って戻って100回繰り返すみたいなことができるわけですよ。
それでクラッシュしないことって言われたらそれ1万回でもできるじゃんってことは無限にテストケースあるのがわかりますねと。
なので普通はこれをテストしきることはできない。
なのでどこかで諦めてこの範囲ではバグが見つからなかったとかいう言い方になる。
現実的にそうなってしまう。
そうなってしまう。
でその上で諦めるということがある限りその理想は理想でありコスト的に有限なコストを抱えている現実においてはその理想ができないのであればエンドとエンドテストだけでは絶対的にできないという話に結論としては
なる。
なるってことです。
でじゃあ当然ここで気になるのは現実テストってなるべく書いた方がいいっていうのはわかった。
だけどエンドとエンドテストも書かないと結合バグ見逃しちゃうよねって話を言いましたわけです。
じゃあ一体エンドとエンドテストのテストケースつまりそのテストのシナリオとかっていうのはどう選べばいいんだって絶対疑問に思うと思うんですよ。
これはもうだいたいそのある程度答えは決まっていてユーザーにとって価値があったりその運営部隊にとって価値があるその2つのどっちかのケースっていうのを選ぶべきだとよく言われています。
それはなぜかというとお客さんにとって例えばそのXとかツイートしてそのいいねもらってそういうのが嬉しいサイクルなわけですよ。
それは当然テストしますよね。
他の人にいいねされたらちゃんといいねの通知が出てくるとかっていうことをテストする。
一方でお客さんにとっては嬉しくないんだけど企業にとって嬉しいのは当然あります。
それはお金を使う当然です。
例えばXでプロモーションするっていうのがつい最近プロモーションのぬってしたから手が出てきてみたいな。
話題になってましたね。
あれは別にユーザー嬉しくないわけですけど運営部隊にとっては大事なわけですよ。
なぜかというと収益源になってるお金が大事なわけなので。
なのでどっちかに当たるようなテストケースっていうのは最低限のものだけをいくつか選んで
ハッピーパスだけやりましょうっていうのがエンドツーエンドテストの原則になると思っています。
ちなみに最低限はやりましょう。
お金の部分と運営部隊として一番重要な部分と
あとはサービスとして最低限保証しておかないといけない部分。
Xだったら投稿するだったりとか
いいねが通知が来るとか
いいねボタン押せるとかそうかもしれないですけど
そういう最低限のところをカバーするっていう他以外に
エンドツーエンドとしてやっておく
今のって最低限って言っていたので
最低限じゃなくて
できる限りやっておいた方がいいは真なんですかね。
できる限りそれが難しくて
エンドツーエンドテストっていうのは保守コストが高い理由のうちの一つが
結合しているものが多いので
仕様に振り回されるっていうのはすごくあるんですね。
ぶっ壊れやすいということですね。
例えばコンポーネントテストだったら
そのコンポーネントに対応するテスト直せば
あとはすがなく全部グリーンになるわけですけど
エンドツーエンドテストっていうのは巻き込まれて
いろんなものがレッドになるんですよね。
いろんなコンポーネントを通って
結合されたコンポーネントを通っていく中で
その1個にでも何か仕様が変わったものとかがあると
そのテストは全部修正しなきゃいけないことになってくるんで
芋づる式に広がっていっちゃうわけですよ。
なんでエンドツーエンドテストが多ければ多いほど
例えばAIとかに任せるじゃないですか
これ実装しといてっつって
そしてエンドツーエンドテストとかまで
AIって聞きを聞かせて回してくれるわけですけど
なんか最近機能追加遅いなと思ったら
エンドツーエンドテストにほとんど時間を費やしていたり
みたいなことが起こるわけですよ。
それはとてももったいない。
それが保守コストが本当にバカにならないってことなんですよね。
今個人で作っているツールあるんですけど
今エンドツーエンドのテストを書かせてるんですよ。
今実行に25分くらいかかってますねローカルで。
単純に多すぎるし
1個機能追加するのにそれだけ時間かかってしまうっていうのは
個人開発だったら別に
自分の時間その間ゲームとかしてればいいだけかもしれないんですけど
これが企業とかだったら
長すぎないみたいな話になってくるっていうことですよね。
でもユニットテストだったら
普通はユニットテスト1分以内とか5分以内とかに終わらせるべきものなので
それぐらいで終わるわけですよ。
それってもう全然遥かに違うって感じのものになるわけですよね。
だからなるべく分岐とかマトリックスとかでテストを
マトリックスっていうのは例えばこの条件この条件この条件みたいな
パターンがいくつかあるじゃないですか
そのパターンを行列みたいな形でテストする
表を書いてそれを1個1個全部埋めていくみたいな感じのテストが
マトリックスのテストなんですけど
マトリックスのテストとかは明らかにコンポーネントとかユニットテストでやるべき
それをエンドツーエンドテストでやるのは終わってるって感じですね。
理解しました。
くにあげさんの主張としてはかなり理解できたかなと思うんですけど
ちょっとひるがえってもうちょっと
一番最初のXでのバズった投稿の
大元を書いてくれた人の主張としては
AIがコーディングすることにおいて
エンドツーエンドに全部寄せてしまった方が
楽というかちゃんとテストできるんじゃないかという主張で
大前提そのAIというものがあるわけじゃないですか
さっき言ってくれたエンドツーエンドテストのコストとして
実行時間が長いというのは確かにその通り
運用保守の部分ですね
テストの保守の部分はAIが何とかしてくれるのではないかという
疑問に関してはどうですか
それはとてもいい質問だと思います
これに関しては緩和化されるが
根本的な解決はしていないというのが答えになっていて
もちろんそのAIが保守コストっていうのは
だいぶ安くやってくれるようになったわけですよ
しかも並列度をカットスケールさせて
直すとかいうことができますからね
でもちょっとよくよく考えてほしいんですけど
エンドツーエンドテストが直ったことってどうやって確認しますか
って言われると実行するしかないんですよね
試してみるしかないってことですね
実行して落ちるかどうか成功するかどうかを見るしかない
もちろんテストセレクションって呼ばれてる
テストケース実行すべきものどれかっていうのを
賢く選ぶ方法ってあるわけですよ
例えばここの部分しか触ってないから
ここだけテストすればいいのみたいなのあるじゃないですか
それが上手にできていればエンドツーエンドテストでも
すごくうまくその部分だけ見るってことができる
ですけどテストセレクション誰がやってますかって話なんですよ
テストセレクションって論文書かれるぐらい
すごい難しい分野なんですよ
だってそれ依存関係によっては大元のところをいじったら
もちろん全部再実行しないといけないし
それで枝葉の部分上位のコンポーネントをいじったから
じゃあそこの部分のエンドツーエンドテストだけでいいよね
っていう話になればいいですけど
それって枝葉の部分だけであって
そんなことないですよね現実
そうそんなことないんですよ
グローバル変数1個触るだけで
本当は全部やり直しになっちゃうんですよ
そんな風になっちゃうんで
そのテストセレクションっていうのはやっぱり
まだちょっと人類で有名なところがまだちょっとあって
エンドツーエンドテストはやっぱり結構関連する部分
大きく大雑把に回さざるを得ないっていうところがあって
そこで実行コストが乗ってくる
これはAIがいくら賢くなっても解決しない
エンドツーエンドテストが遅いっていう
実行によってしまうからってことですね
正しいかどうかっていうところを実行してみないとわからないので
そこが時間的なコストがかかってしまうんだったら
あんまり意味ないよね
あとはさっき言った通り
いきだるま式に関係するコンポーネントシナリオ
結合するものが増えてるってことは
ユニットテストはちっちゃく直せばいいのに
エンドツーエンドテストは結構まるっと
何パーセント直さなきゃいけないレベルになっちゃう
ってことがよくあることで
それもやっぱり振り回されるって意味ではそうですね
なるほど
なのでAI時代においても若干は緩和してきてる
とはいえ大元として
大元の課題感は特に変わらないんじゃないのか
そうなんですよ
いくらコンピューターが速くなっても
N事情とかのオーダーで動くものってのはやっぱり遅いと
そういうのと同じレベルの話だということです
なるほど
ちなみに次の話題というか
ちょっと疑問点として
エンドツーエンドテストに寄せたらいいんじゃない論調の場合
AIにもしかしたら
エンドツーエンドを書いてもらうみたいな話になってるのかな
とは思うんですけど
それが正しいかどうかみたいなところでどうなんですかね
これは非常に難しくて
多くのエンドツーエンドテストを自動で書かせた人の事例を見ていると
実装の追認にしかなってないなって思う
追認っていうのは要するに後から実装はこうだから
こういうのが正解なんじゃねって推測して書いてる
なるほど
振る舞いじゃなくて
推測というか
こう書いたからこうなってるのが正しいよね
でしかないっていうことになってる
パスワードフォームがあって
データベースにチェックしてるから
多分これに正解のデータ入れればいいんじゃねって
推測してるってことですね
これ私ちょっと思うんですけど
実装の追認のテストって何か意味あるんですかねって思ってて
正直あんまないよねって思うんですよね
私たちがViveコーディングとかで作った
ソフトウェアに対してエンドツインのテストをした最大の動機って
糸通りにできてるかなですよね
ちゃんと動いているか
ちゃんと動いてるかそれ本当に糸通りに動いてるか
ちゃんとバグがないかって言い返すと
ちょっと言い方を変えると糸通り動いてるかって
糸通り動いてるか
糸通り動いてないのをバグっているわけですからね
その糸通り動いてるかっていうのを
実装からリバースしたら
そりゃ実装が正しいになっちゃうじゃん
実装が正しい
やっぱり糸っていうのがどこにもない
出てきてないわけですよ
だからその作業者の方
Viveコーディングとかやっている
作りたかった人の考えっていうのは
そこに入ってない
入ってない
フロントとかにはたぶん散りばめられてるわけですけど
だけどそんな結果
AIの解釈を挟んだ結果が実装としてあるわけで
その解釈前のデータどこにも残ってないんですよね
だからAIの解釈が正しかったかってことが
どこにも現れてない
どうやっても確かめられることができない
っていう意味で私は
AIに実装が先にあって
その次にAIでエンドツールテストがって書かせるぞ
みたいのは絶対やめた方がいいと思ってます
ちなみにそれ逆にしたらどうです?
先にエンドとエンドを書かせる
いいですね
これはある意味筋がいいと思うんですけど
もうちょっといいやり方があるかなっていうのが
私の答えですかね
このエンドツールテストを先に書くっていう流儀が実はあります
これはテストファーストっていうのは
よくテスト駆動開発とかで
TDDとかで出てくるやつなんですけど
このテストファーストで
先にユニットテストを書くか
エンドツールテストを書くかっていう流派があります
このうち先にエンドツールテストを書くっていう流派が
まさに今おっしゃったような例になっていて
先に私たちはこんなの作りたいんだよねっていうのを
いくつかの例を書いて
例えばECサイトだったらカートみたいなのがあって
商品選んでカート入れて掲載して
届くみたいな
そんな感じのシナリオを一番最初に書いて
当てずっぽうで書いてそれを満たすように
埋めていくっていうやり方を取るわけですよね
これはすごく
良い意図が現れているパターンだと思います
なのでこの順番はすごく良い着眼点で
それはすごく良い
と思いますね
なるほど じゃあ先に
作業として
こういう挙動を
こちらは意図しているよ
考えているよというのを
プロンプトとして渡しつつ
エンドツーエンドテストを書いてもらって
それをちゃんとエンドツーエンドテストを
確認するという作業を挟めば
ある程度の精度は出そう
そう精度は出ると思います
ただここでもやっぱりエンドツーエンドテストが遅いという話が
いつまでも出てくるんですよ
最終的にはね
例えばカートを追加するときに
プレミアム配送オプションとかを追加した
っていうときにエンドツーエンドテストのテストシナリオを
一個追加するのかって言われたら
さっき私が言ったマトリックスでエンドツーエンドテストするな
というものに引っかかっちゃうわけですよ
そこはエンドツーエンドテストで
書くのを諦めてコンポーネントテストで
プレミアム配送オプションのときは配送Bの表示が
こうなるみたいなのを入れてあげる
逃がしてあげないといけないという意味で
ちょっとなかなか
難しい部分がある
どっちにしろはやっぱり
実行の遅さというところが
どうしても出てきてしまう
ずっと足を引っ張るということです