使用 Junit 编写的 Selenium 测试未按顺序运行

软件测试 朱尼特
2022-01-20 22:23:31

查找随附的屏幕截图以供参考(带有结果的脚本)

我执行了一些 selenium 脚本,但它们运行不正常。执行是随机获取脚本并开始执行。我想按照脚本顺序执行脚本。请告诉我一个解决方案。

例如脚本的顺序是:

  1. 登录页面 (1)
  2. 仪表板 (2)
  3. 第一链接 (3)
  4. 第二链接 (4)
  5. 第三链接 (5)

执行顺序:

  1. 第一链接 (3)
  2. 仪表板 (2)
  3. 第二链接 (4)
  4. 登录页面 (1)
  5. 第三链接 (5)

如何以正确的顺序执行这些脚本?

3个回答

这个答案的两个部分:首先,要回答这个问题,有很多测试运行者。默认情况下,它们中的一些将按特定顺序运行,可能是它们在代码中出现的顺序,或者按字母顺序,或者其他一些顺序。通常有一种方法可以通过提供一些额外的命令行参数或更改配置来告诉测试运行程序以特定顺序执行它们。从您使用junit的屏幕截图中,junit实际上没有强制执行顺序的方法,有关详细信息,请参阅:https ://stackoverflow.com/questions/3693626/how-to-run-test-methods- in-specific-order-in-junit4

第二部分不是直接回答问题,但很重要,并且在 stackoverflow 的链接答案中也进行了讨论。您应该避免需要按特定顺序运行的测试。如果您只想执行最后一个测试,或者调试最后一个测试怎么办?您是否必须等待所有其他测试执行?如果链中早期的一项测试失败了,那么所有其余的测试都可能也会失败。当您获得大量测试并希望并行执行它们时会发生什么?出于上述原因,让单个测试独立且不依赖其他其他测试通常是最佳实践。

JUnit 中没有默认配置可以按照您想要的方式执行此操作。通过使用 MethodSorters.NAME_ASCENDING,您可以通过按字母顺序命名测试来确保顺序,如其他答案所示。或者,您可以创建自己的 OrderedRunner 和注释来修复这种类型的排序。

public class OrderedRunner extends BlockJUnit4ClassRunner
{

  public OrderedRunner(Class klass) throws InitializationError
  {
    super(klass);
  }

  @
  Override
  protected List computeTestMethods()
  {
    List list = super.computeTestMethods();
    List copy = new ArrayList(list);
    Collections.sort(copy, new Comparator()
    {
      public int compare(FrameworkMethod o1, FrameworkMethod o2)
      {
        SeleniumMethodOrder order1 = o1.getMethod()
          .getAnnotation(SeleniumMethodOrder.class);
        SeleniumMethodOrder order2 = o2.getMethod()
          .getAnnotation(SeleniumMethodOrder.class);
        if(order1.order() == order2.order())
        {
          return 0;
        }
        else if(order1.order() > order2.order())
        {
          return 1;
        }
        else
        {
          return -1;
        }
      }
    });
    return copy;
  }
}

这利用了如下创建的注释

@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.METHOD})
@ java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
public@ interface SeleniumMethodOrder
{
  public abstract int order() default 1;
}

现在您可以编写如下所示的测试并为它们提供顺序...

@RunWith(OrderedRunner.class)

public class StorageServiceWdTest extends WebDriverTestBase {


    @Test
    @SeleniumMethodOrder(order = 1)
    public void testDeleteFile() {
        logger.info("adding file");
    }


    @Test
    @SeleniumMethodOrder(order = 2)
    public void testAddFile() {
        logger.info("adding file");
    }

    @Test
    @SeleniumMethodOrder(order = 3)
    public void testMoveFile() {
        logger.info("moving file");
    }
}

这将确保测试将始终运行 SeleniumMethodOrder 注释的给定 order 参数。

来源: http: //neopatel.blogspot.in/2013/06/junit4-custom-method-order-or-custom.html

您可以使用一种新方法,将其@FixMethodOrder(MethodSorters.NAME_ASCENDING)放在您的班级之外,例如

@FixMethodOrder(MethodSorters.NAME_ASCENDING)

public class HowDoIRunMyTestsInOrderIWant {
public static ChromeDriver chrome;

@BeforeClass
public static void launchBrowser(){
some code goes in here

    }

@Test
public void aLogIn(){
your code = chrome.findElement.blahblah
}
@Test
public void bAnotherTest(){
some code in here
}

因此,通过按字母顺序命名它们,它们将按照您的意愿运行。

希望它可以帮助你。