【问题标题】:PyTest-BDD : Support for data tables without Scenario OutlinePyTest-BDD : 支持没有 Scenario Outline 的数据表
【发布时间】:2019-04-25 02:32:32
【问题描述】:

我有以下图片作为测试用例

]1

使用behaviour的时候,我们写的是这样的场景

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 文档,他们对 Scenario Outline 的支持。

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

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

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

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

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

【问题讨论】:

    标签: pytest bdd


    【解决方案1】:

    希望这会有所帮助...

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

        |  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)
    

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多