ChatGPTを用いたTDD
作者こと私です。
本記事はソフトウェアテスト Advent Calendar 2023 4日目の記事ということで、今回はマンガではない話をします。
ChatGPTを使ってTDDを試してみます。
ネットを検索するとFizzBuzzなどばかりで面白みがないので、今回は多少使えそうなツールを作ることを目標とします。
今回はテストコードもchatGPTで作りますが、テストコードは自分で書いて、プロダクションコードをchatGPTに書いてもらうというようなTDDをを行うと、ChatGPTで意図した結果を得られるコードが書けそうでした。
この記事で書いたお題などは練習のお題としてお好きに使っていただいて構いません。
記事は本記事を含め計7本です。
ChatGPTを用いたTDD part.2 (最初の実装編)
ChatGPTを用いたTDD part.3 (TODO実装続き)
ChatGPTを用いたTDD part.5 (Integration test編)
ChatGPTを用いたTDD part.6 (最後の部品作り編)
[END]ChatGPTを用いたTDD part.7 (実行ファイル作成編)
作るもの
私は近頃仕事でtopコマンドの出力を眺めることが多いです。
topコマンドはシステムのCPU使用率やメモリを確認できるコマンドです。
1回の実行でその時の状況がわかります。
これを連続実行してCPUやメモリの変化を時間で追います。
以下は3回連続で実行させたものです。上にシステム全体のCPU使用率などが表示され、その下にプロセスごとの表示がされています。
(dockerでcentosを立ててtopコマンドを実行した結果)
私は全体傾向を追っていくことが多いです(取り扱っているモノがシステム全体のため)
今回は全体側のCPU使用率、メモリ使用率を以下のように時系列で表にするコードを書きます。
TDDの流れ
詳しい説明は他のブログに任せるとして以下のことを繰り返して進めます。
- TODOリストを書く
- TODOリストから一つ選んでテストを書く
- 全テストコードを実行させて加えたテストでレッド(エラー)を確認する
- 最短でグリーンになる実装を行う
- 全テストコードを実行させて加えたテストでグリーンを確認する
- リファクタリングする(詳細の実装、重複コードの除去など)
- 全テストコードを実行させて加えたテストを実行し結果を確認する
- 6~7を繰り返し、すべてグリーンになったら2へ戻る
TODOリストを作る
topコマンドを眺めながら、これを表にするためにはどんな機能が必要か考えます。
top - 13:52:54 up 6 min, 0 users, load average: 0.01, 0.07, 0.03
Tasks: 2 total, 1 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 16.2 us, 20.3 sy, 0.0 ni,63.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 40979980 total, 37696840 free, 1050480 used, 2232660 buff/cache
KiB Swap: 10485760 total, 10485760 free, 0 used. 39463640 avail Mem
まずは全体的な流れをイメージします。
topコマンドの実行結果(ファイル)を全部読み込んで、最終的にcsvで出力するコードにするのが一番楽そうです。csvはファイル出力ではなく画面に出力させます。
データの処理は、全部読み込まれたファイルを1行1行の文字列に分解してそれぞれの行ごとに必要なデータを抜いていくのがよさそうです。
ここまでで以下の部品(メソッド)を作るTODOがありそうです。
ファイルを読み込み、1行1行に分解して出力する
ファイル名を受け取り、内容を改行コードで切って文字列配列にして返す
csvにして画面出力を行う
与えられた文字列をcsv形式にしてprint出力する。
続いて必要になるであろう細かい部品を考えていきます。
`top`の行のときは、時刻とup time(起動時間)が欲しいです。
`%Cpu(s)`の行のときは、usとsyとniの値が欲しいです。
`KiB Mem`の行のときは、usedをtotalで割って%にした値が欲しいです。
どうやら何の行か判定して、その行に応じた抜き出しの処理がありそうです。
すべてを一緒にすると大変なメソッドになりそうなので、「判定する部分」「それぞれのデータを抜き出す部分」にわけていきましょう。
与えられた文字列から時刻とup_timeを抜き出して返す
文字列を引数として、時刻、up_timeを文字列配列にして返す
与えらえた文字列からus、sy、niを抜き出して返す
文字列を引数として、us、sy、niを文字列配列にして返す
与えられた文字列からメモリ使用率を計算して返す
文字列を引数として、used/total*100を計算し、改行文字を入れて文字列配列にして返す
top,cpu,memを判別してそれぞれのデータを返す
文字列の先頭がtopだった場合、topに対応するメソッドを呼び出し戻り値を返す 文字列の先頭が%Cpu(s)だった場合、cpuに対応するメソッドを呼び出し戻り値を返す
文字列の先頭がKiB Memだった場合、memに対応するメソッドを呼び出し戻り値を返す
処理するには戻り値の型が同じほうが都合がよいので、すべて文字列配列で返すことにします。
また、メモリの処理が終わった時点で改行コードを入れます。
csvでの出力を考えたとき、メモリの値で表の1行が終わりだからです。
最後に、ファイルから読み込んだ文章(1行1行にわかれた配列)をloopで1行1行処理して、全部のデータを収集する部分が必要です。
文章全体のデータを収集して、集めたデータを返す
文字列配列を引数として、全配列から集めた文字列配列データをextendして返す
全体のイメージは以下。
topコマンドの出力ファイルを読み込む→1行ずつ処理してデータを文字列配列で集める→最後に文字列配列をカンマで結合して出力
TODOは以下。
今回は自分でTODOを考えてみましたが、これをChatGPTに考えてもらった結果が以下です。大枠は一緒ですね。
TDD実践
ChatGPTを用いたTDD part.2に続きます。