我正在为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();
上超时第二次调用该方法。我有其他方法可以调用该方法两次,并且它们没有超时,但是这个方法可以。
所有测试方法使用的方法超时:
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取决于我正在运行的测试。
我尝试过的事情:
我没有想法。如果有人知道为什么它可能会开始超时我?欢迎任何建议。
修改
正如@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:
其他编辑
似乎我在第二次上传后请求了多少文件后才崩溃。我不确定为什么会这样,但我肯定会查看我的上传方法。
答案 0 :(得分:2)
如果你的测试在单独运行时通过,而不是在连续运行时通过,那么你可能会达到请求率限制。我在你的评论中注意到你提到的JotaBe的答案是获得请求超时异常。您应该查看http状态代码以找出what to do。如果是503,您应该实现exceptional back off。
更新了建议
在抛出异常的行周围放置try-catch
并捕获Google.GData.Client.GDataRequestException
。根据{{3}},有两个属性可能对您有价值:
/// <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状态代码。
答案 1 :(得分:0)
您可以明确设置单元测试的超时时间。您可以在此处获得大量信息:
您可以在违规方法之前在单元测试中加入Thread.Sleep(miliseconds)
。可能你的请求被谷歌文档拒绝,因为它可能在太短的时间内被拒绝。