1

这里有 3 周的 Java 经验。我有这两个类 - AppTest 和 AppTest2 并且我在它们中都有相同的代码:

这是我的代码:

public class Apptest/AppTest2 {
     public WebDriver driver;
     public WebDriverWait wait;

     @DataProvider(name = "dataProvider")
     public Object[][] setUp() throws Exception {
     File firefoxPath = new File(System.getProperty("lmportal.deploy.firefox.path", "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"));
     FirefoxBinary ffox = new FirefoxBinary(firefoxPath);
     ffox.setEnvironmentProperty("DISPLAY", ":20");
     driver = new FirefoxDriver(ffox, null);
     wait = new WebDriverWait(driver, timeoutInSeconds );
     Object[][] data = new Object[1][2];
     data[0][0] = driver;
     data[0][1] = wait;
     return data;
 }

  @Parameters({ "driver", "wait" })
  @Test(dataProvider = "dataProvider")
  public void twoUsersSignUp(WebDriver driver, WebDriverWait wait) throws InterruptedException{

       //test here

     }
}

如何取出这段代码(setUp()),使其成为一个类,然后将这些变量传递给下一个 void “twoUsersSignUp”

编辑:我不是在寻找自动解决方案,我只是想重构它,所以我在两个类中没有相同的代码

EDIT2:在我实现了接受的答案的解决方案之后,我现在遇到了将变量“驱动程序”传递给第一类中的下一个方法的问题:

     @AfterClass
     public void quit () {
         driver.quit();
     }

我怎么做?

EDIT3:这是@AfterClass 解决方案:

     @SuppressWarnings("deprecation")
     @Configuration 
     @AfterClass
     public static void quit (@Optional WebDriver driver) {
         driver.quit();
     }

EDIT4:实际上 EDIT3 不起作用,它只是隐藏了 Eclipse 的错误。我仍然无法访问“驱动程序”:(

EDIT5:我决定不需要在 AfterClass TestNG 注释中包含它,所以我删除了所有不必要的东西,现在看起来像这样:

     public static void quit (WebDriver driver) {
         driver.quit();
     }

并且变量已以这种方式声明:

public static WebDriver driver;

但它仍然不起作用

EDIT6:通过实际调用测试代码中的方法来解决这个问题。事先我不必调用它,因为 testng.xml 调用了它,但是在我删除 @AfterTest 注释后,它已被排除在外!

4

4 回答 4

2

您不能将方法转换为类,但您可以将方法移动到两个Apptest和共享的位置AppTest2:创建一个基类,并使ApptestAppTest2扩展它。

public abstract class AbstractAppTest {
    public WebDriver driver;
    public WebDriverWait wait;

    @DataProvider(name = "dataProvider")
    public Object[][] setUp() throws Exception {
        File firefoxPath = new File(System.getProperty("lmportal.deploy.firefox.path", "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"));
        FirefoxBinary ffox = new FirefoxBinary(firefoxPath);
        ffox.setEnvironmentProperty("DISPLAY", ":20");
        driver = new FirefoxDriver(ffox, null);
        wait = new WebDriverWait(driver, timeoutInSeconds );
        Object[][] data = new Object[1][2];
        data[0][0] = driver;
        data[0][1] = wait;
        twoUsersSignUp(data);
        return data;
    }
    public abstract void twoUsersSignUp(@Optional Object[][] data) throws InterruptedException; 
}
public class Apptest extends AbstractAppTest {
    public void twoUsersSignUp(@Optional Object[][] data) throws InterruptedException {
        ...
    }
}
public class AppTest2 extends AbstractAppTest {
    public void twoUsersSignUp(@Optional Object[][] data) throws InterruptedException {
        ...
    }
}

现在setUp方法的代码就不需要重复了,它使用twoUsersSignUpAbstractAppTest.

于 2013-08-01T10:22:50.307 回答
1

您不能只将方法转换为类。

但是,您可以创建新对象或修改现有对象。

于 2013-08-01T10:19:19.650 回答
1

像这样初始化你的 testData 类

public class ApptestData{
 public WebDriver driver;
 public WebDriverWait wait;

 public ApptestData() throws Exception {
 File firefoxPath = new File(System.getProperty("lmportal.deploy.firefox.path", "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"));
 FirefoxBinary ffox = new FirefoxBinary(firefoxPath);
 ffox.setEnvironmentProperty("DISPLAY", ":20");
 driver = new FirefoxDriver(ffox, null);
 wait = new WebDriverWait(driver, timeoutInSeconds );
 Object[][] data = new Object[1][2];
 data[0][0] = driver;
 data[0][1] = wait;
 twoUsersSignUp(data);
 return data;
 }
}

然后在您的测试类中使用该对象

    public class Apptest/AppTest2 {

     @Test
     public void twoUsersSignUp() throws InterruptedException{

       AppTestData data = new AppTestData();
       //test here

     }

    }
于 2013-08-01T10:26:15.667 回答
0

您正在寻找的那种重构还不存在,至少在 Eclipse 上是这样。

此处解释了手动执行此操作的解决方法

顺便说一句,在 Eclipse 中,ALT SHIFT T您将通过提取方法、类等找到重构现有代码的所有当前可用可能性。

于 2013-08-01T10:23:44.407 回答