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

时间:2018-06-07 07:28:43

标签: java selenium selenium-webdriver cucumber bdd

我正在使用BDD编写测试用例。我有一个我被困的情景

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

When generate random data for registration form

Bean类有一些像fname, lname, email, pass这样的字段,而我在上面调用它会生成随机数据并填入那个bean类

现在它返回那个bean类对象,我将它存储在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);

}

那么我如何将这两个代码作为单一方法进行管理?

3 个答案:

答案 0 :(得分:0)

我有类似的需要为更广泛的输入覆盖生成随机字符串。我建议根据分隔符形成一个逻辑。

示例:

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
    
  • 答案 1 :(得分:0)

    我尝试了下面的解决方案,帮助我按照我的预期做同样的事情:

    @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");
        }
    
    }
    

    答案 2 :(得分:0)

    您看过form-data-bean吗?最好是在其中可以用一个字段或所有字段填充bean的位置,并且它将相应地填充UI。

    您可以按照以下步骤填充bean并在bean类中填充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();
    }