一个用于帮助 Android App 进行测试、修改配置、模块化的框架
- 使用注解添加标注,方便简单
- 支持Activity、Fragment、方法
- 支持测试多个模块、指定测试模块
- 未使用apk dex解析,性能提升
- 可实现release环境微侵入、零侵入
-
ksp(推荐)
// 可以参考 module-kotlin 模块中的写法 plugins { alias(libs.plugins.ksp) } ksp { arg("TEST_MODULE_NAME", project.getName()) } dependencies { implementation 'io.github.zrq1060:test-point-annotation:0.0.1' debugImplementation 'io.github.zrq1060:test-point-api:0.0.1' kspDebug 'io.github.zrq1060:test-point-ksp:0.0.1' }
并在
gradle.properties内添加如下# 禁用增量 ksp.incremental=false -
kapt
// 可以参考 module-kotlin 模块中的写法 plugins { id 'kotlin-kapt' } kapt { arguments { arg("TEST_MODULE_NAME", project.getName()) } } dependencies { implementation 'io.github.zrq1060:test-point-annotation:0.0.1' debugImplementation 'io.github.zrq1060:test-point-api:0.0.1' kaptDebug 'io.github.zrq1060:test-point-compiler:0.0.1' }
在任意类上添加TestEntryPointModules注解,标明要测试的module名(没传值,默认为当前模块)。例如在App上添加
@TestEntryPointModules({"app", "module-java", "module-kotlin"})
public class App extends Application {
}在Activity、Fragment类上添加TestEntryPoint注解,标明要测试的点。
@TestEntryPoint("登录")
public class LoginActivity extends AppCompatActivity {
...
}@TestEntryPoint("我的")
public class MineFragment extends Fragment {
...
}运行项目,运行成功后,在启动桌面多了一个名为Test的启动图标,打开即可看到测试列表页面,点击对应的按钮即可跳到刚标注的Activity、Fragment。
如果你想测试和Android无关的(如,测试字符串拼接是否正确等),可以用此方法。
public class Test {
@TestEntryPoint("App-静态方法")
public static void test1() {
...
}
}如果你想测试和Android相关的(如,SharedPreferences获取的值是否正确等),可以用此方法。
在src/debug/java/包名下,创建一个类,并继承TestListFragment ,如
@TestEntryPointListFragment
public class MyTestListFragment extends TestListFragment {
...
}@TestEntryPointListFragment
public class MyTestListFragment extends TestListFragment {
@TestEntryPoint("App-非静态方法")
public void test1() {
...
}
}如果你想实现零侵入跳转、跳转时传参、自定义点击按钮逻辑,可以用此方法。
在步骤2.2基础上,复写onAddTestItems()方法,在其内部调用addItem方法进行增加。
@TestEntryPointListFragment
class MyTestListFragment1 : TestListFragment() {
override fun onAddTestItems() {
addItem("Activity1-无参", Activity1::class.java)
addItem("Fragment1-无参", Fragment1::class.java)
addItem("Activity1-有参", Activity1::class.java, "name" to "张三", "age" to 20)
addItem("Fragment1-有参", Fragment1::class.java, "name" to "张三", "age" to 20)
addItem("自定义") {
// 点击此按钮,执行此方法。
}
}
}说明:
- 如果不想在目标类使用
TestEntryPoint注解,则使用此方式添加跳转逻辑,并修改上面引入test-point-annotation的依赖方式为debugImplementation,此为零侵入。- 如果可以接受在目标类使用
TestEntryPoint注解,则是上面默认的引入方式,上面引入test-point-annotation依赖则继续使用implementation,此为微侵入。
如果你要跳转的Fragment有添加@AndroidEntryPoint注解,则承载其的Activity也需要添加@AndroidEntryPoint注解,则可以使用此方式指定使用自定义的TestFragmentDetailsActivity。
@AndroidEntryPoint
@TestEntryPointFragmentDetailsActivity
public class MyTestFragmentDetailsActivity extends TestFragmentDetailsActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}如果你有多模块并都使用了此库,则可以定制每个Test应用的名称,需覆盖test_list_label的默认字符串即可。
在app下strings.xml内添加
<resources>
<string name="test_list_label">Test App Name</string>
</resources>
或在app下build.gradle内添加,可参考demo的app下的build.gradle配置。
resValue "string", "test_list_label", "Test App Name"| 注解 | 功能说明 | 使用约束 | 数量支持 |
|---|---|---|---|
TestEntryPoint |
标记测试进入点 | Activity、Fragment、静态无参方法、TestListFragment子类非静态无参方法 |
无数个 |
TestEntryPointModules |
标记要测试的模块名称 | 可放到任意类上 | App内唯一 |
TestEntryPointListFragment |
标记自定义的TestListFragment |
继承TestListFragment的类 |
无数个 |
TestEntryPointFragmentDetailsActivity |
标记自定义的TestFragmentDetailsActivity |
继承TestFragmentDetailsActivity的类 |
App内唯一 |