YuiHatano介绍
https://github.com/kkmike999/YuiHatano
YuiHatano是一款轻量级DAO单元测试框架,开发者可以通过此框架,在Android Studio运行SQLiteDatabase、SharedPreference单元测试。
YuiHatano支持原生SQLiteDatabase操作及GreenDAO、Afinal、XUtils、DbFlow第三方库。
在悦跑圈实践
笔者在悦跑圈Android 2.10版本后使用了YuiHatano,暂时没发现问题,配置方面也很方便。
吐槽robolectric
相信很多同学,都用过或者听闻过 Robolectric,一款Android单元测试框架。无可否认,Robolectric称得上是Android业界最权威的单元测试框架之一。Google推荐的AndroidJUnitRunner、espresso,跑测试都要运行在真机或模拟器上,而robolectric可以在pc上跑ui测试,无疑大大地提高运行速度。
robolectric下载依赖慢、配置麻烦
但是,刚上手robolectric的小白,特别是天朝的同学,都会说上百次Fu*k。因为,robolectric在运行时,会去https://oss.sonatype.org下载几十M的库,最可怕的是,https://oss.sonatype.org很慢很慢,第一次运行你可以去吃个中午饭,喝个下午茶,回来也未必下载完。
还有,robolectric有各种配置,偶尔还有配置没改,突然跑不起来,说找不到**文件等bug(不知道3.3还有没存在这问题)。遇到这种情况,开发者只能花半天找问题或改配置。
尽管robolectric第一次hello world比较头疼,配置繁琐,文档较少,ui测试功能有限,但确实是一种不错的在本地运行的单元测试方案。
robolectric还是慢
虽然,robolectric在本地运行,比编译单元测试,扔上真机跑的AndroidJunitRunner、espresso要快;但是无论你跑多简单的test case,它每次运行都要花上几秒加载&解析资源等,如果项目比较复杂,甚至耗时十几秒(笔者亲测)。
一个简单的test case:
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class RoboTest {
@Test
public void test() throws Exception {
System.out.println("first robo test");
}
}
居然耗费10s!!
更好的方案——YuiHatano
其实,YuiHatano是笔者撸的一个框架,目的是解决robolectric运行慢问题。YuiHatano不存在robolectric一运行就加载资源问题,也更有效地输出执行的sqlite语句。
YuiHatano仅仅提供DAO测试功能,如果你要测ui,请选其他方案。
Getting Started
Building with Gradle
repositories {
maven { url "https://dl.bintray.com/kkmike999/maven" }
}
dependencies {
testCompile('net.yui:YuiHatano:1.0.10') {
exclude group: 'com.android.support'
}
}
Configuration
在Android Studio操作栏,Run->EditConfigurations,双击Defaults,选择Android JUnit窗口,找到Working directory参数栏,点击最右边的...选择MODULE_DIR。
写第一个测试
SQLiteDatabase
public class SQLiteDatabaseTest extends YuiCase {
SQLiteDatabase db;
@Before
public void setUp() throws Exception {
// 使用YuiHatano提供的Context,获取SQLiteDatabase实例
db = getContext().openOrCreateDatabase("build/test.db", 0, null);
}
@Test
public void testCreateTable() {
String sql = "CREATE TABLE person (id INTEGER, name VARCHAR)";
db.execSQL(sql);
}
}
测试用例执行SQL语句CREATE TABLE person (id INTEGER, name VARCHAR)
,先创建临时sqlite数据库,再临时创建person
表。每个测试方法完成后,临时数据库都会被删除,因此不能在testA()
创建表,testB()
使用这张表。
执行结果:
结果显示,只用了1秒多,比robolectric快几十倍。输出的SQL语句是真实执行在sqlite数据库的。
GreenDAO
先按 GreenDAO 官方文档,配置好gradle等。
User
类
@Entity
public class User {
// 不能用int
@Id(autoincrement = true)
private Long id;
@Unique
private int uid;
private String name;
public User(int uid, String name) {
this.uid = uid;
this.name = name;
}
}
public class GreenDAOTest extends GreenDAOCase {
private DaoSession mDaoSession;
private UserDao mUserDAO;
@BeforeClass
public static void beforeClass() {
DebugHook.setDebug(true);
}
@Before
public void setUp() throws Exception {
Context context = getContext();
// 创建数据库 build/test.db,数据库名就是路径
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "test.db", null);
// 获取可写数据库
SQLiteDatabase db = helper.getWritableDatabase();
// 获取数据库对象
DaoMaster daoMaster = new DaoMaster(db);
// 获取Dao对象管理者
mDaoSession = daoMaster.newSession();
mUserDAO = mDaoSession.getUserDao();
}
@Test
public void testInsert() {
int uid = 1;
String name = "欣怡";
User user = new User(uid, name);
mUserDAO.insert(user);
List<User> users = mUserDAO.loadAll();
Assert.assertEquals(1, users.size());
Assert.assertEquals(1, users.get(0).getUid());
Assert.assertEquals("欣怡", users.get(0).getName());
}
}
执行结果:
输出结果,显示SQL语句CREATE TABLE "USER"...
、INSERT INTO "USER"
、SELECT...
,上面的例子说了,YuiHatano输出的SQL都是真实执行的。
AFinal、XUtils、DbFlow
YuiHatano还支持这几款框架,本文不详细说明,在 Github 有详细用例。
不完善的地方
笔者还未试过GreenDAO等联表查询,不知道YuiHatano对这方面是否有bug. 希望同学们遇到bug,在github issues上提出。
结语:
提了那么多的方面,我这边也可以给你们分享一些实际能帮助到你们的学习资料。整理不易希望大家不要觉得理所当然。如果能帮助到大家扩散一些思路那就最好啦,相信多少会有一定的启发,可以加我QQ号:1363134450联系我,记得备注信息不然(如果你是来打广告的就不要浪费时间加我了。先写到这里有问题也可以直接私信我~