API と連携するperlモジュールを作成しています。CPANに載せる前に、そのモジュールのテスト スイートを作成したいと考えています。ただし、このモジュールは基本的に API の単なるインターフェイスであるため、すべてのテストで有効な API キーとユーザーが必要になります。明らかに、テスト スイートで API キーとユーザー名を使用してこのモジュールをリリースすることはできません。このようなことを処理する最善の方法は何ですか? ローカルでテストしてから、テストなしで CPAN に配置する必要がありますか? 以前にこれに遭遇し、良い解決策を思いついた人はいますか? テストを書くことがベスト プラクティスであることはわかっているので、できることならそうしたいと思っています。ありがとう!
3 に答える
Why not wrap the API calls into small functions (e.g. the function does NOTHING but the API call), and then mock those functions in your tests as needed using Test::MockObject
or similar?
This would be even better, as you would be able to have tests that test different results from API (failure, auth failure, etc...)
API キーがないとモジュールが役に立たないことをドキュメントで明確にし、キーが存在しない場合は Test::More の skip:{} コンストラクトを使用してすべてのテストをスキップしました。スキップの代わりにあまりにも bail_out を選択できます。
API キーをモジュールに伝える方法がドキュメントに記載されていることを確認してください。
この種のことを処理する通常の方法は、テスト スイートを実行するために環境変数を要求することです。環境変数には、有用な情報 (API キー、接続先のホスト名など) が含まれます。
テスト ファイル内からこの種のものを処理する方法の例を次に示します。これをMongoDBディストリビューションに使用して、実行可能なサーバーがあるかどうかを確認します。
BEGIN {
eval {
my $host = exists $ENV{MONGOD} ? $ENV{MONGOD} : 'localhost';
$conn = MongoDB::MongoClient->new( host => $host, ssl => $ENV{MONGO_SSL} );
};
if ( $@ ) {
plan skip_all => $@;
exit 0;
}
};
これは、環境変数で指定されたホスト (または localhost) に接続しようとするMONGOD
だけです。接続できない場合は、すべてのテストをスキップし、その理由を伝えます。スキップは引き続き失敗ではないと見なされるため、テスト サーバーが利用できない場合でもモジュールのインストールが妨げられることはありません。
このコードはuse
、ディストリビューションのすべての .t ファイルにある .pm ファイルにあります。