【发布时间】:2014-07-28 03:19:44
【问题描述】:
我使用 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
【问题讨论】:
-
机器人日志提供了大量的时间信息。作为第一步,你有没有分析过哪些关键字随着时间的推移变得越来越慢?
-
不幸的是,程序的大部分都在一堆 Python 代码中,这些代码(在一些设置关键字之后)由单个 Robot 关键字触发。我尝试在一个脚本中执行多次运行,执行间隔 2 甚至 10 分钟等待时间的短脉冲,但这并没有帮助。
标签: robotframework appium selendroid