1

コマンドを入力するための「シェル」を提供するCアプリケーションがあります。アプリケーションの自動テストコードを作成しようとしています(CUnitを使用)。「シェル」入力は、次のようにstdinから読み取られます。

fgets(buf, sizeof(buf), stdin);

stdinをfreopen()して中間ファイルにフックすることで、コマンドをアプリケーションに自動的に「書き込む」ことができます。アプリケーションが「通常」実行されると、fgets()呼び出しは、「対話型デバイス」であるため文字が使用可能になるまでブロックされますが、中間ファイルでは使用できません。では、どうすればfgetsを偽って、中間ファイルを「インタラクティブデバイス」だと思い込ませることができますか。

Cプログラムは、MinGWを使用してコンパイルされたWindows(XP)用です。

よろしく!

4

3 に答える 3

1

他の回答が示しているように、ファイルを使用するだけでは機能しません。そのため、代わりに何をするかを決める必要があります。FIFO (名前付きパイプ) またはプレーン (匿名) パイプを使用して、テスト中の対話型プログラムにフィードすることができます。または、Unix では、疑似 tty を使用できます。これらすべての利点は、データが読み取られないときにプログラムがブロックされ、次の情報が到着するのを待っていることです。

次に、テスト中のプログラムが読み取るために、定期的にチャネルにデータを書き込むセミインテリジェント (またはインテリジェント) プログラムが必要になります。このプログラムは、メッセージを書き込む間に一時停止する時間を知る必要があります。これは、「1 秒待ってください。データの次の行を書き込みます。あるいは、もっと複雑なことをするかもしれません。

私が知っている 1 つのスキームには 2 つのプログラムがあります。1 つはユーザーの入力内容とそのタイミングを記録するキャプチャ プログラムです (そのため、「データ」ファイルは構造化されており、遅延 (秒と数分の 1 単位) で構成されるレコードがあります)。加えて、送信する文字のセット (カウントとバイトのリスト). これは、ユーザーが入力したものをキャプチャして記録するために実行されます (また、データをプログラムに送信します). 次に、ファイルを読み取る 2 番目の再生プログラムがあります。 、および遅延と文字シーケンスを解釈します。

このスキームは、入力シーケンスが安定している場合に適切に機能します。必要な結果を得るために常に同じシーケンスのキーストロークが必要な場合。プログラムに送信されるデータが、テスト中のプログラムの動作とその応答に適応する必要があり、異なる時間に異なることを行う可能性がある場合は、おそらく ' expect ' を使用する方がよいでしょう。これには、少なくとも非 GUI プログラムの場合は、必要なことを何でも行う能力があります。

于 2010-03-04T03:18:41.733 に答える
1

fgetsEOFファイルの最後に到達するとストリームに設定され、fgetsすぐに戻るように呼び出されるため、ファイルからの読み取り時にブロックされません。対話型入力から実行している場合はEOF、もちろん Ctrl-Z (または UNIX システムでは Ctrl-D) を入力しない限り、決して設定されません。

本当に中間ファイルを使用したい場合は、シェルを強化して、EOF に達したときにクリアし、適切な待機後に再テストする必要があると思います。このような機能は私が思うに動作するはずです:-

void waitForEofClear(FILE *f)
{
   while (feof(f)) {
      clearerr(f);
      sleep(1);
   }
}

fgets:-の前にこれを呼び出すことができます。

waitForEofClear(stdin);
fgets(buf, sizeof(buf), stdin);
于 2010-03-03T21:56:28.177 に答える
0

Windowsに相当するものが何であるかはわかりませんが、Linuxでは中間ファイルをFIFOにします。自明ではない自動パイロットを実行する場合は、expectスクリプトでラップします。

于 2010-03-04T00:01:10.290 に答える