unit-testing - 如何在 Android Studio 中分析测试?

标签 unit-testing android-studio profiling profiler

我的 Android 应用有一些运行缓慢的功能。单元测试完美地捕获了它。单元测试执行表明它的运行速度比应有的要慢。

Android Studio 一直在运行方法旁边为我提供一个菜单选项:“配置文件”而不是运行。我选择了该选项,但似乎与运行没有什么不同。我希望 Android Studio 在测试完成后打开一个窗口,显示所有方法调用的时间。

enter image description here

我搜索过谷歌和安卓网站。我发现的一切都是关于在 Android Studio 中进行分析的。

如何分析 Android 单元测试? (该配置文件选项到底有什么作用?)

最佳答案

我遇到了同样的问题,我决定研究一个解决方案,因为我认为这不会太难。男孩是我错了。

我从未发布的原始答案包含一些尴尬的摆弄 Thread.sleep和手动计时并在正确的时间按下正确的按钮。这被代码中使用 Debug API 的更优雅的解决方案所取代。

使用 Android Studio 3.1.3 这些是我的步骤:

  • 我不得不将我的实际单元测试复制到 androidTest(因为我实际上对算法复杂性(而不是时间消耗)感兴趣)我发现没有办法在没有模拟器的情况下在 Android Studio 中实际分析。对于性能测试这是有道理的,但在我的情况下我我想确保即使在复杂的场景中,我的方法也能以可预测的方式运行。)
  • 避免需要摆弄 Thread.sleep和指示开始/停止的日志输出您可以使用 Debug.startMethodTracing("File"); or Debug.startMethodTracingSampling() and Debug.stopMethodTracing(); 的组合或类似(见 https://developer.android.com/studio/profile/generate-trace-logs)。我的代码现在看起来像
    @Test
    public void Test_Something() throws Exception
    {
         Debug.startMethodTracing("Predict");
         // DO YOUR CODE
         Debug.stopMethodTracing();
    
    }
    
  • 当我现在执行配置文件时,我可以获得在设备上提到的位置生成的 .trace,如上面链接中所述:

  • Trace

    (再次阅读链接页面,因为您需要 WRITE_EXTERNAL_STORAGE 权限,我的应用程序已经拥有该权限,因此在我的情况下并没有那么麻烦。
  • 双击跟踪在 Android Studio 中打开它。与上面链接中所述不同,我目前无法在分析器中导入此类跟踪,因为 3.1.3 缺少此功能或我无法找到它。
    Trace2

  • 编辑 :升级到 Android Studio 3.2 后,我现在确实可以加载和保存 session 并将它们显示在 Profiler 中。这已经改善了很多。有趣的事实:当我在 Android Studio 3.1.3 中打开跟踪时,我看到了方法的命中计数(方法被调用的频率)而不是它们的时钟时间。另一方面,在分析器中,我还无法找到通话时间,而是可以访问挂钟时间。如果有人也有关于如何显示这些的提示,那就太好了。

    关于unit-testing - 如何在 Android Studio 中分析测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50587349/

    相关文章:

    R:避免summary.plm

    unit-testing - 在 Angular 2.1.0 Webpack 上设置单元测试代码覆盖率

    Android Manifest 重复注册 Activity

    android studio - R 未解决 + Clean 项目无法工作

    ruby-on-rails - 如何使用 rack-mini-profiler 分析返回 json 响应的 rails Controller ?

    c++ - 分析 DLL/LIB 膨胀

    java - 我们可以在单元测试中模拟finally block 吗

    android - 如何在 Android 中模拟数据库

    python - unittest blacklist namespace 并且任何引用它的尝试都失败

    java - 手动终止应用程序时如何获取广播接收器?