【问题标题】:How to keep the code dry while using a function in selenium with testng?如何在测试中使用 selenium 中的函数时保持代码干燥?
【发布时间】:2019-09-04 06:00:08
【问题描述】:

假设我有一个方法,当调用该方法时会截取页面并将其保存在文件夹中。我想知道一种更好的方法来使用该方法而无需重复自己,因为现在是这样工作的(我正在使用 selenium-webdriver 与 testng 和 java):

public class TestClass{

@Test
public void firstTest(){
  step1();
  step2();
  takeScreenshot();
  step3();
  takeScreenshot();
  step4();
  takeScreenshot();
  step5();
  step6();
  takeScreenshot();
}

@Test
public void secondTest(){
  step1();
  step2();
  takeScreenshot();
  step3();
  takeScreenshot();
  step4();
  step5();
  step6();
  takeScreenshot();
}


}

如您所见,现在当我需要捕获屏幕截图但看起来不太干净时,我会在测试方法中的任何步骤之后调用该方法。所以我想知道这是否是一种更好的方法。

【问题讨论】:

    标签: java selenium selenium-webdriver webdriver testng


    【解决方案1】:

    我不知道这些步骤是做什么的。但是,如果这些是断言,那么您可以将它们拆分为单独的测试并在 @AfterTest 方法中调用 screenshot 方法。这样,在每次测试屏幕截图后,您就不必重复屏幕截图方法调用。

    【讨论】:

    • “步骤*();”可以是任何东西(断言、日志、selenium api 调用等)。现在,关于您的目标解决方案,如果我这样做,测试用例的数量将会增加,因为我会将它们拆分以使用 @AfterTest 注释。
    【解决方案2】:

    我的第一个想法是,你现在拥有的东西还不错。它简单、明确且易于配置(即step4() 在第一个测试中有屏幕截图,但在第二个测试中没有)。您想抽象出屏幕截图,因为它们感觉很杂乱,但作为作者,您正在决定在某些情况下而不是在其他情况下调用它,并且该决定必须在某个地方进行编码。

    也就是说,你可以...

    A) 将takeScreenshot() 埋在step() 函数中,并传入一个标志,当它为真时触发它。但是,使用这样的标志违反了Do One Thing 原则,这让鲍勃叔叔脾气暴躁。

    public void secondTest(){
      step1();
      step2(true);
      step3(true);
      step4();
      step5();
      step6(true);
    }
    

    B) 你可以做一些真正花哨的事情,让你的所有step() 函数返回this,这样你就可以用takeScreenshot() 链接它们(我假设在TestClass 的其他地方)。这会让你犯下这种(可能是可怕的)罪行:

    public void secondTest(){
      step1();
      step2().takeScreenshot();
      step3().takeScreenshot();
      step4();
      step5();
      step6().takeScreenshot();
    }
    

    C) 牺牲配置是否在给定操作后截取屏幕截图的能力,并将其硬编码到您最关心的操作集中。

    D) 或者我最喜欢的选项,保持原样。仅仅因为你一遍又一遍地调用一个函数并不意味着你的代码不是 DRY。你没有复制任何真实的逻辑。这是更多的代码行,但是,嘿,你不会用完行。抛弃杂乱无章和语法可以让你的代码更具可读性,但如果你挤得太紧,试图在 12 行中做 20 件事,它可能会适得其反。用这些额外的代码行犒劳自己,这是周末,你应得的。

    【讨论】:

      【解决方案3】:

      我建议您这样做:将每个“步骤”方法都变成测试。然后,像这样使用 @BeforeTest 或 @AfterTest 的 TestNG 注释:

      @Test
      public void Step1()
      {
          // write here step1 code...
      }
      
      @Test
      public void Step2()
      {
          // write here step2 code...
      }
      
      @AfterTest
      public void takeScreenshot()
      {
          // takeScreenshot method code goes here
      }
      

      这样,takeScreenshot 方法将在每个步骤之后运行,您将获得更清晰更好的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多