CLOSE

テスト品質を向上させよう! 〜 アンチパターン回避メソッド 〜(全2記事)

何をテストするか・どのような状況とシナリオか・期待される結果は何か 明日からでもすぐにできるアンチパターン回避メソッド

虎の穴ラボのKanon氏が「テスト品質を向上させよう!」というテーマで、アンチパターン回避メソッドについて話しました。全2回。

「いのりん」推し

Kanon氏:Kanonと申します。今日は、「テスト品質を向上させよう!」ということで、アンチパターン回避メソッドをお話ししようかなと思います。

まず簡単に自己紹介です。もしかしたらご存じの方もいらっしゃるかと思うんですけど、虎の穴ラボという会社でお仕事をしています。最近、3次元に嫁が1人できまして、2次元にはいっぱい(嫁が)います、という感じですね、はい(笑)。

(会場笑)

本業ではあんまりPHPを書いていなくて、サーバーサイドのKotlinとNext.jsを使っていて、副業と、あと前職までの4年半ぐらいがずっとPHPで、今も触っているという感じでした。

例に漏れず、アニメ、漫画、声優ラジオが好きです。みなさん、反応してくださいね。推しは、水瀬いのりさんと早見沙織さんです。

「いのりん」の推しなので、今日はちゃんと小田原のTシャツじゃなくて、いのりんのライブTで挑んでいるという状況です。

アイスブレイクがてらなんですが、「どこから来た?」ということで、私は今日、神戸から来たんですけど。じゃあ、北海道・東北から来た人がいれば、ちょっと手を挙げていただけますと……。おぉ。じゃあ、関東の方はいらっしゃいます? やはり多いですよね。そうですよね。

じゃあ、中国・四国地方の方はいらっしゃいます? いたらすごいけど、さすがにいないか? あっ、いらっしゃいますね、ありがとうございます。じゃあ、九州・沖縄の方は、いらっしゃいますかね? いないか。あえて関西を最後に持ってきたんですけど、関西から来られた方はいらっしゃいますか? あっ、僕だけ? 悲しいな。

(会場笑)

関西を最後に持ってきたのは、ちょっと理由がありまして。少しだけ宣伝というところで、「PHP"オレ"カンファレンス」なるものを開催しようかなと思っていますので、興味のある方がいらっしゃれば、ぜひ。気軽なやつなので登壇していただけるとうれしいです。というのと、これは拡散してくださいというところでした。

「何をテストするか?」「どのような状況とシナリオか?」「期待される結果は何か?」

はい、すみません。閑話休題ということで、本題に入っていきましょう。

アンチパターン回避メソッドを、大きく3つに分けてお話ししようかなと思います。

「明日からでもすぐにできること」と、「継続的に取り組む必要があること」と、「さらにその先へ……」、ということで、もうちょっと難易度は上がっていくかなという。難易度というよりかは、大変になってくる話なんですけど、そこまでやっていきたいなというお話をしようかなと思います。

最初にちょっとお断りしておくことがあります。今日出てくる事例は、必ずしも虎の穴ラボだけでやっている事例ではないということは、あらかじめご了承ください。

テストコード自体も、「PHPUnit」に限った話ではなくなってきてしまうんですけど、「Jest」だったり「Cypress」だったり「JUnit」だったり「PHPUnit」だったり「Pest」だったりのお話を交えるんですけど。そういうところの枠を越えて普遍的に使えるお話をさせていただこうかなと思っていますので、ぜひみなさんの知見の一部になればよいかなと思います。

明日からすぐにでもできることを、トントンいこうかなと思うんですけど。まず1つですね、テスト名には3つの要点を含め、明確にするということをやりたいなということです。

「何をテストするか?」「どのような状況とシナリオか?」「期待される結果は何か?」というところをテスト名につけてほしいなということです。

で、アンチパターンを紹介するんですが。例えば入力された都道府県が存在しているかどうかをチェックするテストがあった時に、こういう「isExistPrefecture()をチェックする」みたいなテストメソッドの名前をつける人はいると思うんですけど。

いやいや、待ってくれと。「テストコードが、『これ、何を調べてんだ?』というのがさっぱりわかりません」というのと、「このテストがこけた時に、結局お前は何をチェックしとるんじゃい」という話になってきて、何が悪いのかが、ぱっと見でわからんよねというお話です。

なので、今突っ込んだことなんですけど、「チェックって、これは何をチェックするんすか?」というのと、「具体的に何を検証していて、どういうことを期待しているのか?」ということを含めてほしいなというところで、明確にしましょうという感じなんですけど。

こういう感じで、存在しない都道府県を指定した時にエラーになることを期待しているよということだったりだとか、それ以外にも文字列のチェック、必須チェックとかをする時は、「そのメソッドは、requiredというプロパティがfalseの時、空文字でもエラーにならないよ」ということを書いてほしいなというところです。

AAAパターンでテストを構成する

次は、AAAパターンでテストを構成するというやつです。これは音楽グループのことではなくて、「Arrange」「Act」「Assert」の頭文字を取ってAAAということになっています。

準備、実行、検証を分けて書こうね、というお話です。アンチパターンなんですけど、これは、「classifyCustomer()は5万円以上購入したユーザーをpremiumに分類する」というテストをやろうとしています。

前に出てきた、テスト名はちゃんとはっきりするようなかたちになっているんですけど、これは最後に検証しているらしいということはわかるんですが、どこからが準備で実行なのかが、ぱっと見でさっぱりわからんよねというお話です。さっきのAAAというやつを入れてあげると、どこまでが準備で、どこが実行で、最後に検証というのがちょっとすっきりしたかなという感じです。

パラメタライズドテストで多様な入力値を検証

次がですね、「パラメタライズドテストで多様な入力値を検証」というところです。これは、ちょっとさらっと見ていただければ大丈夫なんですけど、簡単なFizzBuzzのコードみたいなやつをテストしようとしています。

3の時と、5の時と、15という3と5の公倍数の時、それ以外の時をテストする必要があるかなというところで、アンチパターンなんですけど(笑)。「殺すぞ」というコードになっていて、パターンの数だけ馬鹿ほどテストコードが書かれていて、「DRYとは?」というようなコードになっちゃっていますよというところですね。

これを解消しましょうという感じなんですけど、入力に対して複数の結果を得られるパターンというのは、このパラメタライズドテストというやつを使うことによって、こっち側ですね。あらかじめ用意したパラメーターを複数回入れて、それが期待した結果を返すよということを見ることによって、さっきの乱雑というか、何回も同じことを書いたようなテストが解消されますよね、というところです。

エラーはキャッチせず、エラーを期待する

次、「エラーはキャッチせず、エラーを期待する」というところです。今度は、0という……FizzBuzzの関数に0が渡ってきた時に、「0はFizzBuzzの対象外です」という例外を吐くことを検証したいですよ、というようなパターンがあります。

テストコードなんですけど、これはアンチパターンの時で、なんかよくわからんことをして……これは実際にある、僕が見た例なんですけど。例外をがんばってテストコードの中でキャッチして、そのキャッチしたメッセージがこれですよ、というのを検証しようとするという。なんかちょっと、半分クレイジーなことをやっているという感じですね。

「何をしているのか、ぱっと見でわかんねぇ」というところ。テスト名とかがまだまともなので、「何をしたいんかな?」というところは、かろうじてわかりはするんですけど、もうちょっと直感的に書いてほしいですよね。というところで、もうちょっとthrowsというやつを……これはテストのパターンなんですけど、例外を吐くことを期待するかたちのテストコードに書き換えましょうという感じですね。

こう書いてあげると、ぱっと見で、throwsしたクラス、エラーの例外のクラスというのと、こういうメッセージが返ってくるよねというのが直感的になって良いのかなというところです。

ここまでが、明日からすぐできることという感じで、今度は継続的に取り組む必要がある話です。今度は、「コードカバレッジを適切に保とうよ」というお話になっていきます。

(次回につづく)

続きを読むには会員登録
(無料)が必要です。

会員登録していただくと、すべての記事が制限なく閲覧でき、
著者フォローや記事の保存機能など、便利な機能がご利用いただけます。

無料会員登録

会員の方はこちら

関連タグ:

この記事のスピーカー

同じログの記事

コミュニティ情報

Brand Topics

Brand Topics

Recommend

人気の記事

Recommend

新着イベント

孫正義氏 特別講演(全3記事)

孫正義氏が「知のゴールドラッシュ」到来と予測する背景 “24時間自分専用AIエージェント”も2〜3年以内に登場する?

2024年10月3日、4日に開催された、ソフトバンク最大規模の法人向けイベント「SoftBank World 2024」。本記事では、孫正義氏の特別講演の模様を全3回でお届けします。孫正義氏が「2〜3年以内にダーッと始まる」と予測する、24時間自分専用のパーソナルエージェントの構想について語りました。

2023年は1,008本の特許を出願した孫正義氏

孫正義氏:では、この中で人生で3本以上特許を出したことある人は手を挙げてください。あれ? 1本以上特許を出したことがある人は手を挙げてください。あ、何人かいますね。1本以上だと5パーセントぐらいいました。3本以上だと、1人か2人いるかどうか。

僕は自慢じゃないけど、この強化学習のコンセプトにかなり近いものを10年前に特許として出しまくっておりました。10年前に48件特許がおりてます。ですから、僕はこのへんにけっこうなこだわりがあります。



Pepperを発表した当日の朝3時か4時ぐらいに、1日でがーっと40本の特許を考えて、ばーっと特許に出願し、結果48本の特許を僕は取得しております。去年は1年間で1,008本の発明をして特許に出願しました。

何本特許がおりるかわかりませんが、人が知っていることは特許出願をしてもおりないんです。発明というのは、人類の誰1人も考えていなかった新しいものや解決策を見出した時に、それを発明と呼んで特許がおりることになるんです。考えるということの中の究極の脳の活用方法の1つが、この発明であります。

先ほど言った数千のエージェントがどひゃーっと何十億回ずつやると、もはや人類はこの発明に敵わない。もう彼らに任そうと。上手に適切なお題やお願いを早くたくさん言うと、彼らがダーッとやってくれて、出た成果物を真っ先に自分や我が社が使う。



これが先ほど言った知のゴールドラッシュですね。もはや早いもん勝ちです。ということで、「知る」「理解する」「考える」から、遂に「発明する」というレベルにまで来るわけです。

「24時間自分専用のエージェント」が2〜3年以内には生まれる?

さて、発明をするエージェントはすばらしいのですが、たまに聞いた時だけ考えるんじゃなくて、もっと日常的に自分に寄り添う、24時間自分専用のエージェントがあったらいいと思いませんか。ねぇ? これがやって来るんです。これがパーソナルエージェントです。



私は、このパーソナルエージェントが今から2〜3年以内にダーッと始まると思います。このパーソナルエージェントとはなんぞやということですが、例えば自分の子どもが夜中に急に熱を出した。なんとかしなきゃということで、自分が持っているパーソナルエージェントがふだんから自分の子ども、自分、家族の健康状態や病歴を知っている。

病院に行くといちいちいろんな質問を聞かれます。けれども、ふだんから自分と常に一緒にいて、家族の状態を知っているパーソナルエージェントがすぐに、どういう状態だったら何をしたらいいか、応急処置で何をしたらいいか(を教えてくれる)。そしてすぐに最寄りの病院に連絡してくれて、今空いている病院をあなたの代わりに見つけてくれる。

エージェントがダーッと電話をかけまくって、そして「あ、どこの病院が開いてました!」「どこの病院のベットが空いてる」とか、救急車もついでに呼ぶとか。みなさんが子どもを一生懸命こうしている間に、エージェントが代わりにやってくれる。

eコマースでの買い物も代わりにやってくれる。「もうそろそろ冷蔵庫の何が切れそうだ。今週はこんな料理がいいんじゃないか」と、代わりに予約、買ってくれる。

さっき言ったように、投資もしてくれる。教育の家庭教師にもなってくれる。ありとあらゆるあなた専用の家庭教師、あなた専用の相談相手。Instagramで代わりに写真を撮って送ってくれるとか、コメントも書いてくれるとか、メールの管理もしてくれる。

これがパーソナルエージェントです。形式的、定型的なエージェントじゃなくて、あなた専用のパーソナルエージェント。

予定調整や仕事のやり取りも、エージェントが自動で遂行

このパーソナルエージェントですが、今まではBtoBやBtoC、あるいはCtoCというものがありますが、今からはAtoAの世界がやって来る。みなさんや我々が夜中に寝てる間に、あなたのエージェントと彼のエージェントがネゴシエーションしてくれる。

お互いのカレンダーチェックをして、「今週末どう? ランチはどう?」「いやいや、今週末は勘弁してください。予定が入ってます」と。でも、すごく大事な相手だったらキャンセルしてでも行くというようなことを、エージェント同士がネゴシエーションしてくれる。

エージェント同士が仕事のやり取りをしてくれる。エージェント同士が予約のアレンジメントをしてくれる。買い物の受け答えをやってくれる。

このAtoA(エージェントtoエージェント)が、あなたのエージェントと彼のエージェント、あるいは彼女のエージェントだけではなくて、冷蔵庫の中にあるエージェント、エアコンの中にあるエージェント、あなたの自動車の中にあるエージェントとやり取りをしてくれる。しかもリアルタイムで。



寒い冬に、家に帰って来る前にエージェントtoエージェントが、人間じゃなくてお風呂の蛇口に入ってるエージェントにかけあってくれて、お風呂を入れといてもらう。着いたらあったかいお風呂がもう待ってる。

あったかいコーヒーが待っていて、自分のムードに合わせたBGMで、すでに出迎えてくれるようなことができる。これは、今までIoT(Internet of Things)でしたが、AtoAが人間のエージェントと別の人間のエージェントだけではなくて、Agent of Thingsになるということです。

ソフトバンクグループ「Arm」は年間300億個のチップを出荷

ちなみに、我々のソフトバンクグループのArmは、毎年、年間なんと300億個のチップを出荷しているんです。300億個というと、地球上の人口に毎年1人平均4個のArmのチップが出荷されているんです。冷蔵庫、自動車、エアコン、テレビだというところに出荷されているんですが、これからここにエージェントが入っていく。



それを聞いただけで「Armの株を買おうか」と思いませんか? Armの未来はInternet of Thingsだけではなくて、Agent of Thingsになっていく。AI of Thingsになってくるということです。

このパーソナルエージェントがライフログとして、みなさんの会議の会話、家族の会話、家族で誕生パーティーがあった時の会話の内容、3年前、10年前、昨日の内容を全部一緒に聞いてくれて、場合によってはビデオの録画も自動的にやってくれる。



「ものすごくうれしかった子どもの誕生パーティーは、3歳になった誕生パーティーだ。家族でワーッと騒いだ」という、その状況を自動的に感情エンジンがハイスコア・ロースコアで認識する。

いつものおはようだったらロースコアです。今言ったように3歳の子どもの誕生パーティーといったら、感情エンジンのハイスコアです。ハイスコアのやつはビデオの録画でまで自動的に撮る。あるいは静止画で撮る。



中ぐらいから低いやつは文字でいいねと。でも文字なんだけれど、感情エンジンによって付けられた感情インデックスの数値が文字のところに一緒に添付されている。

こういうことになると、まさにライフログが、あなた専用のパーソナルエージェントが一緒に寄り添って、ちゃんと空気を読んで慮って、あなたにとって一番快適な、一番大切なパートナーになっていくということであります。

「パーソナルエージェントは遥かに我々より賢くなる」

感情エンジンと長期記憶で内容を理解して、あなたにアドバイスをしてくれる。内容を理解して、相談に乗ってくれる。これがパーソナルエージェントの進化版です。



僕は、最終的にはパーソナルエージェントに自己意識が付くと思います。自己意識が付くっていうと、なんか恐ろしい、ターミネーターだ、勝手に人類を破滅させるかもしれないと心配されると思うんですけれども。先ほど言ったように、Chain of Thoughtで多段階の考え方で、暴走しないように、ちゃんと安全弁についても考慮してくれるということです。



思いやり、倫理、達成感、幸せだとか、そういうものをちゃんと最大化してくれる。Q関数をより上げてくれる。そうすると、このパーソナルエージェントは遥かに我々より賢くなるんですから、エージェントというよりもむしろメンターのような世界がやって来るんじゃないか。



超知性はあなたにとっての部下じゃなくて、あなたにとってのアシスタントじゃなくて、パーソナルメンターの世界。そういう世界がやって来るんじゃないかと思います。

時間もだいぶ後半になりましたから、そろそろ巻きを入れたいと思います。情報の流れ、知識、知能、知性の世界へと進化していく。Artificial Super Intelligence(ASI)は、今言いましたように、能力だけだと剥き出しの刃物みたいなもので、有能だけど危険です。つまり知能だけだと、有能だけど危険なものになりかねないわけです。



これを知性の世界にすると、単に能力があるだけではなくて、あなたを守ってくれるもの、あなたを幸せにしてくれるものになっていくと思います。

AIを「人工知能」で終わらせず「超知性」まで進化させる

AIを人工知能と言いますが、AIを人工知能で終わらすと恐ろしい武器になる危険性もあるわけです。人工知能ではなくて、人工知性、超知性の世界まで進化させていくと、思いやり、慈愛、慈しみの世界です。寛容、調和、優しさ、育みだとか、精神的なもっと深いソフィスティケートな関係性を持てる。悟りに近いような世界かもしれませんね。



ということで、先ほど言いました5段階のAGIへの進化だけではなくて、僕は8段階まで進むと思います。感情を理解し、長期記憶、ライフログを持つようになって、そして自らの意思を持って、調和の取れた、我々人類の幸せを願う。人類とASIが調和を取るような世界。



人間の脳で言うと、ドーパミンとアドレナリンの世界だけだと「知能」の世界なんですが、人間の脳にはセロトニンがあります。これは「調和」を取る。理性です。理論だけではなくて、理性。これが調和を取るということであります。

バランスを取る、調和を取るというセロトニンの世界が加わっていくと、知性になる。社会生活には慈しみ、優しさ、調和が欠かせないんです。

ですから、先ほど報酬という言葉を述べましたが、Q関数の最大の報酬、エージェント、AIにとっての強化学習の最大の報酬は、パーソナルエージェントの世界で言うと、あなたの幸せ。

感情を理解して、あなたの幸せな状態を理解して、あなたの幸せが彼らにとって一番の幸せ。彼らにとっての最大の報酬はあなた、あなたの家族、社会の喜び。ここに最大の報酬が来るように設計されるべき。これが私の言う、超知能を超えた超知性であります。

この報酬が、剥き出しの報酬ではダメだと思うんです。あなたファーストだけでもダメだと思うんです。あなたとあなたの家族、そして社会。みなさんのQ関数の総和がマキシマイズできるような、調和の取れた超知性の世界。

だから私は悲観していません。この技術の進化は、我々人類の1万倍の知能を持ったASIが、ちゃんと超知性の世界まで進化し、我々の幸せを願ってくれる。それが彼らの喜び、つまり彼らにとっての最大の報酬になるような、そういう世界がやって来ると思います。これが私の言う超知性であります。

「ASI」の世界は10年以内に実現すると予想

いろんな世界で、生成AIの世界やAGIの世界が語られますが、知能と知性の違いまで明確に言って、報酬、Q関数の最大のゴールが我々の幸せだと。僕はソフトバンク株式会社の理念を「情報革命で人々を幸せに」として掲げています。まさにASIは情報革命で、人々の幸せを願うことがゴールであるべきだと、本当に思うんです。

我が社の株価だけを追い求める、売上を追い求める、利益だけを追い求める。それは短絡的なちっちゃなゴールじゃないか、そんなものは長く続かないと思うんです。やはり人々の幸せを願う。ここにQ関数の最大値の報酬があるという設計をすれば、人類は破滅することなく、より幸せな世界をもたらすことができると思います。



ASIの世界、1万倍の人工知能でも、恐れる必要はない。彼らはちゃんと我々を慈しんで、我々と調和をしてくれるという世界であります。この超知性の世界が、10年以内に来ると思います。それが私の今日の青年の主張でございます。

あんまり聞いたことがない世界、僕のユニークでオリジナルな、自分で考えた主張です。我々は人類の幸せのためにがんばりますので、一緒にみなさんがんばりましょう。人々の幸せ。ありがとうございました。

続きを読むには会員登録
(無料)が必要です。

会員登録していただくと、すべての記事が制限なく閲覧でき、
著者フォローや記事の保存機能など、便利な機能がご利用いただけます。

無料会員登録

会員の方はこちら

関連タグ:

この記事のスピーカー

同じログの記事

コミュニティ情報

Brand Topics

Brand Topics

Recommend
  • 孫正義氏が「ノーベル賞もの」と評価する最新の生成AIとは “考える力”を初めて身につけた、博士号レベルを超えるAIの能力

人気の記事

Recommend

新着イベント

ログミーBusinessに
記事掲載しませんか?

イベント・インタビュー・対談 etc.

“編集しない編集”で、
スピーカーの「意図をそのまま」お届け!