Test order with espresso

2019-04-03 22:11发布

Is there a way to set test running order in android?
I use Espresso framework and need to test a lot of activities and transitions between them. I want to write different test for those activities, but I need a specific order for running those tests.

6条回答
Summer. ? 凉城
2楼-- · 2019-04-03 22:29

Add the annotation @FixMethodOrder(MethodSorters.NAME_ASCENDING) on top of the class name and name the methods in ascending order.

Please see the below links. The answer is there to achieve your need.

https://stackoverflow.com/a/41198659/4675067

https://stackoverflow.com/a/34456810/4675067

查看更多
贼婆χ
3楼-- · 2019-04-03 22:30

Yes You can set order using the order no with the test_name, See the below example-

public class MyEspressoTest
        extends ActivityInstrumentationTestCase2<UserLoginActivity> {

    private UserLoginActivity mActivity;

    public MyEspressoTest() {
        super(UserLoginActivity.class);
    }

    @Before
    public void setUp() throws Exception {
        super.setUp();
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        mActivity = getActivity();
    }

    public void test1InvalidPropigerLogin() {
        // Type text and then press the button.

        //setContentView function to see the layout

        onView(withId(R.id.username))
                .perform(typeText("hill.hacker@gmail.com"), closeSoftKeyboard());
        onView(withId(R.id.password))
                .perform(typeText("hhhhh"), closeSoftKeyboard());

        onView(withId(R.id.user_login_button)).perform(click());
        // Check that the text was changed.
        onView(withId(R.id.login_status))
                .check(matches(withText("Invalid username or password")));

        //System.out.println("Test pass with invalid user and password");
    }

    public void test2ValidPropigerLogin() {
        // Type text and then press the button.

        onView(withId(R.id.username))
                .perform(typeText("hill.hacker@like.com"), closeSoftKeyboard());
        onView(withId(R.id.password))
                .perform(typeText("gggggg"), closeSoftKeyboard());

        onView(withId(R.id.user_login_button)).perform(click());

        //System.out.println("Test pass with valid user and password");
    }

    public void test3ForgetPasswordButton() {

        onView(withId(R.id.forgot_pwd_button)).perform(click());

        //onView(isRoot()).perform(ViewActions.pressBack());

        onView(withId(R.id.email_edittext))
                .perform(typeText("hill.hacker@propiger.in"), closeSoftKeyboard());
        onView(withId(R.id.reset_password_button)).perform(click());
        // Check that the text was changed.
        onView(withId(R.id.reset_result))
                .check(matches(withText("Email not registered with propiger")));
    }
    public void test4ForgetPasswordButton2() {

        onView(withId(R.id.forgot_pwd_button)).perform(click());

        onView(withId(R.id.email_edittext))
                .perform(typeText("Hill.Hacker@like.com"), closeSoftKeyboard());
        onView(withId(R.id.reset_password_button)).perform(click());
        // Check that the text was changed.
        onView(withId(R.id.reset_result))
                .check(matches(withText("Reset password link sent successfully")));
    }
    public void test5RegisterButton() {
        onView(withId(R.id.register_button)).perform(click());

              //onView(isRoot()).perform(ViewActions.pressBack());

        onView(withId(R.id.register_name_edittext))
                .perform(typeText("Hill Hacker"), closeSoftKeyboard());
        onView(withId(R.id.register_email_edittext))
                .perform(typeText("Hill.Hacker+888@gmail.com"), closeSoftKeyboard());
        onView(withId(R.id.register_mobileno_edittext))
                .perform(typeText("9090909090"), closeSoftKeyboard());
        onView(withId(R.id.register_password_edittext))
                .perform(typeText("password111"), closeSoftKeyboard());
        onView(withId(R.id.register_confirm_password_edittext))
                .perform(typeText("password111"), closeSoftKeyboard());
        //onView(withId(R.id.register_country_spinner)).perform(click());
        //onView(isRoot()).perform(withId(R.id.register_country_spinner, Sampling.SECONDS_15));
        onData(allOf(is(instanceOf(String.class)), is("India")))
                .perform(click());

       onView(withId(R.id.register_country_spinner)).check(matches(withText(containsString("India"))));

        onView(withId(R.id.register_button)).perform(click());

    }


}
查看更多
4楼-- · 2019-04-03 22:34

You can add annotation as test runner fixture as shown here:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)

just above class name

查看更多
贪生不怕死
5楼-- · 2019-04-03 22:34

I need to test loginActivity test first, if it succeeds , it will login the user.And, then I should test other activities. LogoutActivity test should run at the end. So, sequence of activity test is required.

查看更多
走好不送
6楼-- · 2019-04-03 22:38

espresso set running order of tests

From Junit 4.11 comes with @FixMethodOrder annotation. Instead of using custom solutions just upgrade your junit version and annotate test class with FixMethodOrder(MethodSorters.NAME_ASCENDING). Check the release notes for the details.

Here is a sample:

import org.junit.runners.MethodSorters;

import org.junit.FixMethodOrder;
import org.junit.Test;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SampleTest {

   @Test
   public void A_firstTest() {
      System.out.println("first");
   }

   @Test
   public void B_secondTest() {
      System.out.println("second");
   }
}
查看更多
我命由我不由天
7楼-- · 2019-04-03 22:47

As @spinster said above, you should write your tests in a way where order doesn't matter.

I believe Junit 3 will run tests in alphabetical order of the fully qualified class name, so in theory you could control the order by naming them ( package name, class name, method name ) alphabetically in the order you would like them executed, but I would not recommend that.

See: How to run test methods in specific order in JUnit4? How to pre-define the running sequences of junit test cases?

查看更多
登录 后发表回答