概述
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进行测试所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复