如何在机器人框架中的小黄瓜式测试中在句子中间指定参数?

时间:2017-06-30 10:42:21

标签: robotframework gherkin

使用Robot Framework,我打算使用Gherkin样式测试,因为它是BDD / ATDD的通用语言。我可以指定一个这样的测试:

*** Test Cases ***
New alert
    Given there were no alerts so far
    When there is an alert
    Then an alert should be sent with level  LOW

和Robot会在没有任何帮助的情况下将此映射到我的测试库中的方法:

def there_were_no_alerts_so_far(self):
    assert(self.alert == None)

def there_is_an_alert(self):
    self.alert = self.alert_processor.alert()

def an_alert_should_be_sent_with_level(self, level):
    assert_not_none(self.alert )
    assert_equal(self.alert.level.name, level )

冷却。我可以将level之类的参数传递给测试库。

但是我不知道该怎么做,是指定一个位于子句中间的参数,如:

There there are 5 alerts sent

我想在测试库中映射到此方法:

def there_is_an_alert_after_seconds(self, seconds):
...

在这种情况下,5位于子句的中间。 在pytest.bdd中,测试库中有一些装饰器,可用于指定如何解析子句。 机器人中的等价物是什么?

我尝试了这个但无济于事:

*** Keywords ***
there is an alert after ${time} seconds
    there is an alert after seconds ${time}

2 个答案:

答案 0 :(得分:3)

机器人框架用户指南有一节介绍如何执行此操作。见Embedding arguments into keyword name

用户关键字

使用用户关键字非常简单:您只需在关键字名称中嵌入变量引用,而不是使用[Arguments]。这是用户指南中给出的示例:

 *** Keywords ***
 Select ${animal} from list
    Open Page    Pet Selection
    Select Item From List    animal_list    ${animal}

您可以像预期的那样使用此关键字:

*** Test Cases ***
Example
    Select Dog from list

图书馆关键词

您也可以使用机器人提供的keyword decorator在python中编写关键字。例如:

from robot.api.deco import keyword
@keyword('Select ${animal} from list')
def select_animal_from_list(animal):
    ...

使用引号

虽然不是绝对必要,但用引号包围参数被认为是一种好习惯。用户指南中给出的示例如下:

Select ${city} ${team}

如果你用Select Los Angeles Lakers打电话,机器人将如何知道${city}是否应匹配“洛杉矶”或“洛杉矶”?在它周围放置引号将解决这个问题:

Select "${city}" "${team}"

当然,这意味着您在调用关键字时也必须提供引号:

   Select "Los Angeles" "Lakers"

其他功能

也可以使用正则表达式来匹配参数。有关如何执行此操作的详细说明,请参阅用户指南。

答案 1 :(得分:0)

这个关键字 - 部分“规则”可以解决问题。 机器人对这种格式非常挑剔。

    public function changeState(Request $request)
    {

        if($request->ajax()){

            $usernames = Input::get('usernameSend');

            if(isset($usernames)){

                $user = User::Where('username', '=', $usernames);

                if ( !$user->get() ){ 

                    Log::warning("User not found.");

                } else {

                    if(!$user->get()->isEmpty()) { // verify if the user is active

                        $user->delete(); //soft delete the given user

                    }else{

                        $user->restore(); //removes the soft delete for the given user

                    }

                }

            }else{

             Log::warning("Username doesn't exist on database.");

         }

     }

 }

请注意,应引用该变量。

*** Test Cases ***
Second alert soon after, first escalation
    Given there is an alert
    When there is an alert after "7" seconds

变量应该在规则(第一行)中的引号中,并且在值(第二行)中前面有2个空格。

这成功映射到:

*** Keywords ***
there is an alert after "${time}" seconds
    there is an alert after seconds  ${time}