Android测试初探(五) Rototium框架的使用、黑盒与白盒测试

Robotium框架

Robotium是一个很常用的自动化测试框架,既可以进行白盒测试,也可以进行黑盒测试。Robotium实质上是建立在Instrumentation上的一系列工具方法。

由于Instrumentation通常不能获取系统权限(需要系统签名,而系统签名文件在编译系统时已经被编译进去,不能获取到),于是Robotium只能进行单个APP的测试,不能跨应用测试。

基于Rototium框架的测试

Robotium也是一款比较成熟的安卓测试框架,不仅可以进行白盒测试,也可以进行黑盒测试。只要能获取Activity和Instrumentation实例,即可使用Robotium。因此直接使用Instrumentation Test Runner即可。

相比Espresso,Robotium的配置简单很多,在gradle中只需要添加一个依赖项即可,基本上也不用担心冲突。

  1. dependencies {
  2. androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.1'
  3. }

还是和Espresso同样的一个例子,点击按钮,并检查文本框中是否展示了预期的文本,代码如下。

  1. public class MainActivityTest extends ActivityInstrumentationTestCase2 {

  2. private Solo solo;

  3. public MainActivityTest() {

  4. super(MainActivity.class);

  5. }

  6. @Override

  7. protected void setUp() throws Exception {

  8. super.setUp();

  9. solo = new Solo(getInstrumentation(), getActivity());

  10. }

  11. public void testHello() throws Exception {

  12. // 等待Activity启动

  13. solo.waitForActivity("MainActivity", 3000);

  14. // findView

  15. View button = solo.getView(R.id.button);

  16. TextView text = (TextView) solo.getView(R.id.text);

  17. // 点击按钮

  18. solo.clickOnView(button);

  19. // 延时

  20. solo.sleep(100);

  21. // 检查测试结果

  22. assertEquals(solo.getString(R.string.hello_test), text.getText());

  23. // 延时

  24. solo.sleep(5000);

  25. }

  26. }

基于Robotium的黑盒测试

Robotium也可以用于黑盒测试,很多地方和前面的白盒测试写法类似;不同是,黑盒测试由于不能直接访问待测APP源码,所以会使用反射来访问。

白盒测试直接向父类构造函数传入Class对象获取Activity实例,黑盒测试则可以通过反射获取Activity的Class,对比如下。

  1. public class MainActivityBaseTest extends ActivityInstrumentationTestCase2 {

  2. public MainActivityBaseTest() {

  3. super(com.jzj1993.unittest.MainActivity.class);

  4. }

  5. }

  6. public class MainActivityBaseTest extends ActivityInstrumentationTestCase2 {

  7. public MainActivityBaseTest() throws ClassNotFoundException {

  8. super(Class.forName("com.jzj1993.unittest.MainActivity"));

  9. }

  10. }

在白盒测试中可以直接访问R.class从而取得资源,而黑盒测试则利用Context.getResources().getIdentifier(),从字符串获取资源。示例代码分别如下。

  1. solo.getView(com.jzj1993.unittest.R.id.text);

  2. solo.getView("com.jzj1993.unittest:id/text");

黑盒测试时,在设备上安装待测APK,而测试代码在单独的工程中编译,最后添加和待测APK一致的签名,安装到设备上运行即可。

2016-5-11补充:在独立的工程中用Android Studio进行Robotium黑盒测试,具体的配置方法可参考本系列第七篇