ChatGPTを用いたTDD part.6 (最後の部品作り編)
ChatGPTを用いたTDD part.5の続きです。
今回で作る部品がすべて完成します。
まずはcsvにするメソッドを作ります。
csvにして画面出力を行う
最初このように書いたのですが画面出力にしてしまうとテストが大変です。
これから作るメソッドは、文字列配列を受け取ったらカンマで結合して、その文字列を返すメソッドにします。
なのでTODOを書き換えます。
テストデータは以下です。
["13:52:54","00:06","16.2","20.3","5.0","2.6\n","13:52:54","00:06","16.2","20.3","5.0","2.6\n"]
期待結果は以下です。
"13:52:54,00:06,16.2,20.3,5.0,2.6\n13:52:54,00:06,16.2,20.3,5.0,2.6\n"
テストコードを書く
以下のプロンプトを与えました。
pythonでconvert_csv(string_array)をテストするテストコードを書いてください。
テストデータは以下です。
["13:52:54","00:06","16.2","20.3","5.0","2.6\n","13:52:54","00:06","16.2","20.3","5.0","2.6\n"]
期待結果は以下です。
"13:52:54,00:06,16.2,20.3,5.0,2.6\n13:52:54,00:06,16.2,20.3,5.0,2.6\n"
以下をimportして使ってください。
from ModuleConvertTop import ConvertTop
例のごとくConvertTop()になっていないので、修正してclassごと貼り付けます。
テストを実行しレッドを確認する
これまでのテストはすべて通っていて、新しく追加したところだけエラーになるはずです。
テストを実行します。
最後に追加したところがエラーで、それ以外はすべてグリーンであることが確認できました。
最短でグリーンになるコードを実装
では次は最短でグリーンになるコードを書きます。
与えたプロンプトは以下です。
任意の文字列を引数として、固定で"13:52:54,00:06,16.2,20.3,5.0,2.6\n13:52:54,00:06,16.2,20.3,5.0,2.6\n"を返すconvert_csv(string_array)メソッドを書いてください。 classのメソッドなのでselfを入れてください。
では、これを追加します。
テスト実行してみます。
テストがグリーンとなりました。
詳細の実装
では詳細を実装していきます。
与えたプロンプトは以下です。
pythonで、文字列配列を入力したときにそれらの文字列をカンマで結合するconvert_csv(string_array)メソッドを書いてください。
ただし、改行文字の後にはカンマを入れないでください。
では先ほどグリーンになったコードを書き換えます。
テストを実行してみます。
エラーが出ました。
テストがグリーンになるまで修正を続ける
以下のようにエラーだけを伝えてコード修正をしていきます。
以下のエラーが出ました。修正してください。
(エラー文)
そしたら修正されたコードを張り付けて、またテストを実行します。
無事グリーンとなりました。
ここはこんな処理をせずとも、カンマでjoinした後に"\n,"を"\n"でreplaceしたほうがよいでしょうね。
今回はChatGPTで作るのが趣旨ですのでやめておきます。
オールグリーンですので、最後のTODOに移ります。
ファイルを読み込み、1行1行に分解して出力する
最後です。定番中の定番の機能です。
ファイル名を受け取って、そのファイルを開いて、中の文字列を1行ずつの文字列配列にして返すメソッドです。
テストデータは以下です。ファイル名です。
test_file.txt
期待結果はこのような感じにしておきましょうか。
["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, 5.0 ni,63.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st"]
テストコードを書く
以下のプロンプトを与えました。
pythonでread_file(file_name)をテストするテストコードを書いてください。
テストデータは以下です。
test_file.txt
期待結果は以下です。
["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, 5.0 ni,63.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st"]
以下をimportして使ってください。
from ModuleConvertTop import ConvertTop
例のごとくConvertTop()になってないので修正して貼り付けます。
テストを実行しレッドを確認する
これまでのテストはすべて通っていて、新しく追加したところだけエラーになるはずです。
テストを実行します。
失敗したけどここでおかしなことに気づきます。
テストの数が"8"に減っています。
さっきまで12でした。
確認します。
見つけました。
class名の被りが発生していました。
なので追加したファイルのクラス名を"TestReadFile"に変更します。
テストを実行します。
無事、既存の12個が成功し、最後の1つのテストだけが失敗しました。
最初にレッドを出すのが面倒ですが、テストケースの被りといったテスト以前の問題を発見できます。
最短でグリーンになるコードを実装
では次は最短でグリーンになるコードを書きます。
与えたプロンプトは以下です。
任意の文字列を引数として、固定で以下を返すread_file(file_name)メソッドを書いてください。 classのメソッドなのでselfを入れてください。
[ "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, 5.0 ni,63.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st"]
コードを追加します。
テストを実行してみます。
まさかの失敗をしました。
どうやら63.5の前のスペースの有無のようです。
chatGPTを通したのでこうした問題が発生したのでしょう。今張り付けたコード側のスペースを削って修正します。
テストを実行します。
グリーンになりました。
詳細の実装をする
では、詳細の実装をします。その前にテストに使うtest_file.txtを作ってしまいます。
chatGPTには以下のプロンプトを与えます。
ファイル名を受け取って、ファイルを読み込み、各行ごとに分けて文字列配列にして返すread_file(file_name)メソッドを書いてください。
classのメソッドなのでselfを入れてください。
先ほどグリーンになったコードを書き換えます。
テストを実行します。
テストが失敗しました。
テストがグリーンになるまで修正を行う
どうやら改行文字が含まれることが原因のようです。
とはいえ、そのままChatGPTにエラーを投げましょう
プロンプトは以下です。
以下のエラーが出ました。修正してください。
(エラー文)
コードを書き換えます。
テストを実行します。
無事グリーンとなりました。
エラー時のテストを追加する
このコードのエラー時の動作をテストしておきます。
以下のプロンプトを与えました。
以下のコードのexcept発生時の確認を行うテストコードを書いてください。
以下をimportして使ってください。
from ModuleConvertTop import ConvertTopdef read_file(self, file_name):
try:
with open(file_name, 'r') as file:
return [line.strip() for line in file.readlines()]
except FileNotFoundError:
return ["Error: File not found."]
except Exception as e:
return [f"Error: {e}"]
テストはひとつずつ既存のclassに加えていきます。
まずはsetUpを追加して、既存のread_fileのテストをそれに合わせます。
修正しました。
テストを実行してみます。
グリーンです。
次のテストを追加する準備ができました。
-------------------------------------------------
テストを追加します。
そしてテスト実行します。
ファイルがない場合も意図通り動作していそうです。
-------------------------------------------------
テストを追加します。
そしてテスト実行します。
例外時の挙動も意図通りのようです。
いまさらですが、既存のプロダクションコードに対する「テスト追加」はTDDではありません。
後追いのテストです。
これで実装したいことがすべて終わりました。
最後は、以下のことを行う処理を作ります。
- コマンドプロンプトで実行し、第一引数をファイル名とする
- read_fileでファイルを読み込む
- エラーがあったらプログラムを終了させる
- 読み込んだファイルの内容をget_top_allに渡す
- get_top_allの戻り値をconvert_csvに渡す
- ラベル部分を出力する
- convert_csvの戻り値を出力する
に続きます。