我在做什么:我正在使用Robotium测试Android应用程序。
什么有效:如果我在一个测试方法中进行测试,那么正常工作
什么行不通:如果我尝试将此测试分成两个较小的,那么第一个测试是通过,第二个测试是挂起(或冻结 - 我不知道如何这个名字)
为什么我需要我需要在sppon中生成报告,显示每个测试的条形图(我将:testLogin,testAddCustomer,testLogout等)。勺子报告的例子如下:
如果我有一个大的测试(testAll),只有一个大的绿色条,但我需要为每个测试方法都有很多短条,如上图所示。
我做了什么:我已经阅读了很多关于simillar问题的不同主题,但它对我没有帮助
以下是一个有用的简短示例(一种方法 - testAll())我在评论中写了当前活动:
public class LogInLogOut extends ActivityInstrumentationTestCase2 {
private Solo solo;
private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "mobile.touch.core.activity.SplashScreenActivity";
private static Class<?> launcherActivityClass;
static {
try {
launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public LogInLogOut() throws ClassNotFoundException {
super(launcherActivityClass);
}
public void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation());
getActivity();
}
@Override
protected void tearDown() throws Exception {
try {
solo.finalize();
} catch (Throwable e) {
e.printStackTrace();
}
getActivity().finish();
super.tearDown();
}
public void testAll() {
// here is LoginActivity <<-----
// username
solo.clickOnView(solo.getView(0x3));
solo.enterText((android.widget.EditText) solo.getView(0x3), "user");
// enter password
solo.clickOnView(solo.getView(0x3, 1));
solo.enterText((android.widget.EditText) solo.getView(0x3, 1), "password");
// click on log in button
solo.clickOnView(solo.getView(android.widget.Button.class, 0));
// here ContainerActivity starts <<-----
//click on log out
solo.clickOnMenuItem("LogOut");
}
}
使用 testAll()方法传递所有测试。但是我需要把它分成 testLogin()并测试 testLogout()。
这里是我如何将metod testAll分成两个较小的( testLogin()&amp; testLogout()):
public void testLogin() {
// here is LoginActivity <<-----
// username
solo.clickOnView(solo.getView(0x3));
solo.enterText((android.widget.EditText) solo.getView(0x3), "user");
// enter password
solo.clickOnView(solo.getView(0x3, 1));
solo.enterText((android.widget.EditText) solo.getView(0x3, 1), "password");
// click on log in button
solo.clickOnView(solo.getView(android.widget.Button.class, 0));
// here ContainerActivity starts <<-----
}
public void testOut() {
//click on log out
solo.clickOnMenuItem("LogOut");
}
现在首先测试( testLogin()),第二个( testLogout())挂起
要检查测试是否开始,我将登录。
public void testOut() {
Log.i("checkTestB", "test B started"); <<-- here is the log
//click on log out
solo.clickOnMenuItem("LogOut");
}
认为testLog没有执行代码,因为“测试B启动”不在日志中
问题:我该如何解决这个问题?
答案 0 :(得分:0)
我找到答案。方法setUp()在每个测试方法之前进行,而tearDown()在每个测试方法之后执行。它解决了这个问题。
我用:
覆盖setUp()和tearDown()@Override
public void setUp() {
}
@Override
protected void tearDown() throws Exception {
if (exit == true) {
try {
solo.finalize();
} catch (Throwable e) {
e.printStackTrace();
}
solo.finishOpenedActivities();
super.tearDown();
}
}
然后我写了自己的mehtods startUp(),就像setUp()和tearDown()一样。
public void startUp() {
solo = new Solo(getInstrumentation());
getActivity();
}
然后setUp()在测试之前执行时不要。同样的事情是使用teadDown()它没有任何意义我将在测试方法中设置exit == true。
解决方案是在FIRST测试方法中启动manulay startUp(),在LAST测试方法中退出= ture(默认为false),然后tearDown()将运行并关闭所有内容。
现在我手动启动testLogin()中的活动:
public void testLogin() {
startUp(); <<<<<<<-----------------same method as setUp() but can started manually
solo.clickOnView(solo.getView(0x3));
solo.enterText((android.widget.EditText) solo.getView(0x3), "user");
solo.clickOnView(solo.getView(0x3, 1));
solo.enterText((android.widget.EditText) solo.getView(0x3, 1), "password");
solo.clickOnView(solo.getView(android.widget.Button.class, 0));
}
在第二个方法testLogout()中我使用了begginig:solo = new Solo(getInstrumentation());和最后的turnDown()方法
public void testLogOut() {
solo = new Solo(getInstrumentation());
solo.clickOnMenuItem("LogOut");
exit=true;
}