我正在使用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
,但无法成功。
答案 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并按照给定的步骤实施不同的步骤也可以导致解决方案,但并不方便。