首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用迭代工具来简化这个嵌套的for循环?

如何使用迭代工具来简化这个嵌套的for循环?
EN

Stack Overflow用户
提问于 2022-07-16 07:46:16
回答 1查看 109关注 0票数 0

如何使用迭代工具来简化这个嵌套的for循环?

代码语言:javascript
代码运行次数:0
运行
复制
# pytest file:

def get_test_cases():

    with open("file_path.yml", "r", encoding="utf-8") as index_file:
        data = yaml.safe_load(index_file)

    for vendor_dict in data:
        for vendor_name, class_list in vendor_dict.items():
            for class_dict in class_list:
                for class_name, method_list in class_dict.items():
                    for method_dict in method_list:
                        for function, test_list in method_dict.items():
                            for test_case in test_list:
                                yield vendor_name, class_name, function, test_case

@pytest.mark.parametrize("iteration", get_test_cases())
def test_network(iteration, monkeypatch):
    """Performs pytest using info provided from test case"""

    (vendor_name, class_name, function, test_case) = iteration

    # Use data above to perform pytest
    # Code omitted

样本数据以YAML格式显示:

代码语言:javascript
代码运行次数:0
运行
复制
# YAML file:

- cisco:
    - CiscoClass:
        - get_interface_stats:
            - test_description: "test interface stats"
              function_input: "Gig1/1/1"
              expected_output: "show interfaces Gig1/1/1"

- juniper:
    - JuniperClass:
        - get_vlan_info: 
            - test_description: "test get_vlan_info"
              function_input: "10"
              expected_output: "show vlan 10"

解释

YAML文件包含用于构建测试用例的参数。我们为Cisco提供了一组测试用例,为Juniper提供了其他测试用例。所以这个结构是这个供应商->类的名称->函数->测试用例数据。

我的pytest文件中的函数get_test_cases将加载YAML文件内容,然后遍历内容,并为每个测试用例生成数据。函数test_network使用这些数据,并执行实际测试。

我试图找到一个替代嵌套的for循环,以便我可以提高我的皮棉评级.如果这是可能的话。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-16 20:55:23

您可以尝试以下方法使其更紧凑:

代码语言:javascript
代码运行次数:0
运行
复制
def testcases(data, level=0):
    if level == 3:
        for case in data:
            yield (case,)
    else:
        for record in data:
            for name in record:
                for case in testcases(record[name], level + 1):
                    yield (name,) + case

代码语言:javascript
代码运行次数:0
运行
复制
def testcases(data, level=0):
    if level == 6:
        for case in data:
            yield (case,)
    elif level % 2 == 0:
        for record in data:
            yield from testcases(record, level + 1)
    else:
        for name, records in data.items():
            for case in testcases(records, level + 1):
                yield (name,) + case

然后

代码语言:javascript
代码运行次数:0
运行
复制
def get_test_cases():
    with open("file_path.yml", "r", encoding="utf-8") as index_file:
        data = yaml.safe_load(index_file)
    yield from testcases(data)

使用您的示例文件如下

代码语言:javascript
代码运行次数:0
运行
复制
for case in get_test_cases():
    print(case)

代码语言:javascript
代码运行次数:0
运行
复制
('cisco', 'CiscoClass', 'get_interface_stats', {'test_description': 'test interface stats', 'function_input': 'Gig1/1/1', 'expected_output': 'show interfaces Gig1/1/1'})
('juniper', 'JuniperClass', 'get_vlan_info', {'test_description': 'test get_vlan_info', 'function_input': '10', 'expected_output': 'show vlan 10'})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73002476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档