在运行testing之前,android espressologin一次

我一直试图用testing覆盖我的Android应用程序,并且最近开始使用espresso 。 目前相当令人印象深刻。 然而,我的应用程序的大部分function都要求用户login。由于所有testing都是独立的,因此这需要为每个testing注册一个新用户。 这工作正常但是每个testing所需的时间因此而大大增加。

我试图find一种方法来注册一个用户在一个类(testing),然后使用相同的用户帐户来执行该类中的所有testing。

我已经能够做到这一点的一种方法是实际上只有一个testing( @Test )方法,以我想要的顺序运行所有其他testing。 然而,这是一个全部或全部的方法,因为gradle cAT任务只在最后输出一次结果,而不提供可能通过/失败的中间testing的信息。

我也尝试了@BeforeClass方法,但是这种方法不起作用(即使debugging选项也没有使用这个类的gradle输出,而且它似乎花了很长时间才转到下一个testing类)。

是否有更好的方法在课程开始时注册一次用户,然后在testing结束时注销一次?

任何帮助赞赏。

Related of "在运行testing之前,android espressologin一次"

理想情况下,您可以在一组testing中testinglogin/注销function,只testing不同的login/注销scheme,并让其他testing专注于其他用例。 但是,由于其他scheme取决于用户login,听起来像解决这个问题的一种方法是提供处理login的应用程序组件的模拟版本。 对于其他依赖于login的testing,您可以在开始时注入这个模拟,并返回应用程序的其余部分可以使用的模拟用户凭证。

下面是一个使用Dagger,Mockito和Espresso来实现这个function的例子: https ://engineering.circle.com/instrumentation-testing-with-dagger-mockito-and-espresso/

我testing了一个需要相同场景的应用程序。 我得到的最简单的方法是将日志分成自己的testing类。 然后,将所有testing类添加到套件中,分别以login和注销套件开始和结束。 你的testing套件看起来就像这样。

 @RunWith(Suite.class) @Suite.SuiteClasses({ LoginSetup.class, SmokeTests.class, LogoutTearDown.class }) 

编辑:这是一个LoginSetup和LogoutTearDowntesting的例子。 这个解决scheme实际上只应该用于端到端的testing,并且只包含一小部分的testing工作。 fejd提供了一个完整的testing堆栈的解决scheme ,也需要考虑。

 @LargeTest public class SmokeSetup extends LogInTestFixture { @Rule public ActivityTestRule<LoginActivity> mLoginActivity = new ActivityTestRule<>(LoginActivity.class); @Test public void testSetup() throws IOException { onView(withId(R.id.username_field)).perform(replaceText("username")); onView(withId(R.id.password_field)).perform(replaceText("password")); onView(withId(R.id.login_button)).perform(click()); } } @LargeTest public class LogoutTearDown extends LogInTestFixture { @Rule public ActivityTestRule<MainActivity> mMainActivity = new ActivityTestRule<>(MainActivity.class); @Test public void testLogout() throws IOException { onView(withId(R.id.toolbar_menu)).perform(click()); onView(withId(R.id.logout_button)).perform(click()); } } 

我的应用程序还要求用户在整个testing运行过程中进行login。 但是,我可以第一次login,应用程序会在整个testing过程中记住我的用户名/密码。 事实上,它会记住凭证,直到我强迫它忘记它们或再次卸载并安装应用程序。

在testing运行期间,每次testing之后,我的应用程序会转到后台,并在下一次testing开始时再次恢复。 我猜你的应用程序需要用户input他们的证书,每次你把它从前台(银行应用程序也许?)。 您的应用程序中是否有“将您的凭据记住”的设置? 如果是的话,您可以在您的testing运行中第一次login后轻松启用它。

除此之外,我认为您应该与开发人员讨论如何为您提供logging凭据的方法。

用@Beforelogin的方法很好,但是如果你的login速度很慢,你的组合testing时间将会非常慢。

这是一个很好的黑客工程。 策略很简单:如果某个testing失败(在这种情况下是logintesting),那么按顺序运行每个testing并在每次testing都失败之后才能有机会运行。

 @RunWith(AndroidJUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) @LargeTest public class YourTestsThatDependsOnLogin { private static failEverything; @Before public void beforeTest() { // Fail every test before it has a chance to run if login failed if (failEverything) { Assert.fail("Login failed so every test should fail"); } } @Test public void test0_REQUIREDTEST_login() { failEverything = true; // Your code for login // Your login method must fail the test if it fails. login(); failEverything = false; // We are safe to continue. } // test1 test2 test3 etc... } 

优点:

  • 你所要求的作品速度很快(如果你的login速度很慢)
  • 你可以有多个testing,取决于不同的login,这意味着你可以做一堆的testinguser1,然后一堆testinguser2等
  • 快速设置。

缺点:

  • 不是标准的程序,有人可能会问为什么这么多的testing失败…
  • 应该嘲笑用户,而不是实际login。你应该单独testing你的login,testing不应该依赖于对方。

在testing文件中添加以下函数,将try块中的代码replace为执行login操作的代码。

 @Before fun setUp() { // Login if it is on the LoginActivity try { // Type email and password Espresso.onView(ViewMatchers.withId(R.id.et_email)) .perform(ViewActions.typeText("a_test_account_username"), ViewActions.closeSoftKeyboard()) Espresso.onView(ViewMatchers.withId(R.id.et_password)) .perform(ViewActions.typeText("a_test_account_password"), ViewActions.closeSoftKeyboard()) // Click login button Espresso.onView(ViewMatchers.withId(R.id.btn_login)).perform(ViewActions.click()) } catch (e: NoMatchingViewException) { //view not displayed logic } } 

通过这个@Before注解,这个setUp函数将会在这个testing文件中的任何其他testing之前执行。 如果应用login到login活动,请在此设置function中进行login。 这里的例子假设有一个电子邮件和密码的EditText,以及一个loginbutton。 它使用Expresso键入电子邮件和密码,然后点击loginbutton。 try catch块是为了确保如果你没有登陆login活动,它将捕获错误,什么也不做,如果你没有登陆login活动,那么你仍然可以进行其他testing。

注意:这是Kotlin代码,但看起来非常类似于Java。