在測試工作中,需求文檔中的圖片(如界面設計圖、流程圖)往往是測試用例生成的重要參考。然而,手動提取圖片并識別內容不僅耗時,還容易出錯。本文將通過一個自研小工具,結合 PaddleOCR 和大模型,自動從需求文檔的指定標題下提取圖片,識別圖片中的文字,并生成功能測試用例。這一流程能幫助測試工程師大幅提高效率,同時確保用例生成的精準性。支持同時指定文本標題及圖片標題。感興趣的同學點擊下面小卡片獲取源碼相對于前面的版本:
- 優化了一些報錯導致閃退的情形
- 增加了圖片標題輸入框
- 布局調整
- 增加了行業下拉選擇框
一、整體解決方案
我們將完成以下功能:
- 從 Word 文檔中提取圖片:通過
python-docx
提取指定標題下的圖片。 - 圖片文字識別:使用
PaddleOCR
對圖片中的文字內容進行識別。 - 用例生成:將識別到的文字內容傳遞給大模型(如 OpenAI GPT),自動生成功能測試用例。
整個工具的實現框架如下:
+-------------------------------------------+
| 需求文檔加載 |
| 讀取 Word 文檔 (docx) |
+-------------------------------------------+↓
+-------------------------------------------+
| 圖片提取 |
| 識別指定標題下的圖片 |
+-------------------------------------------+↓
+-------------------------------------------+
| 圖片文字識別 |
| 使用 PaddleOCR 識別圖片中的文字 |
+-------------------------------------------+↓
+-------------------------------------------+
| 用例生成 |
| 將識別文字傳遞給大模型生成測試用例 |
+-------------------------------------------+↓
+-------------------------------------------+
| 輸出測試用例 |
| 將生成的測試用例保存為文檔 |
+-------------------------------------------+
二、工具實現步驟
1. 環境準備
安裝以下必要的 Python 庫:
pip install python-docx paddleocr paddlepaddle openai
python-docx
:用于讀取 Word 文檔。paddleocr
和paddlepaddle
:用于圖片文字識別。openai
:與大模型交互生成測試用例。
2. 提取 Word 文檔中指定標題下的圖片
在需求文檔中,圖片通常位于某些特定的標題下(如“登錄界面設計”)。我們使用 python-docx
遍歷文檔內容并提取這些圖片。
代碼示例:
# 提取指定標題下的圖片def extract_text_by_title(self, docx_path, title_keywords, table_keywords, pic_keywords):"""提取多個標題下的正文內容:param pic_keywords: 圖片路徑:param table_keywords: 表格路徑:param docx_path: docx 文件路徑:param title_keywords: 標題關鍵詞列表:return: 提取的正文內容(按標題分組)"""doc = Document(docx_path)result = {}doc = self.remove_toc(doc) # 先清理一波目錄for title_keyword in title_keywords.split(','):content = []capture = Falsefor paragraph in doc.paragraphs:text = paragraph.text.strip()if text:# 判斷是否是標題if title_keyword in text and 'toc' not in paragraph.style.name.lower():capture = Truecontent.append(text)continue# 停止捕獲正文內容if capture and re.match(r"^\d+(\.\d+)*\s+.+", text): # 新標題breakelif "標題" in paragraph.style.name and capture: # 遇到下一個標題則停止獲取break# 捕獲正文內容if capture and text:content.append(text)result[title_keyword] = "\n".join(content)for pic_keyword in pic_keywords.split(','):image_paths = self.get_target_pic(docx_path, pic_keyword)print(image_paths)if not image_paths:print("未找到目標標題下的圖片")else:print(f"提取到 {len(image_paths)} 張圖片:{image_paths}")# OCR 識別print("\n正在進行 OCR 識別...")ocr_results = self.perform_ocr_with_paddle(image_paths)# 輸出結果ocr_results_text = ''for image_path, text in ocr_results:# print(f"\n圖片路徑:{image_path}")# print(f"識別內容:\n{text}")ocr_results_text += text + '--'result['識別內容'] = ocr_results_textreturn result
示例:提取“業務流程”標題下的圖片
3. 使用 PaddleOCR 進行圖片文字識別
使用 PaddleOCR 對提取的圖片進行文字識別,并輸出識別結果。
代碼示例:
def perform_ocr_with_paddle(self, images):"""使用 PaddleOCR 對圖片進行文字識別。"""results = []# 初始化 PaddleOCRocr = PaddleOCR(use_angle_cls=True, lang="ch") # 支持方向分類和中英文混合識別for image_path in images:try:img = cv2.imread(image_path)ocr_result = ocr.ocr(img, cls=True)text_lines = [line[1][0] for line in ocr_result[0]]results.append((image_path, "\n".join(text_lines)))except Exception as e:results.append((image_path, f"OCR 識別失敗: {e}"))return results
識別結果如圖:
4. 交互大模型生成測試用例
將識別到的文字內容傳遞給大模型(如 OpenAI GPT),并生成功能測試用例。
代碼示例:
def generate_cases(self, content_param, prompt_param, job_area):# 初始化OpenAI客戶端client = OpenAI(# 如果沒有配置環境變量,請用百煉API Key替換:api_key="sk-xxx"api_key='sk-xxx', # todo 此處需更換base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")reasoning_content = "" # 定義完整思考過程answer_content = "" # 定義完整回復is_answering = False # 判斷是否結束思考過程并開始回復# 創建聊天完成請求completion = client.chat.completions.create(model="deepseek-r1", # 此處以 deepseek-r1 為例,可按需更換模型名稱messages=[{'role': 'user', 'content': f'所在行業: {job_area if job_area else None};文檔內容: {content_param}, 提示詞:{prompt_param}'}],stream=True,# 解除以下注釋會在最后一個chunk返回Token使用量# stream_options={# "include_usage": True# })print("\n" + "=" * 20 + "思考過程" + "=" * 20 + "\n")for chunk in completion:# 如果chunk.choices為空,則打印usageif not chunk.choices:print("\nUsage:")print(chunk.usage)else:delta = chunk.choices[0].delta# 打印思考過程if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:print(delta.reasoning_content, end='', flush=True)reasoning_content += delta.reasoning_contentelse:# 開始回復if delta.content != "" and not is_answering:print("\n" + "=" * 20 + "完整回復" + "=" * 20 + "\n")is_answering = True# 打印回復過程print(delta.content, end='', flush=True)answer_content += delta.contentreturn answer_content
5. 輸出測試用例到文檔
將生成的JSON格式的測試用例保存為 Excel文檔,便于后續查看和管理。
代碼示例:
def json_to_excel(self, json_data, output_file):"""將任意 JSON 數據中的鍵作為表頭,值作為值,轉換為 Excel 表格:param json_data: JSON 數據(字符串或字典):param output_file: 輸出的 Excel 文件路徑"""# 如果輸入是 JSON 字符串,將其解析為字典data_list = Noneif isinstance(json_data, str):json_data = json.loads(json_data)# 找到 JSON 數據中的列表部分(假設是字典中的第一個值)if isinstance(json_data, dict):for key, value in json_data.items():if isinstance(value, list): # 找到第一個值為列表的鍵data_list = valuebreakelif isinstance(json_data, list):data_list = json_dataelse:raise ValueError("JSON 數據中未找到列表部分!")if data_list:# 將列表部分轉換為 DataFramedf = pd.DataFrame(data_list)# 將 DataFrame 導出為 Excel 文件df.to_excel(output_file, index=False)print(f"Excel 文件已成功生成:{output_file}")else:print("Excel 文件生成失敗")
三、完整運行流程
- 準備環境:安裝所需庫,并將需求文檔(docx 文件)和 PaddleOCR 模型準備好。
- 提取圖片:運行代碼提取目標標題下的所有圖片。
- 文字識別:使用 PaddleOCR 對圖片進行文字識別,提取關鍵信息。
- 生成測試用例:調用大模型,基于提取的文字內容生成功能測試用例。
- 保存結果:將生成的測試用例保存到 Word 文檔中,便于后續使用。
四、工具的實際應用場景
- 自動化用例生成:通過識別需求文檔中的圖片內容,快速生成對應的測試用例。
- 需求驗證:結合圖片中的文字內容和生成的測試用例,驗證需求文檔的完整性和準確性。
- 團隊協作:將生成的測試用例文檔分發給團隊成員,提高工作效率。
五、小結
通過本文的工具實現,測試工程師可以將需求文檔中的圖片內容自動化處理,結合 PaddleOCR 和大模型生成高質量的功能測試用例。整個流程完全落地可用,適用于日常的測試用例生成需求,幫助測試工程師從重復性工作中解放出來,更專注于高價值的測試分析工作。
快試試這個工具,將測試效率提升到新高度吧!