一个用于帮助 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内唯一 |