我正在汇总自动化测试生成的XML,在lambda函数中使用python解析XML并创建dynamoDB项。
最后,我需要每次测试的日期以及测试持续时间,并将计算一些基本统计信息,例如均值,stdev等。
当前,我使用的是非常扁平的结构:
{
"testName": string
"result": "SUCCESS",
"testEndedAt": timecode,
"testStartedAt": timecode,
"testRunID": string,
"timeAdded": time,
"totalTime": number
}
每次测试运行都会生成一个具有相同测试名称的新项目。
我将testName和testrunID用作主键和排序键。
我觉得我做某事的方式效率低下。我正在考虑转向这样的数据结构:
{
testname:string,
tests:[
{
timeAdded:timeStamp
testRunId:string,
testStartedAt:number,
testEndedAt:number,
totalTime:number
}
{
timeAdded:timeStamp
testRunId:string,
m__testStartedAt:number,
m__testEndedAt:number,
totalTime:number
}
],
stats:{
mean:number
stDev:number
maxExpectedTime:number
}
}
我看到这种方法有两个优点。
我将计算出的统计信息存储在表中 我可以使用测试名称和唯一密钥 我不必扫描整个数据库即可计算统计信息等
对此我几乎没有经验,我不知道如何最好地解决这个问题,更不用说回答它了。
感谢您的帮助!
答案 0 :(得分:0)
您可以继续使用原始结构:
{
"testName": string
"result": "SUCCESS",
"testEndedAt": timecode,
"testStartedAt": timecode,
"testRunID": string,
"timeAdded": time,
"totalTime": number
}
这样,您可以轻松查询(而不扫描)特定testName的结果。您可以对结果数据进行汇总操作,然后将其保存到具有不同GSI的同一表中。 (分区键为testName)。
{
"testName": string
"mean": "number",
"stDev": number,
"maxExpectedTime": number
}
如果您希望实时启用这些汇总统计信息,并将该表的流发送到lambda函数。根据传入的新数据增加这些计数。
答案 1 :(得分:0)
做这样的事情永远不是一个好主意: 测试:[...],此后在测试内部添加行。
为什么?
要在测试中添加新行,您必须阅读该项目,将其压入阵列并保存回去。每次写入都有一个额外的读取。
由于您正在读取数据并将其写回,因此有可能同时读取/写入 tests 属性,从而导致数据丢失。我已经看到了它的发生。
dynamodb中的项目大小限制为400k,因此您的测试数组只能添加有限的行数。