5.3 Robotium的功能测试
问题
您想使用Robotium库测试活动。

添加Robotium依赖和脚本测试。
讨论
Android测试支持库具有用于访问活动窗口小部件的类,但是有更简单的方法来驱动Android UI。虽然这不是一本关于测试的书,但是很容易将Robotium库依赖项添加到Gradle并以这种方式运行测试。 Robotium项目被描述为“像Selenium,但是为Android。”它是一个测试自动化框架,使得它很容易为Android应用程序编写黑盒UI测试。只需在模块Gradle构建文件中添加Robotium库作为依赖关系,如例5-11所示。
实例5-11。添加Robotium依赖关系

dependencies {
androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.4.1'
}

考虑一个名为MyActivity的简单活动,如示例5-12所示,它提示用户输入名称,将其添加到Intent,并启动欢迎活动来欢迎用户。


实例5-12。 MyActivity类是一个“Hello,World”应用程序


public class MyActivity extends Activity {
private TextView textView;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
textView = (TextView) findViewById(R.id.text_view);
editText = (EditText) findViewById(R.id.edit_text);
Button helloButton = (Button) findViewById(R.id.hello_button);
helloButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sayHello(v);
}
});
}
public void sayHello(View view) {
String name = editText.getText().toString();
Intent intent = new Intent(this, WelcomeActivity.class);
intent.putExtra("name", name);
startActivity(intent);
}
}

Robotium提供了一个名为com.robotium.solo.Solo的类,它包含正在测试的活动和Instrumentation对象。它允许您添加文本,单击按钮等,而不必担心打开或关闭UI线程。示例5-13中显示了测试给定活动的示例。


实例5-13。 MyActivity的Robotium测试


public class MyActivityRobotiumTest
extends ActivityInstrumentationTestCase2<MyActivity> {//1
private Solo solo;//2
public MyActivityRobotiumTest() {
super(MyActivity.class);
}
public void setUp() {
solo = new Solo(getInstrumentation(), getActivity());//3
}
public void testMyActivity() {
solo.assertCurrentActivity("MyActivity", MyActivity.class);
}
public void testSayHello() {
solo.enterText(0, "Dolly");
solo.clickOnButton(
getActivity().getString(R.string.hello_button_label));
solo.assertCurrentActivity("WelcomeActivity", WelcomeActivity.class);
solo.searchText("Hello, Dolly!");
}
public void tearDown() {
solo.finishOpenedActivities();
}
}

1Activity测试都扩展了这个类


2来自Robotium的独奏参考


3立即显示Solo参考


Robotium测试扩展了ActivityInstrumentationTestCase2,与所有活动测试一样。 Solo实例使用活动和检索的工具实例初始化。测试本身使用Solo类的方法,如enterText,clickOnButton或searchText。


使用Robotium的唯一缺点是测试使用旧的JUnit 3结构,使用预定义的setUp和tearDown方法,如图所示,所有测试都必须遵循模式public void testXYZ()。然而,写测试的容易性是显着的。测试类存储在与其他Android测试相同的androidTest层次结构中,并通过connectedCheck任务同时在所有模拟器和连接的设备上执行(示例5-14)。


实例5-14。从Gradle执行测试


> ./gradlew connectedCheck
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:prepareDebugDependencies
// ... lots of tasks ...
:app:packageDebugAndroidTest UP-TO-DATE
:app:assembleDebugAndroidTest UP-TO-DATE
:app:connectedDebugAndroidTest
:app:connectedAndroidTest
:app:connectedCheck
BUILD SUCCESSFUL

在两个仿真器上运行后,结果如图5-9所示。




图5-9。 Robotium测试输出


单击“设备”按钮显示相同的结果,按设备组织(图5-10)。


完整的Robotium JavaDocs提供了更多的细节和示例项目。




图5-10。由器件组织的Robotium测试输出