0

私は、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回目のアップロード後にドキュメントの数を要求した後にのみクラッシュするようです。それがなぜなのかはわかりませんが、間違いなくアップロード方法を検討するつもりです。

4

2 に答える 2

2

テストを個別に実行すると成功するが、連続して実行すると失敗する場合は、リクエスト レート制限に達している可能性があります。あなたが言及したJotaBeの回答へのコメントで、リクエストのタイムアウト例外が発生していることに気付きました。http ステータス コードを見て、何をすべきかを判断してください。503 の場合は、例外的なバックオフを実装する必要があります。

更新された提案

try-catch例外をスローしている行の周りにa を配置し、 Google.GData.Client.GDataRequestException. ソースによると、あなたにとって価値があるかもしれない2つのプロパティがあります:

    /// <summary>
    /// this is the error message returned by the server
    /// </summary>
    public string ResponseString
    { ... }

    //////////////////////////////////////////////////////////////////////
    /// <summary>Read only accessor for response</summary>
    //////////////////////////////////////////////////////////////////////
    public WebResponse Response
    { ... }

これらに HTTP ステータス コードなどの有用な情報が含まれていることを願っています。

于 2012-05-08T23:31:19.303 に答える
0

単体テストのタイムアウトを明示的に設定できます。ここには、それに関する広範な情報があります。

Thread.Sleep(miliseconds)問題のあるメソッドの前に単体テストを含めることができます。おそらく、あなたのリクエストは、あまりにも短い時間であるためにGoogleドキュメントから拒否されています.

于 2012-05-08T22:41:52.513 に答える