嗨,我对两个类进行了硒测试,并且我使用的是静态变量。但是,当我并行运行测试时,在测试运行之间使用变量,并且由于变量中的值不正确,测试结果失败。我试图使该变量成为非静态的,但它抛出一个错误
package test.stepdefinitions.dartts;
import test.dartts.pom.FilterGroup_POM;
import test.utility.ScenarioContext;
import io.cucumber.java.en.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import java.util.*;
import static test.resources.base.getDriver;
public class FilterGroup {
private final ScenarioContext sc;
final WebDriver driver = getDriver();
public String newFilterGroupName;
public static String filterGroupNameForTest;
public static Map<String, String> filterMap = new LinkedHashMap<>();
public static Map<String, String> filterChipMap = new LinkedHashMap<>();
public static ArrayList<String> dataSourcesList = new ArrayList<>();
@When("I click new filter group")
public void i_click_new_filter_group() {
FilterGroup_POM i = new FilterGroup_POM(driver);
Random random = new Random();
newFilterGroupName = "AutoTestFG " + random.nextInt(1000);
if (i.isFirstFilterGroupPresent(newFilterGroupName)) {
String filterName = getDriver().findElement(By.xpath("(//*[contains(text(),'" + newFilterGroupName + "')])[1]")).getText();
filterMap.put("filterGroupNameForTest", newFilterGroupName);
System.out.println("Filter group name for test automation: " + newFilterGroupName);
i.clickOnNewFilterGroupBtn();
}
}
第二堂课
package test.stepdefinitions.common;
import test.common.pom.Common_Login_POM;
import test.stepdefinitions.dartts.FilterGroup;
import io.cucumber.java.en.Then;
import static gov.dhs.ice.raven.resources.base.getDriver;
public class Common_Login {
WebDriver driver = getDriver();
@Then("I should log out of Raven app")
public void i_should_log_out_of_raven_app() {
Common_Login_POM i = new Common_Login_POM(driver);
i.clickLogout();
if (!FilterGroup.filterMap.isEmpty()){
FilterGroup.filterMap.clear();
FilterGroup.dataSourcesList.clear();
FilterGroup.filterChipMap.clear();
}
}
}
如果我将第一个类中的
public static Map<String, String> filterMap = new LinkedHashMap<>();
设置为非静态,则 FilterGroup.filterMap.isEmpty()
会抛出错误,因为无法从静态上下文中引用非静态字段“filterMap”
这行
newFilterGroupName = "AutoTestFG " + random.nextInt(1000);
的另一个问题是通过添加随机的 3 位数字来生成一个字符串。但是,当我并行运行相同的测试 5 次时,它为第一个测试创建了名称,并在后续测试中使用了相同的名称,而不是为每个测试创建新的名称。我在这里错过了什么吗?
我尝试从第一个类中删除静态,我希望第二个类中的变量“filterMap”被识别并正常工作。
我不确定你到底在做什么,但解决静态问题的一种方法是创建
FilterGroup
类的全局实例,然后使用它来引用 FilterMap
,如下所示:
package test.stepdefinitions.dartts;
import test.dartts.pom.FilterGroup_POM;
import test.utility.ScenarioContext;
import io.cucumber.java.en.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import java.util.*;
import static test.resources.base.getDriver;
public class FilterGroup {
public static FilterGroup filterGroup = new FilterGroup();
private final ScenarioContext sc;
final WebDriver driver = getDriver();
public String newFilterGroupName;
public static String filterGroupNameForTest;
public Map<String, String> filterMap = new LinkedHashMap<>();
public static Map<String, String> filterChipMap = new LinkedHashMap<>();
public static ArrayList<String> dataSourcesList = new ArrayList<>();
@When("I click new filter group")
public void i_click_new_filter_group() {
FilterGroup_POM i = new FilterGroup_POM(driver);
Random random = new Random();
newFilterGroupName = "AutoTestFG " + random.nextInt(1000);
if (i.isFirstFilterGroupPresent(newFilterGroupName)) {
String filterName = getDriver().findElement(By.xpath("(//*[contains(text(),'" + newFilterGroupName + "')])[1]")).getText();
filterMap.put("filterGroupNameForTest", newFilterGroupName);
System.out.println("Filter group name for test automation: " + newFilterGroupName);
i.clickOnNewFilterGroupBtn();
}
}
}
还有你的 Common_Login 类(旁注,这不应该有下划线,在 java 中通常使用
CamelCase
作为类名,所以我会重新考虑将此类命名为 CommonLogin
):
package test.stepdefinitions.common;
import test.common.pom.Common_Login_POM;
import test.stepdefinitions.dartts.FilterGroup;
import io.cucumber.java.en.Then;
import static gov.dhs.ice.raven.resources.base.getDriver;
public class Common_Login {
WebDriver driver = getDriver();
@Then("I should log out of Raven app")
public void i_should_log_out_of_raven_app() {
Common_Login_POM i = new Common_Login_POM(driver);
i.clickLogout();
if (!FilterGroup.filterGroup.filterMap.isEmpty()){
FilterGroup.filterGroup.filterMap.clear();
FilterGroup.dataSourcesList.clear();
FilterGroup.filterChipMap.clear();
}
}
}
这允许您将
FilterMap
变成 FilterGroup
的非静态成员
其次,我将使用以下内容来生成随机数:
ThreadLocalRandom.current().nextInt(100, 999 + 1)
这应该会生成随机数,并且会比 nextInt 表现更好,因为理论上,
Random().nextInt(1000)
仍然可以生成不是 3 位数字的数字。