使用 ProGuard,对测试策略有何影响?

Posted

技术标签:

【中文标题】使用 ProGuard,对测试策略有何影响?【英文标题】:With ProGuard, what is the impact on testing strategy? 【发布时间】:2012-01-04 20:10:13 【问题描述】:

由于 android 上的 Scala 存在问题,我最近需要在 Android 上引入 ProGuard。我需要 ProGuard 的收缩功能,它可以删除假定未使用的类。我非常担心删除类对可测试性的影响。

就目前而言,我编写在主机上运行的单元测试和在 Android 平台上运行完全集成的应用程序的验收测试。

通常,我会对相对完整的单元测试覆盖率和参差不齐的验收测试覆盖率感到满意。但是,鉴于在我的代码中我大量使用 Guice 依赖注入,到目前为止,我的经验是 ProGuard 以我难以预测的方式删除代码。因此很可能会导致我引入错误。

这让我相信我需要编写实现全面覆盖的验收/平台测试,因为在任何时候,都可能缺少一个类。

其他人有这种经历吗?如果是这样,您的测试策略是什么?或者凭借经验,您是否会更加确信 ProGuard 正在删除的类是真正不需要的?

【问题讨论】:

【参考方案1】:

ProGuard 不会破坏您的应用程序,直到它尝试对已删除的类和/或混淆成员使用反射或 Class#forName。

根据我的经验(在 Android 上也使用了混淆的 Scala),使用简单的冒烟测试很容易发现 ProGuard 对您的 Android 应用程序造成的问题。您知道项目中包含哪些库。如果其中一些使用反射或 Class#forName - 对它们执行冒烟测试。然后从 ProGuard 配置中排除必要的类/成员。

还请记住,您可以使用 ActivityInstrumentationTestCase2 和模拟器自动测试您的混淆项目。如果您打算在您的项目中使用 ProGuard,请始终对经过混淆的 APK 执行仪器测试。

总之——不要害怕。与 ProGuard 相关的问题很容易发现。

【讨论】:

这通常是正确的,但在使用糟糕的库时要小心奇怪的不一致,比如 Facebook android SDK 和类似的东西。它通常会破坏事物。【参考方案2】:

我们已经进行了很长一段时间的单元测试和“全面”测试我们的 ProGuard 应用程序,并且我们没有遇到“真正的”问题。我们遇到的唯一问题是当我们在测试中使用了一些在主应用程序中没有使用的库方法时;在这些情况下,ProGuard 将从库中删除代码,我们必须手动将特定方法添加到 proguard.cfg

哦,我们也使用 Guice :)

【讨论】:

据我所知,许多 Roboguice 客户并未明确使用 Guice。您主要使用 Roboguice 的 Android 资源注入,还是使用非平​​凡的 Guice 模块进行大量绑定? 我们做了很多非roboguice的注入。我不确定这是否符合“广泛绑定”和“非平凡”的条件。我的总体印象是你真的不应该担心,ProGuard 做得很好。

以上是关于使用 ProGuard,对测试策略有何影响?的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes的部署策略,你常用哪种?

CC防护的策略有哪几种?

不应该使用查询参数的 IT 策略有啥理由吗?

单双通道对RTX有何影响?结果出乎意料

模板方法模式-缓存淘汰策略有哪些?

pthread优先级和pthread策略有啥关系?