0

pkg_getclient () という名前の関数のテスト ユニットを作成しています。基本的に、クライアントを無期限にリッスンする関数です。
実装は次のとおりです: http://slexy.org/view/s21RBuOUOu (質問テキストのサイズを適切に保つためにそこに貼り付けます)

以下はクライアント - サーバー テストの例です: http://slexy.org/view/s2fS5hBkgI

これは私のユニットテストの現在のステータスです:

int test_pkg_getclient (char* portname) {
int netfd;
struct pkg_conn *result;
netfd = pkg_permserver(portname, "tcp", 0, 0);

/* validate_port(port); */
printf("TESTING PKG_GETCLIENT...\n");

result = pkg_getclient(netfd,callbacks, NULL, 0);

printf("TESTING VALID FILE DESCRIPTOR\n");
if (result  == PKC_ERROR)  {printf ("\t[ FAILED ]\n");
} else  { printf ("\t[ PASSED ]\n");
}
return 0;
}

int main (int argc, char* argv[]) {
test_pkg_getclient(argv[1]);
printf("%d",argc);
return 0;
}

pkg_getclient() ブロッキング呼び出しを解除する必要があります。UNIX ベースのシステムだけでなく、Windows にも移植できる必要があります。pkg_getclient() 関数を変更できません。ブロッキング関数はgetclient()内にあります。

シグナル処理を使用してブロッキング呼び出しを中断する方法はありますか? または、これを回避する他の方法はありますか?

4

2 に答える 2

1

正直なところ、ネットワーク スタック全体も関与するため、これが単体テストとしての資格があるとは思えません。

別のテスト戦略をお勧めします: Dependency Injectionを許可するようにコードを変更します。つまり、実行時に参照をネットワークスタックに渡して使用できるようにする必要があります。実稼働コードの場合はもちろん実際のものを使用しますが、単体テストの目的では、テスト対象をカバーするために必要な最小限の動作を実装するモック スタックを使用します。

テストを実際のネットワーク スタックにも拡張したい場合 (この場合、私は単体テストではなく統合を扱います)、個人的には、小さなプログラムを作成し、より高いレベルのスクリプト (bash) を介してそれらを接着する方が簡単だと思います、パイソンなど)。

于 2012-08-03T10:55:09.560 に答える
0

まず最初に、呼び出す前にfork(2) を呼び出すことをお勧めします(pkg_getclientがブロックしていると仮定します)。次に、ブロッキング呼び出しを使用せず、代わりに非ブロッキングソケットまたはselect(2)を使用します。pkg_getclient

移植性に関しては、fork()とpthreadはほとんどのユニス間で移植可能です。Windowsに関しては、pthreadの実装がありますが、fork()のエミュレーションのみです(たとえば、Cygwinはこれを実装します)。

于 2012-07-25T08:21:57.333 に答える