从什么是自动化测试开始
自动化测试就是通过一定的编程手段,自动执行本来需要手动执行的一系列测试的活动。
自动化测试和手动测试的对比:
- 执行速度快
- 可靠性高
- 复用性高
- 节省人力资源成本
移动端自动化测试工具的选择
- Appium:可以用来测试native、hybird和mobile web APP,最突出的一点是它既支持Android的自动化测试,也支持IOS的测试;另一方面是它支持使用不同的编程语言编写测试代码。缺点:稳定性有待提高。点此进官网
- Uiautomator:其是Google官方提供的一款自动化测试框架,主要特点是支持跨进程操作(这一点极大的方便了对应用外控件的操作)。缺点:只支持Android Platform、API16及以上,调试编译运行比较麻烦。具体可在官网查看
- Robotium:支持native和hybird的自动化测试,API使用起来方便简单,执行速度快,可根据控件ID操作;另外它既可以基于源码操作,也能基于APK测试,功能强大。缺点:不支持跨进程的操作;针对APK操作,而且需要对APK重新签名(有工具:re-sign),因此操作相对复杂。点此进官网
- 其他的自动化测试框架:monkey,monkeyrunner,Testdroid(商业)和Eggplant(商业)等。
Robotium版“Hello World”
基于源码自动化测试
- 搭建实战测试项目:在eclipse中依次选择File->New->Other->Android Test Project,一路点击next,添加Robotium.jar 5.6.3,在添加jar文件时应在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);
}
//实现测试前的初始化工作,JUnit框架下的方法
@Override
protected void setUp() throws Exception {
// TODO Auto-generated method stub
super.setUp();
solo=new Solo(getInstrumentation(),getActivity());
}
//实现测试完成后的垃圾回收等工作,JUnit框架下的方法
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
solo.finishOpenedActivities();
super.tearDown();
}
//测试用例
public void testTestCase1(){
//不推荐通过index的方式找到控件,应通过ID的方式
solo.enterText(0, "abcd");
solo.enterText(1, "1234567");
solo.clickOnButton(0);
assertTrue("错误提示信息没有出现,可能出现bug",solo.searchText("用户名或者密码错误",true));
}
}
小结:在setUp()中实现一些前置动作,在tearDown()做一些恢复初始状态的动作,然后在test方法实现测试动作。
- 运行Robotium例子:在测试类中单击鼠标右键,选择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的一致)
- 搭建项目和新建测试用例与上述一样
//该注解的作用是给编译器一条指令,告诉它对被注解的代码内部的某些警告保持静默
@SuppressWarnings("rawtypes")
public class FirstQunarTest extends ActivityInstrumentationTestCase2{
private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME="com.Qunar.NoteActivity";
private static Class<?> launcherActivityClass;
/*static代码块(静态代码块):在类中独立于类成员的static语句块,可随便存放
它不在任何的方法体中,JVM加载类时会按照它们在类中出现的先后顺序依次执行它们,
并且只会执行一次*/
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通过反射的方法来调用被测应用程序的代码(具体原理??)
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例子:在测试类中单击鼠标右键,选择Run As->Android JUnit Test.