DAO單元測試框架
YuiHatano介紹
YuiHatano是一款輕量級DAO單元測試框架,開發者可以通過此框架,在Android Studio執行SQLiteDatabase、SharedPreference單元測試。
YuiHatano支援原生SQLiteDatabase操作及GreenDAO、Afinal、XUtils、DbFlow第三方庫。
在悅跑圈實踐
筆者在悅跑圈Android 2.10版本後使用了YuiHatano,暫時沒發現問題,配置方面也很方便。
吐槽robolectric
相信很多同學,都用過或者聽聞過
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聯絡我,記得備註資訊不然(如果你是來打廣告的就不要浪費時間加我了。先寫到這裡有問題也可以直接私信我~