Afc4c46054c0eeb9e3b622f7fdaaa4fc
推荐轻量级Android DAO单元测试框架——YuiHatano

image

YuiHatano介绍

https://github.com/kkmike999/YuiHatano

YuiHatano是一款轻量级DAO单元测试框架,开发者可以通过此框架,在Android Studio运行SQLiteDatabase、SharedPreference单元测试。

YuiHatano支持原生SQLiteDatabase操作及GreenDAO、Afinal、XUtils、DbFlow第三方库。

在悦跑圈实践

笔者在悦跑圈Android 2.10版本后使用了YuiHatano,暂时没发现问题,配置方面也很方便。

关于命名

有道云翻译: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下载依赖库》

还有,robolectric有各种配置,偶尔还有配置没改,突然跑不起来,说找不到**文件等bug(不知道3.3还有没存在这问题)。遇到这种情况,开发者只能花半天找问题或改配置。

尽管robolectric第一次hello world比较头疼,配置繁琐,文档较少,ui测试功能有限,但确实是一种不错的在本地运行的单元测试方案。

robolectric还是慢

虽然,robolectric在本地运行,比编译单元测试,扔上真机跑的AndroidJunitRunner、espresso要快;但是无论你跑多简单的test case,它每次运行都要花上几秒加载&解析资源等,如果项目比较复杂,甚至耗时十几秒(笔者亲测)。

一个简单的test case:

(RobolectricTestRunner.class)(constants = BuildConfig.class)
public class RoboTest {

   
    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

dependencies {
    testCompile('net.yui:YuiHatano:1.0') {
        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;

   
    public void setUp() throws Exception {
        // 使用YuiHatano提供的Context,获取SQLiteDatabase实例
        db = getContext().openOrCreateDatabase("build/test.db", 0, null);
    }

   
    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()使用这张表。

top Created with Sketch.