解释这一行 testRunner.testCase.getTestStepByName

explain this line testRunner.testCase.getTestStepByName

我是 groovy.I 的新手,无法理解 testRunner 和 testCase 到底是什么?我知道我们为什么要使用 them.but 他们在这里的工作方式。

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
import java.lang.*
import java.io.*
def ac,dc,class1,cn,dd,fn,not
BufferedReader br= new BufferedReader (new FileReader (new File("C:\Users\Administrator\Desktop\data1.csv")))
def rows = br.readLines()
def rowSize = rows.size()
testRunner.testCase.getTestStepByName("MyProperties").setPropertyValue("rows",rowSize.toString())
def i = Integer.parseInt(testRunner.testCase.getTestStepByName("MyProperties").getPropertyValue("count"))
if (i<rowSize)
{
      String []row= rows[i].split(",")
      dc=row[1]
      ac=row[2]
      class1=row[3]
      cn=row[4]
      dd=row[5]
      not=row[6]
testRunner.testCase.getTestStepByName("MyProperties").setPropertyValue("dc",dc)
testRunner.testCase.getTestStepByName("MyProperties").setPropertyValue("ac",ac)
testRunner.testCase.getTestStepByName("MyProperties").setPropertyValue("class1",class1)
testRunner.testCase.getTestStepByName("MyProperties").setPropertyValue("cn",cn)
testRunner.testCase.getTestStepByName("MyProperties").setPropertyValue("dd",dd)
testRunner.testCase.getTestStepByName("MyProperties").setPropertyValue("not",not)

}

testRunner 是一个特殊的对象,它 SOAPUI 放在上下文中以提供访问与测试执行直接相关的不同属性的能力。例如,您还要求访问 testCase 属性。在这种情况下,testCase 是一个 属性,它包含当前 运行 的测试对象,并允许您 "play" 使用它们。在 SOAPUI documentation 中,所有这些内容都得到了很好的解释。

除了关于代码的@tim_yates 评论之外,还可以考虑使用变量来保持代码的整洁和可读性,而不是一直使用 getter 访问相同的代码,事实上,您的代码可以重写如:

def ac,dc,class1,cn,dd,fn,not

def rows = new File("C:\Users\Administrator\Desktop\data1.csv").withReader{ it.readLines() }
def rowSize = rows.size()

def myProps = testRunner.testCase.getTestStepByName("MyProperties")

myProps.setPropertyValue("rows",rowSize.toString())

def i = Integer.parseInt(myProps.getPropertyValue("count"))

if (i<rowSize)
{
    String [] row= rows[i].split(",")
    // Note that array are 0-based index and your accessing directly
    // the second position
    dc=row[1]
    ac=row[2]
    class1=row[3]
    cn=row[4]
    dd=row[5]
    not=row[6]
    myProps.setPropertyValue("dc",dc)
    myProps.setPropertyValue("ac",ac)
    myProps.setPropertyValue("class1",class1)
    myProps.setPropertyValue("cn",cn)
    myProps.setPropertyValue("dd",dd)
    myProps.setPropertyValue("not",not)
}

另一个改进可能是使用 属性 名称和值创建一个地图来迭代认为它设置 属性 值:

def ac,dc,class1,cn,dd,fn,not

def rows = new File("C:\Users\Administrator\Desktop\data1.csv").withReader{ it.readLines() }
def rowSize = rows.size()

def myProps = testRunner.testCase.getTestStepByName("MyProperties")

myProps.setPropertyValue("rows",rowSize.toString())

def i = Integer.parseInt(myProps.getPropertyValue("count"))

if (i<rowSize)
{
    def values = rows[i].split(",")
    // I start with "notUsed" since in original code [0] postion is not used
    def names = ["notUsed","dc","ac","class1","cn","dd","not"]
    // create a map an iterate over it
    [names,values].transpose().collectEntries { it }.each{ name, value ->
        myProps.setPropertyValue(name,value);
    }
}

希望对您有所帮助,