按步骤运行Espresso测试方法

时间:2019-02-28 14:30:39

标签: android automated-tests android-espresso

我正在使用Espresso编写android工具测试。它应该是对现有测试用例的自动化测试,包括几个步骤。现在我的测试方法如下:

class TestCaseName {

    @Rule
    @JvmField
    val activityTestRule = ...

    @Test
    fun hugeUglyTest() {
      // step 1: ...
      /* performing some actions */

      // step 2: ...
      /* performing some actions */

      // step 3: ...
      /* performing some actions */

      // step 4: ...
      /* performing some actions */

      // step 5: ...
      /* performing some actions */

      // step 5: ...
      /* performing some actions */

      // and so on ....
    }
}

有两个问题:

  • 看起来很丑
  • 很难找到导致失败的步骤

我想将庞大的测试方法拆分为单独的方法,并像测试用例一样执行它们:

class TestCaseName {

    @Rule
    @JvmField
    val activityTestRule = ...

    @Test
    fun step_1_name() {
       /* performing some actions */
    }

    @Test
    fun step_2_name() {
       /* performing some actions */
    }
    // and so on
}

我创建了自己的JUnitRunner,它按步骤编号对这些方法进行排序,并保留测试的一个实例。

问题是-我无法让Espresso在方法调用之间使应用程序保持活动状态。它总是关闭启动的活动,但我需要保持打开状态以通过同一步骤进行下一步。我曾尝试创建自定义ActivityTestRule,但无法成功。

2 个答案:

答案 0 :(得分:0)

首先,我感到您的痛苦,我认为您通过分步骤来做出正确的决定。但是,您执行测试的方式并不完全可行。实际上,这与自动UI测试的逻辑背道而驰。 Espresso 框架旨在模拟一次简短的用户交互,然后以适当的结果(成功或失败)关闭应用程序。通过查看您的示例,我可以建议您实现测试案例的另一种方法。尽管可能是代码重复。

class TestCaseName {

    @Test
    fun test_action_1() {
       /* perform step 1 */
    }

    @Test
    fun test_action_2() {
       /* perform step 1 */
       /* perform step 2 */
    }

    @Test
    fun test_action_3() {
       /* perform step 1 */
       /* perform step 2 */
       /* perform step 3 */
    }
    // and so on
}

如果您要在测试运行时遵循这些步骤,则只需在各步骤之间使用Thread.sleep(time_in_miliseconds)。同样,这些不是最优雅的解决方案,但在某些时候可能有用。

答案 1 :(得分:0)

我想知道这样做没有干净的方法,因为这是端到端测试的非常常见的用例。
似乎没有一种完美的方法,但是对junit测试类使用@FixMethodOrder(MethodSorters.NAME_ASCENDING)或使用TestNG声明从属测试步骤可以创建这种行为。
也许使用jgiven并按照给定的步骤实施不同的步骤也可以导致解决方案,但并不方便。