私は、C# で Google docs api の単純なラッパーに取り組んでいます。私が直面している問題は、テストがタイムアウトしていることです。時々。すべてのテスト (そのうちの 12 個のみ) を実行すると、通常、削除機能をテストしている 8 番目のテストでハングアップします。約 6.5 分後、続行しますが、その後のすべてのテストも、各テストで 6.5 分後にタイムアウトします。テストを個別に実行すると、毎回正常に動作します。
タイムアウトする最初のメソッドは次のとおりです。
例外処理を表示するように更新
[TestMethod]
public void CanDeleteFile()
{
var api = CreateApi();
api.UploadFile("pic.jpg", "..\\..\\..\\pic.jpg", "image/jpeg");
try
{
var files = api.GetDocuments();
api.DeleteFile("pic.jpg");
var lessFiles = api.GetDocuments();
Assert.AreEqual(files.Count - 1, lessFiles.Count);
}
catch (Google.GData.Client.GDataRequestException ex)
{
using (StreamWriter writer = new StreamWriter("..\\..\\..\\errors.log", true))
{
string time = DateTime.Now.ToString();
writer.WriteLine(time + ":\r\n\t" + ex.ResponseString);
}
throw ex;
}
}
var lessFiles = api.GetDocuments();
そのメソッドの 2 回目の呼び出しでタイムアウトします。そのメソッドを2回呼び出す他のメソッドがあり、それらはタイムアウトしませんが、これはタイムアウトします。
すべてのテスト メソッドがタイムアウトするメソッドを使用します。
public AtomEntryCollection GetDocuments(DocumentType type = DocumentType.All, bool includeFolders = false)
{
checkToken();
DocumentsListQuery query = getQueryByType(type);
query.ShowFolders = includeFolders;
DocumentsFeed feed = service.Query(query);
return feed.Entries;
}
この行でタイムアウトしますDocumentsFeed feed = service.Query(query);
。非常に多くのファイルを要求している場合、これは許容範囲に近いでしょう。私は違います。実行しているテストに応じて、5 - 6 を要求しています。
私が試したこと:
- 私のGoogleドキュメントアカウントからすべてのファイルを削除し、取得するテストに応じて1〜2個のファイルのみを残します。
- テストを個別に実行する (すべて成功し、何もタイムアウトしませんが、これを行う必要はありません)
- ネットワーク速度をチェックして、ひどく遅くないことを確認します (15 mbps ダウン 4.5 mbps アップ)
私はアイデアがありません。誰かが私にタイムアウトを開始する理由を知っているなら? どんな提案でも大歓迎です。
編集
@gowansg が示唆したように、コードに指数バックオフを実装しました。同じ例外で同じ時点で失敗し始めました。次に、ドライブ内のすべてのドキュメントの完全なリストを求める 10000 件のリクエストを送信するテストを作成しました。指数バックオフを使用せずに問題なく通過しました。次に、テスト クラスを変更して、送信されたリクエストの数を追跡できるようにしました。リクエスト 11 でテストがクラッシュします。
完全な例外:
Google.GData.Client.GDataRequestException was unhandled by user code
Message=Execution of request failed: https://docs.google.com/feeds/default/private/full
Source=GoogleDrive
StackTrace:
at GoogleDrive.GoogleDriveApi.GetDocuments(DocumentType type, Boolean includeFolders) in C:\Users\nlong\Desktop\projects\GoogleDrive\GoogleDrive\GoogleDriveApi.cs:line 105
at GoogleDrive.Test.GoogleDriveTests.CanDeleteFile() in C:\Users\nlong\Desktop\projects\GoogleDrive\GoogleDrive.Test\GoogleDriveTests.cs:line 77
InnerException: System.Net.WebException
Message=The operation has timed out
Source=System
StackTrace:
at System.Net.HttpWebRequest.GetResponse()
at Google.GData.Client.GDataRequest.Execute()
InnerException:
別の編集
2回目のアップロード後にドキュメントの数を要求した後にのみクラッシュするようです。それがなぜなのかはわかりませんが、間違いなくアップロード方法を検討するつもりです。