2024.10.10
将来は卵1パックの価格が2倍に? 多くの日本人が知らない世界の新潮流、「動物福祉」とは
リンクをコピー
記事をブックマーク
中村圭助氏:「単体テストのスケルトンコードを自動生成するツールを作った/現在機能拡張している話」をします。よろしくお願いします。
まずは、自己紹介です。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.11.13
週3日働いて年収2,000万稼ぐ元印刷屋のおじさん 好きなことだけして楽に稼ぐ3つのパターン
2024.11.11
自分の「本質的な才能」が見つかる一番簡単な質問 他者から「すごい」と思われても意外と気づかないのが才能
2024.11.13
“退職者が出た時の会社の対応”を従業員は見ている 離職防止策の前に見つめ直したい、部下との向き合い方
2024.11.12
自分の人生にプラスに働く「イライラ」は才能 自分の強みや才能につながる“良いイライラ”を見分けるポイント
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.11.11
気づいたら借金、倒産して身ぐるみを剥がされる経営者 起業に「立派な動機」を求められる恐ろしさ
2024.11.11
「退職代行」を使われた管理職の本音と葛藤 メディアで話題、利用者が右肩上がり…企業が置かれている現状とは
2024.11.18
20名の会社でGoogleの採用を真似するのはもったいない 人手不足の時代における「脱能力主義」のヒント
2024.11.12
先週まで元気だったのに、突然辞める「びっくり退職」 退職代行サービスの影響も?上司と部下の“すれ違い”が起きる原因
2024.11.14
よってたかってハイリスクのビジネスモデルに仕立て上げるステークホルダー 「社会的理由」が求められる時代の起業戦略
2024.11.13
週3日働いて年収2,000万稼ぐ元印刷屋のおじさん 好きなことだけして楽に稼ぐ3つのパターン
2024.11.11
自分の「本質的な才能」が見つかる一番簡単な質問 他者から「すごい」と思われても意外と気づかないのが才能
2024.11.13
“退職者が出た時の会社の対応”を従業員は見ている 離職防止策の前に見つめ直したい、部下との向き合い方
2024.11.12
自分の人生にプラスに働く「イライラ」は才能 自分の強みや才能につながる“良いイライラ”を見分けるポイント
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.11.11
気づいたら借金、倒産して身ぐるみを剥がされる経営者 起業に「立派な動機」を求められる恐ろしさ
2024.11.11
「退職代行」を使われた管理職の本音と葛藤 メディアで話題、利用者が右肩上がり…企業が置かれている現状とは
2024.11.18
20名の会社でGoogleの採用を真似するのはもったいない 人手不足の時代における「脱能力主義」のヒント
2024.11.12
先週まで元気だったのに、突然辞める「びっくり退職」 退職代行サービスの影響も?上司と部下の“すれ違い”が起きる原因
2024.11.14
よってたかってハイリスクのビジネスモデルに仕立て上げるステークホルダー 「社会的理由」が求められる時代の起業戦略