【问题标题】:Need loop within the java class using TestNG需要使用TestNG在java类中循环
【发布时间】:2015-06-20 14:42:28
【问题描述】:

如果我有一个方法,我已经编写了一个 for 循环,但是如果我的 TestNG 脚本中有多个方法怎么办。

如果我在公共类中放置一个变量,我可以让它工作,但我需要它来运行 hostnum 2 到 hostnum 50。所以在使用 TESTNG 时我需要一个类中的 for 循环,因此不能使用公共静态主要。

这是我的代码,请告诉我我能做什么。我是菜鸟:(

    package firsttestngpackage;

import org.openqa.selenium.*;
import org.testng.annotations.*;
import org.openqa.selenium.chrome.ChromeDriver;

public class Test5 {

    WebDriver driver;

    //I NEED A FOR LOOP WITHIN THIS CLASS!!






    //THIS IS NOT WORKING
/*  for {

    }
    int hostnum = x;*/

    //THIS IS NOT WORKING
/*  for (int x = 1; x <= 2; x++){
        int hostnum = x;
    }*/

    //THIS IS WORKING BUT NO LOOP :(
    int hostnum = 2;

    @Test(priority = 1, enabled = true)
    public void method1() throws Exception {
        System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.get("https://www.google.com");
    }

    @Test(priority = 2, enabled = true)
    public void method2() throws Exception {
        driver.findElement(By.id("lst-ib")).sendKeys("host" + hostnum + "_CR");
    }
}

【问题讨论】:

  • 你指的是这个吗? :codeaffine.com/2013/04/10/… 可能与静态变量混合,你就设置好了?
  • @BrandonLing 不完全是。我没有运行junit。将我的 webdriver 作为 TestNG 运行。我将需要多次运行此主机编号。将其视为负载测试和创建多个用户。上面的代码示例并不完全是我的脚本所代表的内容,但我只需要在类中获取这个 for 循环,这样我就可以在我的所有 11 个测试方法中使用该主机号(我的示例代码中没有显示)
  • 好的,那怎么样,将hostnum设置为静态变量,然后在方法中递增它:stackoverflow.com/questions/26128289/…
  • @BrandonLing 我用谷歌搜索了调用计数,但看不到它对我的情况有帮助。我有 10 种测试方法,大多数都有 hostnum。我需要为 hostnum=1 运行所有 10 种测试方法,然后运行 ​​2,3,4 等等。可以把它想象成创建 100 个用户,通过一个注册过程,但它包括 10 个 TestNG 上的测试方法,所以我可以将每个方法保留在我的 TestNG 报告中。感谢您的输入,如果有什么请告诉我。

标签: java class for-loop methods testng


【解决方案1】:

使用您的 testng.xml 中的参数并将它们传递给您的测试。

你的 testng.xml:

<suite name="TestSuite">
    <test name="Test2">
        <parameter name="host" value="host2_CR" />
        <classes>
            <class name="SampleTest" />
        </classes>
    </test> <!-- Test2 -->
    <test name="Test3">
        <parameter name="host" value="host3_CR" />
        <classes>
            <class name="SampleTest" />
        </classes>
    </test> <!-- Test3 -->
    <!-- ... -->
    <test name="Test50">
        <parameter name="host" value="host50_CR" />
        <classes>
            <class name="SampleTest" />
        </classes>
    </test> <!-- Test50 -->
</suite> <!-- TestSuite -->

你的班级:

public class SampleTest {

  WebDriver driver;
  String host;

  @Parameters({"host"})
  @BeforeTest
  public void beforeTest(String host) {
    this.host = host;
  }

  @Test(priority = 1, enabled = true)
  public void method1() throws Exception {
    System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe");
    driver = new ChromeDriver();
    driver.get("https://www.google.com");
  }

  @Test(priority = 2, enabled = true)
  public void method2() throws Exception {
    driver.findElement(By.id("lst-ib")).sendKeys(this.host);
  }

}

【讨论】:

  • 谢谢peetya,但这并不是我想要的。这基本上会为测试方法1做主机2,主机3和主机4,为测试方法2做主机2,主机3和主机4,然后为测试方法3做主机2,主机3,主机4,依此类推...我需要让主机 2 执行方法 1-10,然后主机 3 执行方法 1-10,然后主机 4 执行方法 1-10。所以基本上是一个完整的循环。
  • 我试过你的参数代码,我也许可以用这个。虽然我无法让 beforeTest 工作,但我发现了一个问题。我得到这个错误。 ((((org.testng.TestNGException:方法method2需要1个参数,但在Test注释中提供了0个参数......删除了23个堆栈帧)))所以我将那部分注释掉,只是在Test for方法中移动了上面的at参数2,它奏效了。这实际上不是我想要的。我想在一个浏览器的同一会话上执行此操作。另外,如果我需要创建很多用户,我不想在 xml 中创建 1000 个 怎么办。不过好东西!
  • 对不起,我在方法 2 中留下了一个参数。如果您删除它,它将起作用。我也编辑了代码。如果您不想用 100 填充 xml,您可以在运行时以编程方式创建您的 xml。例如,您只向您的测试添加一个参数(例如“100”),它会在运行时使用 100 创建您的 xml,您不必关心它。您可以在此链接上阅读更多内容:testng.org/doc/…
  • 谢谢你的工作。我将不得不在运行时以编程方式研究这个 xml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 2015-09-21
相关资源
最近更新 更多