PyTest-BDD:支持没有场景大纲的数据表

PyTest-BDD : Support for data tables without Scenario Outline

我有下图作为测试用例

]1

在使用 behave 的时候,我们写了一个这样的场景

Given When user is logged in to the platform
When user opens the settings window
Then user should see the following values
    | Field                 | Value              |
    | Currency              | Reported currency  |
    | Conversion Method     | MI recommended     |
    | Magnitude             | Millions (6)       |
    | Display Null Value As | SOA_Null           |
    | Function Options      | Excluded from export |
    | Dynamic Field Labels  | Excluded from export |

我们现在正在迁移到 Pytest-BDD 而不是 Behave。但是我在 Pytest 中找不到对上述案例的支持。我浏览了 Pytest-BDD 文档,他们的支持是针对场景大纲的。

https://pytest-bdd.readthedocs.io/en/latest/

但我的案例不是场景大纲,因为我只需要 运行 这个场景一次,而不是迭代上面提到的字段值对

我也调查了 github 我能找到的最接近的是这个,但这似乎还没有被批准。

https://github.com/pytest-dev/pytest-bdd/pull/180

Pytest是否支持以任何方式实现上述场景?是否有解决方法(如果不是直接的方法)来处理它?

希望这对您有所帮助...

那么响应应该有以下属性:

    |  attr                     |
    |  id                       |
    |  activityId               |
    |  activityName             |
    |  activityType             |
    |  processDefinitionId      |
    |  processDefinitionUrl     |
    |  processInstanceId        |
    |  processInstanceUrl       |
    |  executionId              |
    |  taskId                   |
    |  calledProcessInstanceId  |
    |  assignee                 |
    |  startTime                |
    |  endTime                  |
    |  durationInMillis         |
    |  tenantId                 |


Then verify response attribute values:
    |attr             |   attr_value        | path                  |
    |activityId       |   endProcessSubmit  | data[0].activityId    |
    |activityType     |   endEvent          | data[0].activityType  |


@then(parsers.parse ('response should have below attributes:\n{attr_table}'))

def verify_response_attributes(datatable,attr_table,query_historic_activity_instances):
    query_data = query_historic_activity_instances.json()['data']
    BaseTest.verify_tbl_attr(attr_table,query_data)

@then(parsers.parse('verify response attribute values:\n{attr_value_table}'))

def verify_response_attribute_values(datatable,attr_value_table,query_historic_activity_instances):
    query_data = query_historic_activity_instances.json()
    BaseTest.verify_tbl_attr_values(attr_value_table, query_data)


  @staticmethod
    def verify_tbl_attr_values(table_with_header,query_data):
        # datatable = parse_str_table(attr_value_table)
        list_attr=BaseTest.get_tbl_attr_values(table_with_header)
        # for row in range(len(datatable.rows)):
        #     attr = list(datatable.rows[row].values())[0]
        #     attr_val = list(datatable.rows[row].values())[1]
        #     path = list(datatable.rows[row].values())[2]
        for i in range(len(list_attr)):
            attr = list_attr[i][0]
            attr_val = list_attr[i][1]
            path = list_attr[i][2]
            for match in parse(path).find(query_data):
                assert attr_val == match.value, "The expected %s and Actual %s for %s Dint match" % (
                attr_val, match.value, attr)

    @staticmethod
    def get_tbl_attr_values(table_with_header):
        datatable = parse_str_table(table_with_header)
        list_attr_val = []
        for row in range(len(datatable.rows)):
            list_attr_val.append(list(datatable.rows[row].values()))
        return list_attr_val

    @staticmethod
    def verify_tbl_attr(table_with_header,query_data):
        list_attr = BaseTest.get_tbl_attr(table_with_header)
        for i in range(len(query_data)):
            for j in range(len(list_attr)):
                assert list_attr[j] in query_data[i],"Response don't have %s" % list_attr[j]

    @staticmethod
    def get_tbl_attr(table_with_header):
        datatable = parse_str_table(table_with_header)
        list_attr = []
        for row in datatable.rows:
            for item in row:
                list_attr.append(row[item])
        return (list_attr)

    @staticmethod
    def verify_tbl_attr_by_column(table_with_header):
        datatable = parse_str_table(table_with_header)
        list_attr = []
        for column in datatable.columns.values():
                list_attr.append(column)
        return (list_attr)

除了上面给出的答案外,以下方法将有助于将字符串转换为步骤定义中的数据-table:

def parse_str_table(self, table_with_headers):
    list_table_rows = table_with_headers.split("\n")
    list_headers = str(list_table_rows[0]).strip("|").split("|")
    dict_table = {}
    for header in list_headers:
        header_text = header.strip()
        lst_row = []
        for i in range(1, list_table_rows.__len__()):
            list_temp = list_table_rows[i].strip("|").split("|")
            lst_row.append(list_temp[list_headers.index(header)].strip())

        dict_table[header_text] = lst_row

    return dict_table