python - 嵌套字典和列表的操作
问题描述
我有包含以下格式的测试结果的文件:
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
)。
关于如何从这里取得进展的任何建议?当然,如果有更简单的存储方法,可以自由更改数据结构,因为我还很缺乏经验:)
解决方案
与其通过测试结果文件驱动输出,不如将读取测试结果和输出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'}]}
推荐阅读
- angular - 前端的服务器端进度状态
- android - 找不到 .adapter.GridViewAdapter$ItemViewHolder 的绑定构造函数
- go - 编译 Go 文件失败 - “初始化失败...xxxx 在此块中重新声明”
- git - 主提交合并后的 rebase 提交
- plugins - vagrant plugin vagrant-hostmanager 在windows 10上安装
- visual-studio-code - 隐藏活动缩进指南
- angular - Angular Material / Routing - sidenav 选择导致页面刷新
- php - 如何呈现包含在导航菜单中的类别设置为“否”?
- database - Clickhouse 表结构复制
- c# - 通过空保护的对象上的系统执行引擎异常