ChatGPTを用いたTDD part.3 (TODO実装続き)
ChatGPTを用いたTDD part.2の続きです。
TDDでTODOをこなしていきます。
次はCPUの値を抜き出すところです。
与えらえた文字列からus、sy、niを抜き出して返す
まずはテストコードを書きます。ChatGPTが。
テストデータは以下として、us,sy,niを抜き出して文字列配列で返すことを目標とします。
%Cpu(s): 16.2 us, 20.3 sy, 5.0 ni,63.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
※ChatGPT4.0だとテストコードを書いてもらおうとしてもテストコードを実行しようとするのでChatGPT3.5で書いています。
テストコードを書く
以下のプロンプトを与えました。
pythonで、以下のテストデータを与えて戻り値が["16.2","20.3","5.0"]であることを確認するテストコードを書いてください。
%Cpu(s): 16.2 us, 20.3 sy, 5.0 ni,63.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
テスト対象はget_cpu(string)とします。
また、以下importしてください。 from ModuleConvertTop import ConvertTop
さて、問題発生です。
ChatGPTが出したテストコードには問題があります。
自分で修正をしてしまいます。
修正は以下です。
このようにConvertTop()と書く必要があります。
テストコードでエラーが出た場合は厄介です。
この場合は「最短でグリーンになるコード」の実装で気づくことはできるかと思います。
もしChatGPTに直してもらうとしたら、これまで通り「エラーが出ました。テストコードを修正してください(エラー文)」でよいかとは思います。
修正したテストコードを既存のテストケースに足します。
classは別にしておきます。
最初のテスト実行(レッドの状態)
では、テストコードを実行します。
最初の2つはテストが通るはずですが、最後はメソッドがないのでレッドになるはずです。
想定通り2つ成功で1つ失敗です。
最短でグリーンになるコードを実装
では次は最短でグリーンになるコードを書きます。
コードに追加します。
テストを実行します。
テストが通りました。
詳細の実装
では詳細の実装を行っています。
ChatGPT4.0ではコードを別リンクで表示してくれたりするのですが、見やすいように画面に出してもらっています。
コードを書き換えました。
ベタベタなコードですが、まぁこうなるかと思いつつコード実行です。
リファクタリング
ちょっとしたことですが、それぞれの値を抜くindexを定数にしてもらいました。
テストを実行します。
テストが通りました。
cpuの表示は特に順番が変わったりフォーマットが変わることもないのでこれで完成です。
与えられた文字列からメモリ使用率を計算して返す
まずはテストコードからです。
テストデータは以下として、戻り値はメモリ使用率に改行文字を含めた文字列配列です。
KiB Mem : 40979980 total, 37696840 free, 1050480 used, 2232660 buff/cache
期待結果
["2.6\n"]
文字列配列にする理由は、ほかの並列するメソッドの戻り値がすべて文字列配列のため型を合わせたほうが処理しやすいためです。
テストコードを書く
以下のプロンプトを与えました。
pythonで、以下のテストデータを与えて戻り値が["2.6\n"]であることを確認するテストコードを書いてください。
KiB Mem : 40979980 total, 37696840 free, 1050480 used, 2232660 buff/cache
テスト対象はget_mem(string)とします。
また、以下importしてください。 from ModuleConvertTop import ConvertTop
get_memを呼び出すときはConvertTop()を使ってください
テストコードにクラスごと追加します。
最初のテスト実行(レッドの状態)
では、テストコードを実行します。
最初の3つはテストが通るはずですが、最後はメソッドがないのでレッドになるはずです。
予定通り、新しく追加したテストのみ失敗しました。
最短でグリーンになるコードを実装
では次は最短でグリーンになるコードを書きます。
若干要求と違うコードですが、こちらが普通はしないような要求をしているのでしかたなさそうです。
手をくわえてコードを追加します。
テスト実行をします。
無事通りました。
ちなみにChatGPTが返した通りがないとどうなるかというと、ちゃんと失敗します。
詳細の実装
詳細の実装をしていきます。
使用率を計算して返すほかにも、改行文字を入れる、有効桁数を小数第一位として四捨五入するという処理が必要そうです。
書きます。ChatGPTが。
入力プロンプトは以下です。
KiB Mem : 40979980 total, 37696840 free, 1050480 used, 2232660 buff/cache
・この文字列を受け取って、usedの値をtotalで割って%を計算してください。
・計算した答えは有効桁数は小数第一位として、小数第二位で四捨五入をしてください
・計算した答えの後ろに改行文字を加えてください。
・戻り値は計算した答えの文字列をでくくって返してください。
・クラスのメソッドなので引数にselfは入れてください
パッと見でダメそうに見えますが、get_memメソッドを変更します。
テストを行います。
ダメでした。
理由は、totalの横のfreeをとってきているからです。
修正していきます。
グリーンになるまで修正
理由が分かっているので手動で直したほうが早いですが、一回試してみます。
もし実践で試すとしたら理由がわからない場合もあるでしょう。
プロンプトは以下です。
以下のエラーが出ました。修正してください。
(エラーをはりつける)
これはテストが通りそうに見えます。試してみましょう。
無事とおりました。
テストを追加し、グリーンにする
今回のテストデータは計算後に四捨五入で小数第2位で繰り上げが発生する計算でした。
逆に四捨五入で切り捨てられる場合を考えたいと思います。
テストデータ
KiB Mem : 40979980 total, 37696840 free, 1040480 used, 2232660 buff/cache
これで期待結果は以下になります。
["2.5\n"]
テストを追加します。
最初にテストコードを書いてもらったチャットの続きから書いています。
既存のテストコードはそのままで、新しいテストコードのみを追加します。
そしてテストを実行です。
大丈夫そうですね。
に続きます。