首页 > 解决方案 > 嵌套字典和列表的操作

问题描述

我有包含以下格式的测试结果的文件:

TEST1=passed
TEST2=failed
TEST3=passed

我想将测试与其范围进行比较:

test_scope = {
    'SCOPE1': [
        'TEST1',
        'TEST2',
    ],
    'SCOPE2': [
        'TEST3',
    ],
    'SCOPE3': [
        'TEST4',
        'TEST5',
    ],
    'SCOPE4': [
        'TEST6',
        'TEST7',
    ],
}

理想的输出是:

test_results = {
    "SCOPE1": [
        {
            "name": "TEST1", 
            "result": "passed"
            "id": 0
        },
        {
            "name": "TEST2", 
            "result": "failed"
            "id": 1
        },
    ],
    "SCOPE2": [
        {
            "name": "TEST3", 
            "result": "passed"
            "id": 1
        },
    ],
    "SCOPE3": [
        {
            "name": "TEST4", 
            "result": "not run"
            "id": 1
        },
        {
            "name": "TEST5", 
            "result": "not run"
            "id": 1
        },
    ]
    "SCOPE4": [
        {
            "name": "TEST6", 
            "result": "not run"
            "id": 0
        },
        {
            "name": "TEST7", 
            "result": "not run"
            "id": 1
        },
    ],
}

id列表中的 testname 索引在哪里test_scope

我所取得的成就:

class TBD(object):
   def get_test_results(self, path, results_file):
        test_results = []
        with open('path', 'r') as results_file:
            lines = results_file.readlines()
            for line in lines:
                test_case = line.rstrip().split('=')[0]
                test_result = line.rstrip().split('=')[1]
                for section, tests in test_scope.iteritems():
                    if test_case in tests:
                        section = section
                        id = tests.index(test_case)
                        test_results.append({'name': test_case,
                                             'result': test_result,
                                             'section': section,
                                             'id': id)
        return test_results

带输出:

[{'id': 0, 
  'section': 'SCOPE1', 
  'name': 'TEST1', 
  'result': 'passed'},
...]

但是我被卡住了,不知道如何获得未运行结果的测试用例(那些存在于test_scope但不存在于 中的测试用例test_results)。

关于如何从这里取得进展的任何建议?当然,如果有更简单的存储方法,可以自由更改数据结构,因为我还很缺乏经验:)

标签: python

解决方案


与其通过测试结果文件驱动输出,不如将读取测试结果和输出test_results数据结构分成两个单独的步骤。

第一步,读取文件,并将信息存储到字典中,映射测试名称 -> 结果。在第二步中,test_results通过遍历test_scope数据结构来生成输出,使用步骤 1 生成的字典来确定测试结果。这使得包含来自 的所有条目变得微不足道test_scope,即使测试不是测试运行的一部分。

# step 1, read the results file
results = {}
with open('path', 'r') as results_file:
    results = dict(line.strip().split('=') for line in results_file if line.strip())

# step 2, build the output
test_results = {
    scope: [
        {
            "id": i,
            "name": test_name,
            "result": results.get(test_name, "not run"),
        } for i, test_name in enumerate(tests)
    ] for scope, tests in test_scope.iteritems()
}

演示:

>>> from io import BytesIO
>>> results_file_data = '''\
... TEST1=passed
... TEST2=failed
... TEST3=passed
... '''
>>> with BytesIO(results_file_data) as results_file:
...     results = dict(line.strip().split('=') for line in results_file if line.strip())
...
>>> test_results = {
...     scope: [
...         {
...             "id": i,
...             "name": test_name,
...             "result": results.get(test_name, "not run"),
...         } for i, test_name in enumerate(tests)
...     ] for scope, tests in test_scope.iteritems()
... }
>>> from pprint import pprint
>>> pprint(test_results)
{'SCOPE1': [{'id': 0, 'name': 'TEST1', 'result': 'passed'},
            {'id': 1, 'name': 'TEST2', 'result': 'failed'}],
 'SCOPE2': [{'id': 0, 'name': 'TEST3', 'result': 'passed'}],
 'SCOPE3': [{'id': 0, 'name': 'TEST4', 'result': 'not run'},
            {'id': 1, 'name': 'TEST5', 'result': 'not run'}],
 'SCOPE4': [{'id': 0, 'name': 'TEST6', 'result': 'not run'},
            {'id': 1, 'name': 'TEST7', 'result': 'not run'}]}

推荐阅读