如何使用 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 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Robot Framework 中返回两个值

自动化测试框架Pytest和Robot Framework如何选择?

在 Robot Framework 中减去两个 dict 值

python+robot framework接口自动化测试

python+robot framework接口自动化测试

如何使用 Robot Framework 从测试套件运行特定的测试用例