我是靠谱客的博主 飞快绿草,最近开发中收集的这篇文章主要介绍2.6循环CSV文件中的数据并使用Groovy进行测试,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2.6循环CSV文件中的数据并使用Groovy进行测试

         不管是为了加载测试数据或者是写报告,自动化测试的关键一点是使用外部数据文件。一般而言,可能需要从文件读取测试数据并循环执行一些测试步骤,直到没有更多数据为止。在该部分,将学到“如何使用多个可重用的Groovy TestSteps轻松实现这一点”。

2.6.1 准备阶段

    例如,我们需要使用一个小的CSV文件,该文件用来存放invoice的数据,我们需要使用这些数据进行测试,该文件存放的内容如下:

1,comp1,100.0,2014-12-0100:00:00
2,comp2,200.0,2014-12-0200:00:00
3,comp3,300.0,2014-12-0300:00:00

你可以在本章实例位置找到文件件:invoice.csv,截图如下:

    我们将读取每行并将这些值提取到属性中,例如,做一些有用的事情或者填充Web服务请求。提供了一个完整的SoapUI项目GroovyFiles-soapui-project.xml,在上述截图中可以看到该项目。

2.6.2 操作步骤

         我将操作分解成三个独立的GroovyTestStep:一个用于读取测试数、一个用于提取数据、一个用于循环所有行。执行步骤如下:

    一、创建一个项目,带有TestSuite和TestCase,然后创建一个GroovyTestStep重命名为LoadAllTestDataFromFile

    二、给LoadAllTestDataFromFile添加如下代码,截图如下:

    添加的代码如下:

context["rows"]=[]
//Change this to the location of your CSV file.
File testDataFile = new File("D:/soapUICookBook
/SoapUI-Cookbook-master/Chapter2/chapter2/invoices.csv")
testDataFile.eachLine {content, lineNumber ->
context["rows"] << content
}
//Initialise row counter
context["currentRowIndex"]=0
return "Loaded ${context["rows"].size()} rows."

         在运行代码之前,要确定文件的路径是正确的,修改为本地文件所在的路径。该段代码是加载CSV的所有行到一个List中并初始化行计数变量

    三、创建一个Groovy TestStep命名为“GetNextRowAndExractValues”,添加如下代码:       

def currentRowIndex = context["currentRowIndex"]
//Get values from csv row
def rowItems = context["rows"][currentRowIndex].split(/,/)
def invoiceId = rowItems[0]
def invoiceCompany = rowItems[1]
def invoiceAmount = rowItems[2]
def invoiceDueDate = rowItems[3]
//Increment counter
context["currentRowIndex"] = currentRowIndex + 1
return "Row #$currentRowIndex processed."

    截图如下:

    在这步,我们提取所有字段,以便做一些有用的事情,并增加行计数器

四、最后,创建一个GroovyTestStep命名为“LoopIfMoreRows”,添加如下代码:

def currentRowIndex = context["currentRowIndex"]

if (currentRowIndex < context["rows"].size)

testRunner.gotoStepByName("GetNextRowAndExractValues")


五、现在运行包含三个GroovyTestStep的TestCase,将看到如下信息:

运行结果截图:

这个例子没有实际使用测试数据,但是下一步对我们而言将会简单点!

TIP:Granular Groovy TestSteps(颗粒化Groovy TestSteps)

虽然前面的3个步骤可以用一个单独的GroovyTestStep来替代,但如果步骤保持独立和很好的命名,它对于重用和可读性都很有帮助。

2.6.3 工作原理

         第一步利用GroovyFile类读入invoices.csv文件。Groovy File类比标准的Java类更方便使用,它对于通过Groovy实现自动化非常重要。eachLine方法允许我们把CSV文件中每行内容添加到一个rows集合中,该集合存储在SoapUI的上下文中。

TIP:SoapUI(TestCase)上下文变量

        该变量用来保存状态(state)或者TestStep之间传递的上下文(context)。这是存储后续TestSteps所需属性的好地方。当测试完成时,添加到上下文对象的属性会丢失。基本术语,上下文对象(context)是java.util.Map的一个实现(implementation),但是事实上context对象的实现依赖于TestStep运行顺序。

            当TestStep作为TestCase的一部分运行时wsdlTestRunContext被调用

            当运行单个TestStep时,MockTestRunContext被调用

            当TestStep作为安全扫描的一部分运行时,将使用SecurityTestRunContext。查看第7章“测试安全Web服务”中的扫描Web服务安全漏洞配方。

            还有一个WsdlMockRunContext类型的模拟context对象。查看第3章,“开发和部署动态REST和SOAP Mocks”

我们还将currentRowIndex添加到context对象,以便在我们遍历每行的TestSteps时跟踪当前行。

该项目中名为GetNextRowAndExractValues的Groovy TestStep从context中获取当前行并用逗号分隔行字符串以获取字段值数组。最后,currentRowIndex会递增,并返回经过处理的文本行#$currentRowIndex,以在TestCase窗口中提供一些调试输出。它位于GetNextRowAndExractValues Groovy TestStep内部,可以使用invoiceCSV值(提取到变量invoiceId,invoiceCompany,invoiceAmount和invoiceDueDate)来测试某些内容,或者将它们传递给另一个TestStep,例如,使用它们填充Web服务请求(请参阅下面的例子)。

            最后,LoopIfMoreRows TestStep检查是否有剩下的行,如果是,则使用tesRunner.gotoStepByName()方法重复GetNextRowAndExtractValuesTestStep。

 

应用CSV数据的操作实例

         基于之前的实例,invoiceCSV的值可以用在web服务的请求中。为此,需要将invoice值放在可以从后续REST测试请求TestStep或(SOAP)测试请求TestStep访问它们的地方。参考”1.7使用REST discovery(pro)生成SoapUI测试”创建post请求测试,在此不做赘述:

    我创建的项目为“Project1”,找到本部分的项目“Project 4”。通过“Clone TestStep”复制“Project 4”的”Groovy TestStep”到”Project 1”中,操作步骤:

        一、在“Project 4”中随便找一个“GroovyTestStep”,本例以“LoopIfMoreRows”未操作对象,右击该TestStep在菜单中点击“Clone TestStep”

        二、弹出窗口“Clone TestStep”如下截图所示:

        按照如下截图所示进行设置:

        三、重复步骤一、步骤二,操作完成截图如下所示:

        四、通过拖动TestStep调整执行顺序,调整后的截图如下:

           五、点开“GetNextRowAndExtractValues”,在添加下图红色框选出来的代码:

    修改后的代码如下:

def currentRowIndex = context["currentRowIndex"]
//Get values from csv row
def rowItems = context["rows"][currentRowIndex].split(/,/)
def invoiceId = rowItems[0]
def invoiceCompany = rowItems[1]
def invoiceAmount = rowItems[2]
def invoiceDueDate = rowItems[3]
 
context["invoiceId"] =invoiceId
context["invoiceCompany"]=invoiceCompany
context["invoiceAmount"]=invoiceAmount
//Increment counter
context["currentRowIndex"] = currentRowIndex + 1
return "Row #$currentRowIndex processed."

添加的那部分代码,是为了使用${property}语法把context属性传递到POST REST请求测试步骤创建invoice的请求数据body中:

{"Invoice": {

   "id":"${invoiceId}",

   "companyName":"${invoiceCompany}",

   "amount":"${invoiceAmount}"

}}

给POST添加了两个断言,截图如下:

        六、启动rest服务,进入到第一章的rest的CURD路径下启动如下,运行测试用例,截图如下:

TIP:上下文属性的作用域

         与其他SoapUI对象属性(例如项目级别属性)不同,当直接使用属性扩展语法进行引用时,上下文(context)对象属性不需要#scope限定符,如上例所示。 有关如何使用PropertyExpansion语法引用其他类型属性的示例,请参阅http://www.soapui.org/scripting-properties/property-expansion.html。

最后

以上就是飞快绿草为你收集整理的2.6循环CSV文件中的数据并使用Groovy进行测试的全部内容,希望文章能够帮你解决2.6循环CSV文件中的数据并使用Groovy进行测试所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部