在 BDD 中使用不同类型的参数调用相同的步骤

Call same step with different type of argument in BDD

我正在使用 BDD 编写测试用例。我有一个卡住的场景

我正在使用以下步骤生成随机数据

When generate random data for registration form

有一个 Bean class,它有一些像 fname, lname, email, pass 这样的字段,当我调用上面的步骤时它生成随机数据并填充那个 bean class

现在 returns bean class 对象,我将其存储在 formdata 变量

And store into 'formdata'

现在我想将其发送到我的用户名字段,如下所示

And enter firstname as '${formdata}'

相同的代码步骤:

@QAFTestStep(stepName = "enterFirstName", description = "enter firstname as {0}")
public void enterFirstName(Map<String, Object> data) {
    sendKeys(data.get("firstname").toString(), element);
}

它工作正常但假设在某些情况下我必须只发送如下字符串

And enter firstname as 'Narendra'

步骤为:

@QAFTestStep(stepName = "enterFirstName", description = "enter firstname as {0}")
public void enterFirstName(String fname) {

    sendKeys(fname, element);

}

那么我如何将这 2 个代码作为单一方法来管理?

我也有类似的需求,需要为更广泛的输入范围生成随机字符串。我建议形成一个基于定界符的逻辑。

示例:

public static void main(String[] arg) {
    enterFirstName("iamkenos");
    enterFirstName("${formdata}");
}

public static void enterFirstName(String fname) {
    System.out.println(transformData(fname));
}

public static String transformData(String data) {
    Pattern pattern = Pattern.compile("^\$\{.+}$");
    Matcher matcher = pattern.matcher(data);

    if (matcher.matches()) {
        //do some logic on your data;
        data = "my new data 123";
    }

    return data;
}

然而,这将要求您:

  • 每次调用 transformData(arg)
  • 坚持使用固定分隔符,例如${}

    输出:

    iamkenos
    my new data 123
    
  • 我尝试了以下解决方案,它帮助我完成了我期望的事情:

    @QAFTestStep(stepName = "enterFirstName", description = "enter firstname as {0}")
    public void enterFirstName(Object obj) {
    
        if (obj instanceof LinkedTreeMap) {
            Map<String, Object> map = (Map<String, Object>) obj;
            sendKeys(map.get("firstname").toString(), "regpage.firstname.textbox");
    
        } else if (obj instanceof String) {
            sendKeys(obj.toString(), "regpage.firstname.textbox");
        } else if (obj instanceof RandomRegisterDataGenerator) {
            RandomRegisterDataGenerator data = (RandomRegisterDataGenerator) obj;
            sendKeys(data.getFirstname(), "regpage.firstname.textbox");
        }
    
    }
    

    您调查过 form-data-bean 了吗?这是首选,您可以在其中用一个字段或所有字段填充 bean,它会相应地填充 UI。

    您可以执行填充 bean 并在 bean class 中填充 UI 的步骤,如下所示:

    //Object obj: argument can be string or map or json string or xml key
    @QAFTestStep( description = "fill registration form using {data}")
    public void fillRegistrationFormWithData(Object obj) {
    
       this.fillData(obj);
       this.fillUiElements();
    }
    
    @QAFTestStep( description = "fill registration form with random data")
    public void fillRegistrationFormWithRandomData() {
       this.fillRandomData();
       this.fillUiElements();
    }