2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
リンクをコピー
記事をブックマーク
中村圭助氏:「単体テストのスケルトンコードを自動生成するツールを作った/現在機能拡張している話」をします。よろしくお願いします。
まずは、自己紹介です。n9te9って呼ばれています。本名は、中村圭助です。好きな標準パッケージは、syncパッケージであったり、net/httpパッケージです。
DMM.comに2022年度、新卒入社しました。今は、Developer Productivity Groupの横断チームに所属しています。そのほか、社内とか社外での活動として、「DMM.go」の運営をやっていたり、「Go Conference 2024」の運営をやっています。
本セッションの構成です。まずは、ツールの概要で、どのようなものかを知ってもらって、テストカバレッジの話に移ります。テストカバレッジを満たすために必要なテスト数の洗い出しをどうやっているのかとか、スケルトンコードの出力という部分を話していきます。
今、機能開発しているgomockのEXPECT().Return()の課題点とか、テスト対象の関数が依存するgomockのinterfaceを自動生成する部分とか、gomockをベースにした話をしていきます。
本セッションでは、gomockの設計思想とかコードの自動生成について学べるようになっていると思います。
ツールの概要です。「go install」でインストールできるようになっていて、コマンドで自動的にコードを生成できるようになっています。興味のある人は、実際に試してみてください。
実際に自動生成されたコードですけど、(スライドを示して)このように、テストケースドリブンで実装されたコードが出力されます。
ここからは、テストカバレッジの話に入っていきます。まず、テストカバレッジを満たすために必要なテストケース数を考えます。
必要なテストケース数を考える場合は、だいたいロジックが分岐する時にテストケースが増えると考えます。例えばifとかelse、elseifとか、switch文のケースが増えた時に、テストカバレッジを満たすために必要なテストケース数が増えるという認識を持てばいいと思います。
具体的なコードで話します。HasHogeで関数が実装されていると、まず、必要なテストケース数は、if/else/elseif文の数+1と考えて、例えば、引数のstrsに「hoge」という文字列のスライスを渡した時に、(スライドを示して)このようにテストカバレッジがカバーされます。
次に、(スライドを示して)この赤の部分をカバーしたい場合は、「piyo」のスライスを渡せば全体がカバーされます。
次にswitch文ですけど、「v = 3」のテストをした時、「fmt.Println("C")」だけカバーされます。
ほかにも、例えば「v = 50」とか「v = 90」のテストを追加すると、(スライドの)赤の部分がカバーされて緑色になります。
ここで、テストカバレッジを満たすために必要なテストケース数を洗い出すにはどうすればいいかですけど、関数とかメソッド単位で、if/else/else-if文とか、switchのcase文を数え上げれば良いです。
どうすればいいかというと、関数の実装をASTから解析すればいいです。ASTは、木構造のデータ構造になっているので、グラフで表すと、(スライドを示して)このようになります。
BlockStmtの中に、ListでStmtのスライスが入っていて、その中に、if/elseとか、SwitchStmtがあるので、このあたりを再帰的に実行して、必要なテストケース数を数え上げればいいです。
(スライドを示して)これは、僕が作ったOSSですが、関数単位で必要なテストケース数を出力してくれるツールがあります。
これも「go install」で実行できて、このように関数ごとに必要なテストケース数を出力してくれます。
必要なテストケース数の話は終わったので、スケルトンコードというか、Goのコードの自動生成部分について考えていきます。
まず、「ASTって何?」というところから考えていきます。ASTは、Goのコードをプログラム上で扱えるようにしたデータ構造です。つまり、ASTとGoのプログラムのコードは等価であると考えられます。そのためGoとASTは、双方向に変換が可能です。
つまり、スケルトンコードは、テストコードのASTさえ作ってしまえばGoのコードとして吐き出すことができます。(スライドを示して)ここでは、テストケースの構造体を定義するASTを作るコードになっています。このように、データ構造を定義するだけなので、ここの部分は宣言的に書けるようになっています。
先ほどのテストケースをループするASTも作成しないといけないので、RangeStmtみたいなかたちでループの文を作っています。
ループの文の中に、呼び出す関数のASTも定義しないといけないので、その中にあるBodyという要素に、呼び出す関数を生成するASTの定義をしています。
その中の関数で、実行する無名関数も実装しないといけないので、無名関数の引数とか、どういう型定義をするのかというところを実装しています。(スライドを示して)ここの部分はけっこう長くなっています。
無名関数の中身を実装しないといけないので、Bodyで実装しています。これはスケルトンコードなので、fmt.Printlnで「write your unit test」というかたちで実装するASTがここの部分で作られています。
先ほど定義されたASTをベースにこのコードで出力すると、こういうテストのスケルトンコードが出力されます。
ここまでは、スケルトンコードの話をしたので、今、僕が実際にやっている機能拡張について話していきます。
(次回へつづく)
関連タグ:
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05