假设我有一个带有测试的 android 应用程序项目。
有什么方法可以针对发布版本运行我们的测试套件(在单独的测试项目中)?
在阅读了赏金的评论后,我意识到 OP 实际上要求的不仅仅是简单的是/否回复,所以我将把我的评论扩展到答案。一般来说,适当设计的 proguard.cfg 和项目结构足以避免这种困境。
一个典型的 proguard 配置(参见第 7 节。此链接中的完整 Android 应用程序部分)保证在混淆期间保留所有与 android 相关的东西,如 Activity、View 等。更改配置没有任何意义,例如混淆 Acticity.onCreate() 方法,因为它显然会在运行时破坏应用程序。换句话说,一个设计良好的 proguard.cfg 将保护底层运行时框架的所有公共接口并保持它们保持不变。
... ...
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
... ...
另一方面,Android测试项目应该专注于测试Android组件(在混淆过程中故意保留),即正确渲染视图,单击按钮执行正确任务,并且应避免为不依赖任何POJO类编写测试Android API,注意这些 POJO 是我们通常混淆的。最好在应用程序或引用的 java 项目中为这些 POJO 编写纯 junit 测试,以便在创建最终版本(混淆、签名和 zipaligned)之前在 maven 测试阶段参与这些 junit 测试。另外,好的OO设计会屏蔽这些中间POJO依赖,使它们对外透明,即运行时框架。
app/
src/main/java/
src/test/java/ <-- intermediate POJO tests put here.
AndroidManifest.xml
... ...
app-test/
src/main/java <-- Android component tests put here.
AndroidManifest.xml
... ...
在 Android 测试项目中编写 POJO junit 测试是绝对可以的,但是,如果您仍然想保持针对混淆 apk 运行测试项目的能力,您需要适当调整应用程序项目的 proguard.cfg 并在混淆期间保留 POJO 类为了适合测试代码。
您可以指示 proguard 使用该指令将其创建的映射写到文件中-printmapping <filename>
。该文件的结构很明显,可以解析为 Hashtable。然后我会编写一个脚本,将这些转换应用到您的测试中(制作它们的副本)。混淆只是意味着将类和方法名称从 Java 字节码规范方面有效的(人类可读的和)替换为其他有效的(短的并且不是人类可读的但)也有效的东西,所以这应该有效。针对混淆项目编译调整后的测试并运行它们。
您是否在一个项目中拥有测试和源代码?如果是这样,我相信 android maven 会在您执行发布时剥离测试代码。
要解决此问题,您需要将测试移动到链接到您的实际应用程序的单独项目(假设您依赖实际项目的代码/资产),然后单独的项目仍将能够针对您的应用程序的发布版本进行检测(假设它们由相同的密钥签名)。