1

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

我一直注意到的是,随着计数的增加,时间显着增加,以至于由于错过点击或不太容易定义(抱歉含糊不清)而导致自动化失败。这会在几个小时内发生,因此更改参数和重新运行测试是一件非常耗时的事情。监控 android 上的 cpu 使用情况表明,在没有其他应用程序运行的情况下,被测应用程序运行得不是很努力(平均为 35%,偶尔会爬到 60 的低点)。Appium 运行在 Mac mini i5 上,我相信它有 2 个内核和 2 个虚拟内核,总共 4 个。Appium 徘徊在 200% 左右,略低于 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\tat java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)\n\ tat java.lang.StringBuilder.append(StringBuilder.java:216)\n\tat io.selendroid.server.model.SelendroidWebDriver.executeAtom(SelendroidWebDriver.java:182)\n\tat io.selendroid.server.model.SelendroidWebDriver .executeAtom(SelendroidWebDriver.java:169)\n\tat io.selendroid.server.model.DefaultSelendroidDriver$WebviewSearchScope.lookupElement(DefaultSelendroidDriver.java:427)\n\tat io.selendroid.server.model.internal.AbstractWebElementContext.findElementByCssSelector (AbstractWebElementContext.java:211)\n\tat io.selendroid.server.model.internal.AbstractWebElementContext.findElement(AbstractWebElementContext.java:156)\n\tat io.selendroid.server.model.By$ByCssSelector.findElement(By.java:45)\n\tat io.selendroid.server.model.DefaultSelendroidDriver.findElement(DefaultSelendroidDriver.java:114)\n \tat io.selendroid.server.handler.FindElement.handle(FindElement.java:46)\n\tat io.selendroid.server.AndroidServlet.handleRequest(AndroidServlet.java:286)\n\tat io.selendroid.server。 BaseServlet.handleHttpRequest(BaseServlet.java:70)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62) \n\tat io.selendroid.server.inspector.InspectorServlet.handleHttpRequest(InspectorServlet.java:78)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\n\tat org.webbitserver。 netty.NettyHttpControl。nextHandler(NettyHttpControl.java:62)\n\tat org.webbitserver.handler.PathMatchHandler.handleHttpRequest(PathMatchHandler.java:33)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\n \tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62)\n\tat org.webbitserver.handler.DateHeaderHandler.handleHttpRequest(DateHeaderHandler.java:21)\n\tat org.webbitserver.netty.NettyHttpControl。 nextHandler(NettyHttpControl.java:78)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:62)\n\tat org.webbitserver.handler.ServerHeaderHandler.handleHttpRequest(ServerHeaderHandler.java:25)\n \tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:78)\n\tat org.webbitserver.netty.NettyHttpControl.nextHandler(NettyHttpControl.java:67)\n\tat org.webbitserver.netty.NettyHttpChannelHandler$2.run(NettyHttpChannelHandler.java:72)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)\n\tat 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

4

1 回答 1

1

第一步是弄清楚哪个关键字或哪些关键字一直在占用。这将缩小调查的重点。

根据对我的评论的回答,减速似乎与一个基于 python 的关键字无关。下一步将是检测该关键字以查看哪个部分进展缓慢。您可以在函数和方法上使用装饰器来做到这一点,或者只是在打印语句中添加以报告经过的时间。

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

尝试的一种选择是将您的测试运行分成更小的部分。运行几百个测试用例然后停止。再跑几百然后停下来,依此类推。完成所有场景后,您可以使用 rebot 工具将所有日志合并到一个报告中。

于 2014-06-06T22:31:29.040 回答