在日常的软件测试工作中,我们常常使用 XMind 来整理测试用例。XMind 的可视化结构让用例层次清晰、逻辑直观,但当我们需要将这些用例导入到测试管理平台(如 TestRail、禅道、Jira 等)时,就需要把它们转换成 CSV 文件。本文就分享一个简单易行的方法。
为什么需要转换
- 批量导入:测试管理平台通常支持 CSV 批量导入,避免重复手动录入。
- 结构清晰:XMind 中的测试用例按模块、功能、子功能组织,转换成 CSV 后便于统一管理。
- 提高效率:特别是面对上百条用例时,自动化转换节省大量时间。
说明
这里我用到的xminf版本是图中这个,其他版本自测
准备工作
- XMind 文件:确保你的测试用例已经整理好,最好按照模块-功能-用例步骤的层级结构。
操作步骤
1. XMind文件格式
目前脚本按这个格式处理的,可以根据自己的需求部分代码
2. 编写转换脚本
用 Java 可以快速把文本解析成 CSV,例如:
[code]import com.fasterxml.jackson.databind.JsonNode;import com.fasterxml.jackson.databind.ObjectMapper;import com.opencsv.CSVWriter;import java.io.FileNotFoundException;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.nio.file.Path;import java.nio.file.Paths;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.Scanner;import java.util.concurrent.atomic.AtomicReference;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;public class XmindToCsvConverter { public static void main(String[] args) throws Exception { // XMind 文件路径 String xmindFile = "/Users/xx.xmind"; convertXmindToCsv(xmindFile); } public static void convertXmindToCsv(String xmindFile) throws Exception { // 1. 解压 XMind 并读取 content.json String jsonContent = extractJsonFromXmind(xmindFile); ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonContent); // 获取根节点的名称,作为 CSV 文件名 String rootTitle = rootNode.get(0).get("rootTopic").get("title").asText(); // 确定 CSV 文件路径(与 XMind 文件同目录) Path xmindPath = Paths.get(xmindFile); // 获取 XMind 所在目录 String outputDir = xmindPath.getParent().toString(); // 生成 CSV 文件路径 String outputCsv = outputDir + "/用例csv/" + rootTitle + ".csv"; System.out.println("CSV文件名: " + outputCsv); // 2. 解析 JSON 生成测试用例 List testCases = new ArrayList(); // CSV 表头 testCases.add(new String[]{"模块", "用例标题", "前置条件", "步骤ID", "步骤", "预期结果"}); // 变量存储上一个节点信息 AtomicReference lastModule = new AtomicReference(""); AtomicReference lastCaseTitle = new AtomicReference(""); AtomicReference lastPrecondition = new AtomicReference(""); AtomicReference isFirstStep = new AtomicReference(true); // 遍历 XMind 结构 for (JsonNode sheet : rootNode) { traverseNode(sheet.get("rootTopic"), new ArrayList(), testCases, lastModule, lastCaseTitle, lastPrecondition, isFirstStep); } // 3. 保存到 CSV 文件 try (CSVWriter writer = new CSVWriter(new FileWriter(outputCsv))) { writer.writeAll(testCases); } System.out.println("转换完成: " + outputCsv); } private static String extractJsonFromXmind(String xmindFile) throws IOException { try (ZipFile zipFile = new ZipFile(xmindFile)) { for (Enumeration |