几个方法测试问题 - 挂在第二个测试 - Robotium与ActivityInstrumentationTestCase2

时间:2015-08-06 11:00:15

标签: android unit-testing automated-tests ui-automation robotium

我在做什么:我正在使用Robotium测试Android应用程序。

什么有效:如果我在一个测试方法中进行测试,那么正常工作

什么行不通:如果我尝试将此测试分成两个较小的,那么第一个测试是通过,第二个测试是挂起(或冻结 - 我不知道如何这个名字) enter image description here

为什么我需要我需要在sppon中生成报告,显示每个测试的条形图(我将:testLogin,testAddCustomer,testLogout等)。勺子报告的例子如下:

enter image description here

如果我有一个大的测试(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启动”不在日志中

问题:我该如何解决这个问题?

1 个答案:

答案 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;
    }