テスターちゃん【4コマ漫画】

ソフトウェアテストの用語、やり方などを4コマ漫画でわかりやすく説明する(予定の)ブログです。脱線も多いです。



【END】ChatGPTを用いたTDD part.7 (実行ファイル作成編)

[END]ChatGPTを用いたTDD part.7 (実行ファイル作成編)

ChatGPTを用いたTDD part.6の続きです。

 

 

実行できるコードを作る

必要な部品をすべて作りました。

最後はコマンドプロンプト(terminal)で実行できるようにします。

イメージは以下です。

  1. コマンドプロンプトで実行し、第一引数をファイル名とする
  2. read_fileでファイルを読み込む
  3. 配列の最初に"Error"があったらその配列を表示し、異常終了させる
  4. 読み込んだファイルの内容をget_top_all(string_array)に渡す
  5. get_top_allの戻り値をconvert_csv(string_array)に渡す
  6. ラベル部分を出力する
  7. convert_csvの戻り値を出力する

これを書いていて、2~5までのプロセスはまとめてしまったほうがテストが楽かと思いましたので、TODOを追加します。

ファイル名を受け取って、エラー処理、またはget_top_allで処理し、csvを返す
    ファイル名を受け取って、read_fileでエラーが出た場合は終了させる
    [] ファイル名を受け取って、read_fileができた場合はget_top_allで処理し、csvを返す

ファイル名を受け取って、エラー処理、またはget_top_allで処理し、csvを返す

まずはエラーがない場合のテストを考えます。

すでに用意してある以下を使います。

test_file.txt

期待結果は以下となります。

13:52:54,00:06,16.2,20.3,5.0

テストコードを書く

 

以下のプロンプトを与えました。

pythonで、テストデータ"test_file.txt"を与えて戻り値が13:52:54,00:06,16.2,20.3,5.0であることを確認するテストコードを書いてください。
テスト対象はprocess_file(file_name)です。
 以下importしてください。 from ModuleConvertTop import ConvertTop

またclass名が被りになるのでTestProcessFileに変更してテストコードを追加します。

最初のテストでレッドを出す

ではテストを実行します。

既存の15個のテストが通って、最後のテストだけエラーとなったので成功です。

 

最短でグリーンになるコードを書く

プロンプトは以下。

任意の文字列を引数として、固定で以下を返すprocess_file(file_name)メソッドを書いてください。 classのメソッドなのでselfを入れてください。
"13:52:54,00:06,16.2,20.3,5.0"

コードを張り付けます。

テストを実行します。

グリーンとなりました。

 

詳細を実装する

いったん以下を実装します。ChatGPTが。

  1. read_fileでファイルを読み込む
  2. 読み込んだファイルの内容をget_top_all(string_array)に渡す
  3. get_top_allの戻り値をconvert_csv(string_array)に渡す

あえてエラー処理はまだ入れていません。

以下プロンプトです。

以下の仕様のprocess_file(file_name)メソッドをpythonで実装してください。
1. file_nameをread_fileに渡し、戻り値の文字列配列を受け取る
2. read_fileの戻り値の文字列配列をget_top_all(string_array)に渡し、戻り値の文字列配列を受け取る
3. get_top_allの戻り値をconvert_csv(string_array)を渡し、戻り値を返す
classのメソッドなのでselfを入れてください。

先ほどグリーンになったコードを書き換えます。

テストを実行します。

テストが通りました。

 

テストを追加する

続いて、ファイル読み込みエラー時の動作を実装していきます。

エラーが出たらsys.exit(1)で異常終了させます。

まずはそれを確認するテストを書きます。

前回書いたコードではエラー時は以下のように配列の1つ目にErrorを含んだ文字列が来ます。

 ["Error: File not found."]

今回はMockを使ってErrorを含んだ配列を出力させ、テストします。

以下プロンプトです。

上記に追加で、sys.exit(1)が発生をテストできるテストコードを追加してください。
ただし、read_file(file_name)はMockにして、Mockの戻り値を["Error: General error"]にしてください

テストを追加します。

import sysも必要なので追加しておきます。

最後の標準出力の確認は余分なので消します。

テストを実行します。

エラーが発生していることを確認します。

 

機能追加、リファクタリング

では、エラーがあった時にexitするようにコードを修正します。

プロンプトは以下。process_fileを書いていたチャットの続きからやっています。

read_fileからの戻り値の配列のひとつめにErrorの文字列が含まれていたら、異常終了させるようにコードを修正してください。

先ほどグリーンだったコードに貼り付けます。

あとはsysも入ったので、import sysをしておきましょう。

テストを実行します。

テストはグリーンです。

 

------------------------------------------------

 

エラーの時は一言printしてあげたほうがよさそうです。

修正します。

ただ、非常に簡単なので手作業で修正します。

影響はないと思いますが、テストを実行してグリーンのままであることを確認しましょう。

グリーンです。

ついでにerrorが出力されているのも確認できました。

 

今度こそ、利用する部品がすべて完成です。

 

最後に実行できるコードにする

実行できるコードを作成します。

  1. コマンドプロンプトで実行し、第一引数をファイル名とする
  2. ファイル名をprocess_file(file_name)に渡す
  3. ラベルを出力する
  4. process_fileの戻り値を出力する

これでよさそうです。

早速ChatGPTに作成を頼みます。

最後のはTDDではなく、完成後にコードに実際のtopの結果ファイルを与えて確認します。

プロンプトは以下です。

以下のPythonのコードを書いてください。
1. コマンドプロンプトで実行し、第一引数をファイル名とする
2. ファイル名をprocess_file(file_name)に渡す
3. ラベルを出力する
4. process_fileの戻り値を出力する

以下importしてください。
 from ModuleConvertTop import ConvertTop
process_fileはConvertTopに含まれています
ラベルは以下を使ってください
time,up_time,CPU(user),CPU(system),CPU(ni),Mem(%)

これはclassではなく、実行用のファイルを作ってそこに貼り付けます。

ConvertTop.pyという空のファイルを用意しました。

例によってConvertTop()になってないので修正してから貼り付けます。

これで完成です!

 

最後のシステムテスト

最後に実際にファイルを用いてテストします。

ファイルは以下のファイルを使います。

top_result.txt

[root@228b4f451ff1 /]# top -b -d 10 -n 3
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
KiB Mem : 40979980 total, 37696840 free,  1050480 used,  2232660 buff/cache
KiB Swap: 10485760 total, 10485760 free,        0 used. 39463640 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   11844   3052   2648 S   0.0  0.0   0:00.00 bash
   17 root      20   0   56068   3748   3304 R   0.0  0.0   0:00.00 top

top - 13:53:04 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):  17.3 us,  19.2 sy,  0.0 ni,63.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 40979980 total, 37697188 free,  1050124 used,  2232668 buff/cache
KiB Swap: 10485760 total, 10485760 free,        0 used. 39463988 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   11844   3052   2648 S   0.0  0.0   0:00.00 bash
   17 root      20   0   56072   3764   3304 R   0.0  0.0   0:00.00 top

top - 13:53:14 up 6 min,  0 users,  load average: 0.01, 0.06, 0.03
Tasks:   2 total,   1 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  18.5 us,  18.3 sy,  0.0 ni,63.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 40979980 total, 37697948 free,  1049356 used,  2232676 buff/cache
KiB Swap: 10485760 total, 10485760 free,        0 used. 39464756 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   11844   3052   2648 S   0.0  0.0   0:00.00 bash
   17 root      20   0   56072   3764   3304 R   0.0  0.0   0:00.00 top
[root@228b4f451ff1 /]#

 

以下を実行します。

python ConvertTop.py top_result.txt

 

実行結果

ファイルで出力するときは以下です。

python ConvertTop.py top_result.txt > test.csv

無事完成のようですね!

 

最後に所感

  • コード修正時は「エラーが発生しました。修正してください(テスト結果の文を張り付ける)」のように細かな修正指示をせずともテストから出力されたテスト結果をただ張り付けることで、テストを通るコードができた
  • テストコードは自分で書いたほうがよさそうに思える
    • ChatGPTはおおよそ問題がないコードが書けるけど、クラス名.メソッド名で呼び出す場合に()がないなど、絶妙に動かない問題があった
    • プロンプトを与えて正しいテストコードを書くまで続けるより、わかっているなら自分で書いたほうが早い
  • 上記2点より、テストは自分で書き、プロダクションコードはChatGPTで書くTDDを行うことで目的の処理ができるコードは書けそうである
  • テストコードのclass名やメソッド名は何のテストをしているかわかりやすいような命名がよかった(プロンプトの指示に入れておけば良さそう)
  • mockを使うときはChatGPTで書くと早い
  • fileのreadなど、よくある決まりきったコードはChatGPTで書いてしまうと早い

 

今回の成果物のgithub

github.com

 

testerchan.hatenadiary.com