欢迎光临
梦想从学习开始!

Robolectric单元测试笔记| 小熊测试

本文主要介绍 Robolectric单元测试笔记| 小熊测试,小熊希望对大家的学习或者工作具有一定的参考学习价值,在测试领域有所提升和发展。

  1、环境搭建(版本3.0)

  Android单元测试需要JUnit框架的支持,Robolectric只是提供了Android代码的运行环境,测试还是需要junit来实现。配置如下:

  testCompile 'junit:junit:4.10'

  testCompile 'org.robolectric:robolectric:3.0'

  然后在Build Variants中的Test Artifact改为Unit Tests。

您现在正在阅读的是由小熊分享邦为您整理的 Robolectric单元测试笔记| 小熊测试
  在Android Studio2.0正式版中没有这个选项,直至忽略掉。

  2、第一次尝试

  在Android studio下面有Test包,新建测试类TestDemoTest.

@RunWith(RobolectricGradleTestRunner.class)

@Config(constants = BuildConfig.class,

sdk = 21,

manifest = "src/main/AndroidManifest.xml",

packageName = "cn.liucl.andoridunittestdemo",

resourceDir = "res")

public class TestDemoTest {

public static final String TAG = TestDemoTest.class.getSimpleName();

private MainActivity mainActivity;

@Before

public void beforeTest() throws Exception {

System.out.println("before");

}

@Test

public void Testing() throws Exception {

System.out.println("Testing()");

}

}

  第1行代码,使用注解的方式引入robolectric。然后看这个类的两个方法,使用before注解的方法,表示在单元测试之前执行,可用于获取Activity或资源文件等;而Test注解的方法表示就是这个测试case。执行之后,你会发现Robolectric cant found resource and AndroidManifest.xml这个错误。这是robolectric没有正确加载manifest文件。其实,Resources也没有被加载。这样就有这个类的第二个注解,也就是Config。在Config里面可以指定SDK版本,资源文件以及清单文件等信息。具体信息可以看他的注解。

  补充:如果还是找不到资源,尝试把AndroidManifest中Application的Theme改成android:theme="@style/Theme.AppCompat"

  注意,第一次运行需要下载sdk需要的组件,可能需要一段时间。如果下载失败,自备梯子。

  图为正在下载。

  3、带上Activity

  Robolectric可以创建Activity,可以测试执行点击事件,可以测试生命周期等。

  (1)、创建一个Activity

  Robolectric提供对Activity的操作方法,我们获取一个Activity只需要Robolectric.setupActivity(MainActivity.class);就可以了。

@Before

public void beforeTest() throws Exception {

System.out.println("before");

mainActivity = Robolectric.setupActivity(MainActivity.class);

}

@Test

public void Testing() throws Exception {

Assert.assertNotNull(mainActivity); //断言是否不为空

System.out.println("Testing()");

}

  下面是Robolectric的方法:

  上面的buildActivity和setupActivity都可以创建Activity,他们的不同之处在于,setupActivity直接到Activity生命周期的运行阶段,而buildActivity只是获取对象

  public static ActivityController buildActivity(Class activityClass) {

  return ActivityController.of(shadowsAdapter, activityClass);

  }

  public static T setupActivity(Class activityClass) {

  return ActivityController.of(shadowsAdapter, activityClass).setup().get();

  }

  public ActivityController setup() {

  return create().start().postCreate(null).resume().visible();

  }

  (2)、生命周期

  ActivityController提供对Activity生命周期操作的一系列方法:(相同的,Service也是这样)

  (3)、测试点击

  Robolectric支持点击操作,首先确保Activity执行到相应的生命周期。在MainActivity编写好逻辑。

MainActivity

button = (Button) findViewById(R.id.test1);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

System.out.println("Success");

}

});

TestDemoTest

@Before

public void beforeTest() throws Exception {

Log.i(TAG, "beforeTest()");

mainActivity = Robolectric.buildActivity(MainActivity.class).setup().get();//注意生命周期

button = (Button) mainActivity.findViewById(R.id.test1);

}

@Test

public void btn1(){

button.performClick();

}

  在Robolectric中打Log请使用**System.out**。Android的Log工具只有在使用Adb时候才有效。

  (4)、断言

  Robolectric不提供类似Junit的assert方法来测试程序。所以还是需要使用Junit的assert来测试。

  assertNotNull(); //判断对象是否不为空

  assertNull();

  assertEquals(); //判断实际值和期望值是否“相同”

  assertTrue(); //判断布尔值是否为true

  assertFalse();

  assertNotSame();

  assertSame(); //判断实际值和期望值是否为同一个对象

  (5)、在项目中使用

  实际项目中,单元测试对象与页面是一对一的,并不建议跨页面,这样的单元测试藕合度太大,维护困难。单元测试需要找到页面的入口,分析项目页面中的元素、业务逻辑,这里的逻辑不仅仅包括界面元素的展示以及控件组件的行为,还包括代码的处理逻辑。然后可以创建单元测试case列表(列表用于纪录项目中单元测试的范围,便于单元测试的管理以及新人了解业务流程),列表中记录单元测试对象的页面,对象中的case逻辑以及名称等。工程师可以根据这个列表开始写单元测试代码。

  单元测试是工程师代码级别的质量保证工程,上述流程并不能完全覆盖重要的业务逻辑以及边界条件,因此,需要写完后,看覆盖率,找出单元测试中没有覆盖到的函数分支条件等,然后继续补充单元测试case列表,并在单元测试工程代码中补上case。

  直到规划的页面中所有逻辑的重要分支、边界条件都被覆盖,该项目的单元测试结束。

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小熊分享邦(www.xxfxb.com),希望大家能坚持软件测试之路,谢谢。

赞(0) 打赏
未经允许不得转载:小熊分享邦 » Robolectric单元测试笔记| 小熊测试

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏