将测试树从JMeter导出到文本

哈Ha!


我从事大型集成项目(IBM WAS,WebSphere MQ,Oracle)的工作,并在JMeter中用功能测试网络包装了这家血腥的企业,该网络在测试台上运行,并在部署新版本后唤醒Jenkins。 随着测试数量的增加,我遇到了使测试文档保持最新的问题。


JMeter中的测试树本身实质上是一个文档-将中断功能分成逻辑块,控制器在交易中包含测试,并且控制器中的每个采样器都是一个单独的步骤。 从服务逻辑的角度来看,对象的层次结构已明确编号,但断言,计时器和其他不那么有趣的服务除外。


结果是一个相当准确的图片:


图片

但是,并非每个经理都准备在家中启动JMeter来查看质量检查领域的情况。 历史上,所有项目文档都保存在Confluence。
在JMeter中开发测试用例之后,我还不准备将测试用例的描述手动复制到Confluence页面。 绝望的搜索没有结果-我没有找到一种现成的简单的解决方案,用于将一棵对象树从JMeter导出到文本( 如果有的话,请在注释中写上它,我将用“我可以谷歌”小部件撒一些灰 )。


在查看了JMX文件(JMeter测试计划的标准扩展)之后,我发现所有感兴趣的对象都标记了testname属性:


样本JMX文件切片
<AuthManager guiclass="AuthPanel" testclass="AuthManager" testname="1.4.2   " enabled="true"> <collectionProp name="AuthManager.auth_list"> <elementProp name="" elementType="Authorization"> <stringProp name="Authorization.url">http://${ipKvp}:${portKvp}/TKVPImportTemporary</stringProp> <stringProp name="Authorization.username">${userKvp}</stringProp> <stringProp name="Authorization.password">${passKvp}</stringProp> <stringProp name="Authorization.domain">${domainKvp}</stringProp> <stringProp name="Authorization.realm"></stringProp> </elementProp> </collectionProp> <boolProp name="AuthManager.clearEachIteration">true</boolProp> </AuthManager> 

剩下的唯一事情就是编写一个解析器:


  1. 所需的文本以及JMX文件中步骤\测试\组的描述
  2. 用不感兴趣的对象(断言,计时器等)的描述引发一行
  3. 它将所有内容写入文件,以便文档更新包括一个孤独的复制粘贴

第1段已由正则表达式成功处理:


(?<= testname = \“)(。*)(?= \”)

不使用在编写用于硒测试的选择器的过程中获得的xpath的反射使我免于使用xpath选择器。


由于我没有在树中编号服务对象,因此第2项在循环中的实现没有问题,其中:


  • 我得到了字符串的第一个字符
  • 我带到int
  • 如果成功,则在列表中写一行
  • 否则忽略
      try (BufferedReader br = new BufferedReader(new FileReader(JMX_FILE))) { String line; while ((line = br.readLine()) != null) { Matcher m1 = p.matcher(line); if (m1.find()) { try { Integer.parseInt(m1.group().substring(0, 1)); matchd.add(m1.group()); } catch (NumberFormatException e) { System.out.println(m1.group().substring(0, 1) + ": excluding non-number string"); } } } } 

而且,由于文件是从上到下连续处理的,因此树中对象的编号遵循清晰的逻辑,因此,对于第3项,也无需发明任何可怕的东西:


  FileWriter writer = null; try { writer = new FileWriter(RESULT_FILE); for (String str : matchd) { writer.write(str + "\n"); } } finally { if (writer != null) { writer.close(); } } 

最终结果适合一小类(约50行):


源代码
 import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class App { private static final String SAMPLER_NAME_REGEXP = "(?<=testname=\")(.*)(?=\" )"; private static final File JMX_FILE = new File("C:\\temp\\Test-plan.jmx"); private static final File RESULT_FILE = new File("C:\\temp\\output.txt"); public static void main(String[] args) throws IOException { Pattern p = Pattern.compile(SAMPLER_NAME_REGEXP); List<String> matchd = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(JMX_FILE))) { String line; while ((line = br.readLine()) != null) { Matcher m1 = p.matcher(line); if (m1.find()) { try { Integer.parseInt(m1.group().substring(0, 1)); matchd.add(m1.group()); } catch (NumberFormatException e) { System.out.println(m1.group().substring(0, 1) + ": excluding non-number string"); } } } } if (RESULT_FILE.delete()) { System.out.println("Deleting previous result file"); } else { System.out.println("Creating new result file"); } FileWriter writer = null; try { writer = new FileWriter(RESULT_FILE); for (String str : matchd) { writer.write(str + "\n"); } } finally { if (writer != null) { writer.close(); } } } } 

作为一个实验,我试图将该代码直接集成到JMeter测试计划中,但是遇到了误解泛型和导入的问题,到目前为止,我决定对在IDEA中调用结果树导出器感到满意。


照顾好你的时间。 并感谢您的收看。


图片

Source: https://habr.com/ru/post/zh-CN413481/


All Articles