從什么是自動化測試開始
自動化測試就是通過一定的編程手段,自動執(zhí)行本來需要手動執(zhí)行的一系列測試的活動。
自動化測試和手動測試的對比:
- 執(zhí)行速度快
- 可靠性高
- 復(fù)用性高
- 節(jié)省人力資源成本
移動端自動化測試工具的選擇
- Appium:可以用來測試native、hybird和mobile web APP,最突出的一點是它既支持Android的自動化測試,也支持IOS的測試;另一方面是它支持使用不同的編程語言編寫測試代碼。缺點:穩(wěn)定性有待提高。點此進官網(wǎng)
- Uiautomator:其是Google官方提供的一款自動化測試框架,主要特點是支持跨進程操作(這一點極大的方便了對應(yīng)用外控件的操作)。缺點:只支持Android Platform、API16及以上,調(diào)試編譯運行比較麻煩。具體可在官網(wǎng)查看
- Robotium:支持native和hybird的自動化測試,API使用起來方便簡單,執(zhí)行速度快,可根據(jù)控件ID操作;另外它既可以基于源碼操作,也能基于APK測試,功能強大。缺點:不支持跨進程的操作;針對APK操作,而且需要對APK重新簽名(有工具:re-sign),因此操作相對復(fù)雜。點此進官網(wǎng)
- 其他的自動化測試框架:monkey,monkeyrunner,Testdroid(商業(yè))和Eggplant(商業(yè))等。
Robotium版“Hello World”
基于源碼自動化測試
- 搭建實戰(zhàn)測試項目:在eclipse中依次選擇File->New->Other->Android Test Project,一路點擊next,添加Robotium.jar 5.6.3,在添加jar文件時應(yīng)在java build path中查看,不然在初始化solo時容易碰到NullPointerException錯誤。
- 新建第一個測試用例:新建Java類,繼承ActivityInstrumentationTestCase2< >.
//泛型寫入需要測試的工程的入口activity名-LoginActivity
public class TestCase1 extends ActivityInstrumentationTestCase2<LoginActivity> {
private Solo solo;
public TestCase1(){
//LoginActivity是指啟動的activity名稱
super(LoginActivity.class);
}
//實現(xiàn)測試前的初始化工作,JUnit框架下的方法
@Override
protected void setUp() throws Exception {
// TODO Auto-generated method stub
super.setUp();
solo=new Solo(getInstrumentation(),getActivity());
}
//實現(xiàn)測試完成后的垃圾回收等工作,JUnit框架下的方法
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
solo.finishOpenedActivities();
super.tearDown();
}
//測試用例
public void testTestCase1(){
//不推薦通過index的方式找到控件,應(yīng)通過ID的方式
solo.enterText(0, "abcd");
solo.enterText(1, "1234567");
solo.clickOnButton(0);
assertTrue("錯誤提示信息沒有出現(xiàn),可能出現(xiàn)bug",solo.searchText("用戶名或者密碼錯誤",true));
}
}
小結(jié):在setUp()中實現(xiàn)一些前置動作,在tearDown()做一些恢復(fù)初始狀態(tài)的動作,然后在test方法實現(xiàn)測試動作。
- 運行Robotium例子:在測試類中單擊鼠標(biāo)右鍵,選擇Run As->Android JUnit Test.
基于APK的自動化測試
APK重簽名:在基于APK的自動化測試過程中,需要確保被測試的APK必須與測試項目具有相同的簽名。利用工具re-sign.jar,用法可自行Google。(re-sign重簽名找的debug.keystore是位于C://User/.android下的,而eclipse的debug.keystore要與re-sign的一致)
- 搭建項目和新建測試用例與上述一樣
//該注解的作用是給編譯器一條指令,告訴它對被注解的代碼內(nèi)部的某些警告保持靜默
@SuppressWarnings("rawtypes")
public class FirstQunarTest extends ActivityInstrumentationTestCase2{
private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME="com.Qunar.NoteActivity";
private static Class<?> launcherActivityClass;
/*static代碼塊(靜態(tài)代碼塊):在類中獨立于類成員的static語句塊,可隨便存放
它不在任何的方法體中,JVM加載類時會按照它們在類中出現(xiàn)的先后順序依次執(zhí)行它們,
并且只會執(zhí)行一次*/
static{
try {
launcherActivityClass=Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public FirstQunarTest(){
super(launcherActivityClass);
}
private Solo solo;
@Override
protected void setUp() throws Exception {
// TODO Auto-generated method stub
solo=new Solo(getInstrumentation(),getActivity());
}
//測試用例:黑盒測試方式——無被測項目的源代碼(基于APK)
//robotium通過反射的方法來調(diào)用被測應(yīng)用程序的代碼(具體原理??)
public void testCanOpenSettings(){
if(solo.searchText("軟件更新")){
solo.clickOnView(solo.getView("button3"));
}
solo.pressMenuItem(0);
}
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
solo.finishOpenedActivities();
super.tearDown();
}
}
- 運行Robotium例子:在測試類中單擊鼠標(biāo)右鍵,選擇Run As->Android JUnit Test.