あらかじめ決められたコマンド列(シェルコマンド)を自動実行する仕組み、シェルスクリプトを用いて「三つの数のうち最大のものを出す」プログラムの自動的なテスト手法について説明します。
「書かれたとおりに操作して動作した」事を確認しない |
---|
ここでは パイプ・リダイレクション で試したパイプなどの機能を使っています。書かれたとおりに操作したら動作するのは当たり前ですから、その通りに動作して安心しないように。それではあなたの理解は一歩も進みません。内容をはっきり意識して操作していることが重要で、そこがクリアに把握出来ない場合は必ず復習しながら進めるように。 |
例えば以下のような「入力を十倍して出力するプログラム」があったとします。
yasuda% cat x10.py
# 入力を10倍して出力する
num = int(input("num: "))
print ("answer =", num * 10)
yasuda% python3 x10.py
num: 3
answer = 30
yasuda%
このプログラムに対しては、ターミナルに「 3 <改行> 」を入力していました。さて、echo コマンドを紹介します。以下の echo コマンドは「 3 <改行>」を出力するものです。
yasuda@Slack 06 % echo 3
3
yasuda@Slack 06 %
echo コマンドは指定されたパラメタをそのまま出力するものです。この機能を使って、こんな実行が可能です。
yasuda@Slack 06 % echo 3 | python3 x10.py
num: answer = 30
yasuda@Slack 06 %
つまり echo 3 の出力「 3 」は「 | (パイプ)」で接続されて「 python3 x10.py 」コマンドの入力となり、処理されました。
例えば上の larger.py 実行時の入力は 10 と 20 の二行の入力だったので、これを パイプ経由で Python プログラムの二つの input() に処理させるには、以下のようにします。
yasuda@Slack 06 % ( echo 10; echo 20 ) | python3 larger.py
num1: num2: 20
yasuda@Slack 06 %
プロンプトはもう要らない |
---|
ところで num:
は入力プロンプトですから、対話的に入力しないなら不要(邪魔)ですね。 num1 = int(input()) などと、input() のカッコ内の文字列は除いてしまえば良いでしょう。 |
三つの数のうち最も大きなものを出すプログラム max.py は 1, 2, 3 と三行で入力を受けますから、以下のようになります。
% ( echo 1; echo 2; echo 3 ) | python3 max.py
他の方法 |
---|
echo を使うにしても、もっとスマートに複数の変数に複数の値を入力する方法もあるのですが、この段階では扱わない事にします。11週目の「リストに複数の値を入力する」に資料がありますが、まあ今その記述を見ても謎の記述にしか見えないと思いますからね。 |
さて教材サイトには max.sh として、以下のようなファイルが置いてあります。ダウンロードして手元に持ってきてください。
yasuda@Slack 06 % cat max.sh
( echo 3; echo 1; echo 2 ) | python3 max.py
( echo 3; echo 2; echo 1 ) | python3 max.py
( echo 1; echo 3; echo 2 ) | python3 max.py
( echo 2; echo 3; echo 1 ) | python3 max.py
( echo 1; echo 2; echo 3 ) | python3 max.py
( echo 2; echo 1; echo 3 ) | python3 max.py
( echo 3; echo 1; echo 1 ) | python3 max.py
( echo 1; echo 3; echo 1 ) | python3 max.py
( echo 1; echo 1; echo 3 ) | python3 max.py
( echo 3; echo 3; echo 1 ) | python3 max.py
( echo 3; echo 1; echo 3 ) | python3 max.py
( echo 1; echo 3; echo 3 ) | python3 max.py
( echo 3; echo 3; echo 3 ) | python3 max.py
yasuda@Slack 06 %
ここにはシェルに対するコマンドが列挙されています。これを以下のように「 % zsh max.sh 」として実行すると、上から一行ずつ実行していってくれます。
エディタによる文字列の置換 |
---|
もしあなたのプログラムが max.py
というファイル名でなかった場合は、max.sh
ファイルをエディタで開いて、max.py
をあなたのプログラムの名前に置換してくださいね。 くれぐれも、13行ぶん、手作業で修正することがないように。道具はちゃんと使えるようになってください。 |
yasuda@Slack 06 % zsh max.sh
3
3
3
3
3
3
3
3
3
3
3
3
3
yasuda@Slack 06 %
出力を見れば、13 通りのすべての入力に対して、すべて正しく入力中の最大の数「3」と答えているのが確認できます。一つでも 3 でないものがあれば(それが何行目かを見ることで)どんなデータ入力の時に誤った結果を出したかすぐわかります。また、プログラムを修正して再度動作確認するときも「 zsh max.sh 」とするだけで完了です。
zsh はシェルプログラムですが、これにファイル名をパラメタとしてつけて実行すると、そのファイルに書かれたコマンド列を上から順に実行してくれます。(まるで python3 にファイル名をパラメタとしてつけて実行した時と同じですね。なお zsh コマンドをファイル名をつけずに実行すると、やっぱり python3 コマンドのように対話モードで動き始めます。)
このシェルスクリプトを使って動作を確認できたら、作成した「三つの数のうち最も大きな数を表示する」プログラムを Moodle を使って課題として提出してください。