在通过ant批量执行jmeter过程中,因为大家分模块把用例都放在不同文件夹,而build.xml文件只能执行固定某一文件夹路径下的用例,
所以需要在执行ant前,先收集当前一共有几个文件夹名称,然后写入到指定的位置中,才能执行所有的用例
import os
from xml.etree.ElementTree import ElementTree,Element
def read_xml(in_path):
'''''读取并解析xml文件
in_path: xml路径
return: ElementTree'''
tree = ElementTree()
tree.parse(in_path)
return tree
def write_xml(tree, out_path):
'''''将xml文件写出
tree: xml树
out_path: 写出路径'''
tree.write(out_path, encoding="utf-8", xml_declaration=True)
def if_match(node, kv_map):
'''''判断某个节点是否包含所有传入参数属性
node: 节点
kv_map: 属性及属性值组成的map'''
for key in kv_map:
if node.get(key) != kv_map.get(key):
return False
return True
# ----------------search -----------------
def find_nodes(tree, path):
'''''查找某个路径匹配的所有节点
tree: xml树
path: 节点路径'''
return tree.findall(path)
def get_node_by_keyvalue(nodelist, kv_map):
'''''根据属性及属性值定位符合的节点,返回节点
nodelist: 节点列表
kv_map: 匹配属性及属性值map'''
result_nodes = []
for node in nodelist:
if if_match(node, kv_map):
result_nodes.append(node)
return result_nodes
def create_node(tag, property_map):
'''新造一个节点
tag:节点标签
property_map:属性及属性值map
content: 节点闭合标签里的文本内容
return 新节点'''
element = Element(tag, property_map)
# element.text = content
return element
def add_child_node(nodelist, element):
'''''给一个节点添加子节点
nodelist: 节点列表
element: 子节点'''
for node in nodelist:
node.append(element)
l=[]
def file_name(file_path):
for root, dirs, files in os.walk(file_path):
l.append(root)
return l
if __name__ == "__main__":
################ 1. 读取xml文件 ##########
tree = read_xml("frombuild.xml")
################ 2. 属性修改 ###############
nodes = find_nodes(tree, "target/jmeter") # 找到父节点
# print(nodes)
result_nodes = get_node_by_keyvalue(nodes, {"jmeterhome": "${jmeter.home}"}) # 通过属性准确定位子节点
# print(result_nodes)
################# 3.节点修改 ##############
file_name (r'D:\project\pc_requests\dev\WeiDian-Jmeter\case')
for i in range(len(l)):
a = create_node("testplans",{"dir": l[i], "includes": "*.jmx"}) # 新建节点
add_child_node(result_nodes, a) # 插入到父节点之下
write_xml(tree, "./build.xml")
参考:
https://blog.csdn.net/wsp_1138886114/article/details/86576900