如何将静态变量变为非静态变量以便在多个类中使用

问题描述 投票:0回答:1

嗨,我对两个类进行了硒测试,并且我使用的是静态变量。但是,当我并行运行测试时,在测试运行之间使用变量,并且由于变量中的值不正确,测试结果失败。我试图使该变量成为非静态的,但它抛出一个错误

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”被识别并正常工作。

java selenium-webdriver cucumber
1个回答
0
投票

我不确定你到底在做什么,但解决静态问题的一种方法是创建

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 位数字的数字。

© www.soinside.com 2019 - 2024. All rights reserved.