如何使用 Robot Framework 比较两个 csv 文件
Posted
技术标签:
【中文标题】如何使用 Robot Framework 比较两个 csv 文件【英文标题】:How to compare two csv files using Robot Framework 【发布时间】:2017-11-08 07:58:54 【问题描述】:我想使用机器人框架比较两个 csv 文件之间的差异。如果有差异,测试用例应该失败,如果没有差异,则通过。我在机器人框架中尝试了 DiffLibrary,但是当记录未排序时返回通过状态.有人可以指导我如何实现这一点,或者是否有其他方法可以做到这一点。
我的 first.csv 文件包含如下数据
Benchmark Name,Policy Name,No of Rules,Policy Measurement SLO,Policy Remediation SLO,No of Rules Compliant in MSLO,No of Rules Non-Compliant in RSLO,No of Rules Non-Compliant OUT RSLO
CIS Red Hat Enterprise Linux 6 Benchmark v1.0.0,PCI,281,1 MONTHS,1 MONTHS,150,130
CIS Red Hat Enterprise Linux 7 Benchmark v1.2.0,PCI,281,5 MONTHS,1 MONTHS,150,137
CIS Red Hat Enterprise Linux 7 Benchmark v1.5.0,PCI,281,1 MONTHS,1 MONTHS,150,135
我的 second.csv 文件有如下数据
Benchmark Name,Policy Name,No of Rules,Policy Measurement SLO,Policy Remediation SLO,No of Rules Compliant in MSLO,No of Rules Non-Compliant in RSLO,No of Rules Non-Compliant OUT RSLO
CIS Red Hat Enterprise Linux 7 Benchmark v1.2.0,PCI,281,5 MONTHS,1 MONTHS,150,137
CIS Red Hat Enterprise Linux 6 Benchmark v1.0.0,PCI,281,1 MONTHS,1 MONTHS,150,130
CIS Red Hat Enterprise Linux 7 Benchmark v1.5.0,PCI,281,1 MONTHS,1 MONTHS,150,135
机器人代码如下
*** Settings ***
Library DiffLibrary
Library OperatingSystem
*** Test Cases ***
Diffing two files one being different
Run Keyword And Expect Error differences* Diff Files first.csv second.csv
【问题讨论】:
【参考方案1】:只使用 BuiltIn 的应该等于字符串怎么样?
# Using Get File you easily get a file's content into a string variable
$csvA = Get File $filePathA
$csvB = Get File $filePathB
Should Be Equal As Strings $csvA $csvB
我使用该模型仅比较行,您可能需要编辑文件字符串以防文件编码存在差异(BOM 在文件开头留下特殊的 BOM 字符等)
【讨论】:
嗨 Lubos,感谢您的回复。即使行没有排序,它会给出相同的结果吗? 不,因为整个文件将被视为单个字符串,并且行顺序的任何更改都会使其不相等。 如果您不关心行顺序,只需执行以下操作: $csvA = 获取文件 $filePathA $csvA = 拆分为行 $csvA $csvB = 获取文件$filePathB $csvB = 拆分为行 $csvB 排序列表 $csvA 排序列表 $csvB 应该等于字符串 $csvA $csvB【参考方案2】:这个答案对我有用,即使数据已排序。如果没有不匹配,它将给出结果,如果数据不匹配,它将失败。
csv_difference.py
import sys
def csv_diff(file_f,file_g):
#file_f = sys.argv[1]
#file_g = sys.argv[2]
set_f = set()
set_g = set()
with open(file_f) as f:
line = f.readline().strip()
while line:
set_f.add(line)
line = f.readline().strip()
with open(file_g) as g:
line = g.readline().strip()
while line:
set_g.add(line)
line = g.readline().strip()
diff = set_f - set_g
# print set_f
# print set_g
# print diff
if diff:
#print "Data mismatch between the files"
return False
else:
#print " Data Matches "
return True
csv-difference.robot
*** Settings ***
Library OperatingSystem
Library csv_difference.py
*** Test Cases ***
CSV file comparison
$output= Run keyword csv diff first.csv second.csv
Should Be True '$output' == 'True'
【讨论】:
【参考方案3】:def csv_diff(file_f,file_g):
with open(file_f) as f:
textf = f.readlines()
textf.pop(1)
set_f = set(textf)
with open(file_g) as g:
textg = g.readlines()
textg.pop(1)
set_g = set(textg)
if set_f == set_g:
return True
return False
【讨论】:
以上是关于如何使用 Robot Framework 比较两个 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章
自动化测试框架Pytest和Robot Framework如何选择?