Appium / selendroid代码随着时间的推移而逐渐减慢

时间:2014-06-06 18:57:44

标签: robotframework appium selendroid

我将使用Robot Framework,WebDriver和Python通过Appium连接到Android设备的简单,非正式的性能测试放在一起。被测试的应用程序是一个带有本地数据库的包装应用程序,当设备离线时,可以存储记录。我的测试涉及使用硒来自动填写“日记”。然后将其写入本地数据库(在测试期间禁用设备wifi以防止记录被自动推送到服务器)。这是一个非常重复的测试,填写表格并跟踪计数,以及填写然后提交表格所需的时间(日记)。

我注意到的是,随着计数的增加,时间会显着增加,直至自动因点击错误或不易定义的事情而失败(抱歉模糊不清)。这发生在几个小时的过程中,因此更改参数和重新运行测试是非常耗时的事情。监视android上的cpu使用情况表明,被测试的应用程序运行起来并不太频繁(平均35%,偶尔会爬到60以下),没有其他应用程序在运行。 Appium运行在Mac mini i5上,我认为它有2个内核和2个虚拟内核,总共4个.Appium徘徊在200%左右,略低于此,这似乎没问题。

我的智慧结束了为什么自动化随着时间的推移而变慢,并欢迎任何关于它为什么会发生的想法。我发现在没有看到代码运行的情况下进行故障排除是一件非常困难的事情,但程序非常庞大并且似乎没有任何一个特定的故障点。它似乎随着时间的推移而膨胀到破裂的程度。一旦发生这种情况,我会回到设备上的应用程序,我可以手动继续输入表单,没有任何问题,所以它不像数据库已满或应用程序已经以某种方式崩溃。

我正在使用Appium 0.18.0,顺便说一句。我不能让自动化与1.1一起工作,这是另一个问题。

编辑:

我昨晚做了另一次运行,这次使用appium服务器的控制台版本并使用-q标志关闭日志记录。在填写并写入本地离线数据库的日记(表格)数量方面,它进一步得到了很大的改进,但是这样做的时间越来越长,直到最后应用程序崩溃。然而,这一次,有一个更有用的消息,更清楚地表明Selendroid / webdriver的内存问题:

(提前告知堆叠转储在这里,但我不知道如何让它更漂亮)

  

WebDriverException:消息:u' java.lang.OutOfMemoryError \ n \ tat   java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)\ n \达   java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)\ n \达   java.lang.StringBuilder.append(StringBuilder.java:216)\ n \达   io.selendroid.server.model.SelendroidWebDriver.executeAtom(SelendroidWebDriver.java:182)\ n \达   io.selendroid.server.model.SelendroidWebDriver.executeAtom(SelendroidWebDriver.java:169)\ n \达   io.selendroid.server.model.DefaultSelendroidDriver $ WebviewSearchScope.lookupElement(DefaultSelendroidDriver.java:427)\ n \达   io.selendroid.server.model.internal.AbstractWebElementContext.findElementByCssSelector(AbstractWebElementContext.java:211)\ n \达   io.selendroid.server.model.internal.AbstractWebElementContext.findElement(AbstractWebElementContext.java:156)\ n \达   io.selendroid.server.model.By $ ByCssSelector.findElement(By.java:45)\ n \达   io.selendroid.server.model.DefaultSelendroidDriver.findElement(DefaultSelendroidDriver.java:114)\ n \达   io.selendroid.server.handler.FindElement.handle(FindElement.java:46)\ n \达   io.selendroid.server.AndroidServlet.handleRequest(AndroidServlet.java:286)\ n \达   io.selendroid.server.BaseServlet.handleHttpRequest(BaseServlet.java:70)\ n \达   org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\ n \达   org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62)\ n \达   io.selendroid.server.inspector.InspectorServlet.handleHttpRequest(InspectorServlet.java:78)\ n \达   org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\ n \达   org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62)\ n \达   org.webbitserver.handler.PathMatchHandler.handleHttpRequest(PathMatchHandler.java:33)\ n \达   org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\ n \达   org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62)\ n \达   org.webbitserver.handler.DateHeaderHandler.handleHttpRequest(DateHeaderHandler.java:21)\ n \达   org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\ n \达   org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62)\ n \达   org.webbitserver.handler.ServerHeaderHandler.handleHttpRequest(ServerHeaderHandler.java:25)\ n \达   org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\ n \达   org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:67)\ n \达   org.webbitserver.netty.NettyHttpChannelHandler $ 2.run(NettyHttpChannelHandler.java:72)\ n \达   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)\ n \达   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:587)\ n \达   java.lang.Thread.run(Thread.java:841)'

我在网上找到了关于浏览器自动化原子的信息,这些原子似乎与失败有关。错误引用' fineElement'这当然在我的自动化中使用了很多。

https://code.google.com/p/selenium/wiki/AutomationAtoms

我要尝试向Appium或Selendroid人员提出问题,但是如果有人在此期间可以帮我解析这里发生了什么(和/或可能的解决方案或解决方法)我非常感激。

编辑:

在这里记录了Selendroid团队的一个问题:https://github.com/selendroid/selendroid/issues/438

1 个答案:

答案 0 :(得分:1)

第一步是确定哪些关键字或关键字一直在使用。这将缩小调查重点。

根据我的评论的答案,似乎减速被隔离到一个基于python的关键字。下一步是检测该关键字以查看哪些部分进展缓慢。您可以使用功能和方法上的装饰器来执行此操作,或者只使用打印语句来报告已用时间。

由于这是一个运行数小时的测试,另一个罪魁祸首可能是机器人记录机制。可能是日志文件占用了所有可用内存。因此,您可能希望在测试开始变慢时监视内存使用情况。

尝试的一个选择是将测试运行分成更小的部分。运行几百个测试用例然后停止。再运行几百个停止,依此类推。当您运行所有方案时,可以使用rebot工具将所有日志加入到单个报告中。

相关问题