0

我有以下 CSV 文件:

iDocType,iDocId,iName,iDate
P,555551555,Braiden,2022-12-31
I,100000001,Dominique,2024-12-10
P,100000002,Joyce,2025-11-15

使用 jmeter 的 JSR223 预处理器元素,我需要组成一个包含多个(基于参数化)子节点的 XML 父节点,并且每个节点必须包含具有这些 CSV 行中的每一个的值的属性。

我认为我需要一些方法来循环这个 CSV 文件并从每一行中提取值,直到我的所有目标对象都组合完毕。也许该方法应该有一个createMasterXml使用 2 个参数调用的方法,例如findTargetIdInCsvandtargetNumberOfXmlNodes和一个 for 循环,其中解析 csv 文件并使用 groovy.xml.MarkupBuilder 在其中组成子节点。但我不知道如何解决这个问题。

目标逻辑:

  1. 根据 ID 变量查找 csv 行
  2. 使用该 ID 找到的第一个行中的值组成第一个对象
  3. 向下查找下一个 csv 行
  4. 用第二行的值组成第二个对象.....
  5. 这样做直到创建了目标数量的对象
  6. 如果到达文件末尾,则从文件的顶行开始(不带标题)

例如,给定上述 csv 文件:

I get a variable docId populated with the value 100000001 which is found on the 2nd row of data in the csv file (ignoring the header);

I define a variable numberOfNodes = 3;

然后我期望这个映射创建一个对象:

child node 1 - ValuesFromCsvRow2

child node 2 - ValuesFromCsvRow3 

child node 3 - ValuesFromCsvRow1

更新:JSR223 PreProcessor 代码:(注意,使用这种当前方法,我无法根据上述预期逻辑组合子节点对象,因为当前方法无法处理解析 CSV 文件和提取值 - 我错过了这样做的知识

//input from csv file
docType = vars.get('iDocType').toString()
docId = vars.get('iDocId').toString()
name = vars.get('iName').toString()
date = vars.get('iExpiryDate').toString()

def numberOfNodes = 3

def writer = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(writer)

xml.nodes() {
createNode(xml, numberOfNodes, 'ID0000')
}

def createNode(builder, repeat, pReqID) {
   for (int i = 0 ; i < repeat ; i++) {
       builder.object(a:'false', b:'false', pReqID:pReqID +(i+1).toString()) {
        builder.al(ad:'2021-09-20', alc:'bla', bla:'2021-09-20T11:00:00.000Z', sn:'AB8912')
        builder.doc( docType: docType, docId: docId, name: name , date:date )
       }
    }
}

def nodeAsText = writer.toString()
//log.info(nodeAsText)

vars.put('passengers3XmlObj', nodeAsText)   

代码行中的值builder.doc是我需要在每个节点创建时根据源 csv 文件中每一行的值更改的值。

目前,在这种情况下,我的主对象看起来像这样,因为在每次 jmeter 迭代中,我只知道如何从 csv 文件中的一行中获取值,每个采样器(使用 CSV 数据集测试计划元素):

<objects>
  <object a='false' b='false' pReqID='ID00001'>
    <al ad='2021-09-20' alc='bla' bla='2021-09-20T11:00:00.000Z' sn='AB8912' />
    <doc docType='P' docId='100000001' date='2024-12-10' name='Dominique' />
  </object>
  <object a='false' b='false' pReqID='ID00002'>
    <al ad='2021-09-20' alc='bla' bla='2021-09-20T11:00:00.000Z' sn='AB8912' />
    <doc docType='P' docId='100000001' date='2024-12-10' name='Dominique' />
  </object>
  <object a='false' b='false' pReqID='ID00003'>
    <al ad='2021-09-20' alc='bla' bla='2021-09-20T11:00:00.000Z' sn='AB8912' />
    <doc docType='P' docId='100000001' date='2024-12-10' name='Dominique' />
  </object>
</objects>

但是,我需要它看起来像这样,保持目标逻辑的中间:

<objects>
  <object a='false' b='false' c='ID00001'>
    <al ad='2021-09-20' alc='bla' dt='2021-09-20T11:00:00.000Z' sn='AB8912' />
    <doc docType='I' docId='100000001' date='2024-12-10' name='Dominique' />
  </object>
   <object a='false' b='false' c='ID00002'>
    <al ad='2021-09-20' alc='bla' dt='2021-09-20T11:00:00.000Z' sn='AB8912' />
    <doc docType='P' docId='100000002' date='2025-11-15' name='Joyce' />
  </object>
  <object a='false' b='false' c='ID00003'>
    <al ad='2021-09-20' alc='bla' dt='2021-09-20T11:00:00.000Z' sn='AB8912' />
    <doc docType='P' docId='555551555' date='2022-12-31' name='Braiden' />
  </object>
</objects>  

有人可以帮我实现这一目标吗?

4

1 回答 1

1

默认情况下, CSV 数据集配置会在每个虚拟用户的每次迭代中读取下一行。共享模式设置可以在一定程度上控制该行为,但没有一种共享模式适合一次读取 CSV 文件的全部内容。

如果您想一次性解析 CSV 文件中的所有条目 - 在 Groovy 本身中进行读取/解析

就像是:

def writer = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(writer)
def pReqID = 'ID0000'
def lines = new File('test.csv').readLines()


xml.nodes() {
    1.upto(lines.size() - 1, { lineNo ->
        xml.object(a: 'false', b: 'false', pReqID: pReqID + (lineNo).toString()) {
            xml.al(ad: '2021-09-20', alc: 'bla', bla: '2021-09-20T11:00:00.000Z', sn: 'AB8912')
            xml.doc(docType: lines.get(lineNo).split(',')[0],
                    docId: lines.get(lineNo).split(',')[1],
                    name: lines.get(lineNo).split(',')[2],
                    date: lines.get(lineNo).split(',')[3])
        }
    })
}

def nodeAsText = writer.toString()
于 2021-10-20T05:27:35.763 回答