XMind2TestCase 自定義測試用例設計模板

A_Jian發表於2020-12-24

思維導圖生成測試用例


背景

引用官方的說明

軟體測試過程中,最重要、最核心就是測試用例的設計,也是測試童鞋、測試團隊日常投入最多時間的工作內容之一。
然而,傳統的測試用例設計過程有很多痛點:

  • 使用Excel表格進行測試用例設計,雖然成本低,但版本管理麻煩,維護更新耗時,用例評審繁瑣,過程報表統計難...
  • 使用TestLink、TestCenter、Redmine等傳統測試管理工具,雖然測試用例的執行、管理、統計比較方便,但依然存在編寫用例效率不高、思路不夠發散、在產品快速迭代過程中比較耗時等問題...
  • 公司自研測試管理工具,這是個不錯的選擇,但對於大部分小公司、小團隊來說,一方面研發維護成本高,另一方面對技術要有一定要求...
  • ...

基於這些情況,現在越來越多公司選擇使用思維導圖這種高效的生產力工具進行用例設計,特別是敏捷開發團隊。

事實上也證明,思維導圖其發散性思維、圖形化思維的特點,跟測試用例設計時所需的思維非常吻合,所以在實際工作中極大提升了我們測試用例設計的效率,也非常方便測試用例評審。

但是與此同時,使用思維導圖進行測試用例設計的過程中也帶來不少問題:

  • 測試用例難以量化管理、執行情況難以統計;
  • 測試用例執行結果與BUG管理系統難以打通;
  • 團隊成員用思維導圖設計用例的風格各異,溝通成本巨大;
  • ...

於是,這時候 XMind2TestCase 就應運而生了,該工具基於 Python 實現,通過制定測試用例通用模板, 然後使用 XMind 這款廣為流傳且開源的思維導圖工具進行用例設計。 其中制定測試用例通用模板是一個非常核心的步驟(具體請看使用指南),有了通用的測試用例模板,我們就可以在 XMind 檔案上解析並提取出測試用例所需的基本資訊, 然後合成常見測試用例管理系統所需的用例匯入檔案。這樣就將 XMind 設計測試用例的便利與常見測試用例系統的高效管理結合起來了!

當前 XMind2TestCase 已實現從 XMind 檔案到 TestLink 和 Zentao(禪道) 兩大常見用例管理系統的測試用例轉換,同時也提供 XMind 檔案解析後的兩種資料介面 (TestSuites、TestCases兩種級別的JSON資料),方便快速與其他測試用例管理系統打通。


示例展示

官方的示例

Web轉換工具
web
轉換後用例預覽
mode

禪道(ZenTao)匯入結果示例
zentao


安裝XMind2TestCase

pip3 install xmind2testcase

或者升級

pip3 install -U xmind2testcase


實踐

在開始之前先定義咋們的測試用例模板,官方的用例模板不太適合我的書寫習慣,所以我把它稍微改改,先看看官網的,適合你就不用改啦。

官方用例模板

官方示例

改動後的用例模板

改動後的例項

生成的測試用例

我本地沒搭建禪道,用Excel表格來展示,跟禪道一致。

  1. 我這裡用例標題整合了前置條件+用例描述,方便禪道執行多條用例時在用例標題裡能看到前置條件,不然得點選進去用例詳情才能看到,因人而異
  2. 大家都看到 1,2,3這些標識,它們有兩個作用,1是標記這裡是測試用例描述,2是標記優先順序
  3. 一條測試用例對應一個期待結果

Excel


改原始碼

zentao模組

1.case_apply_phase屬性:用例階段我固定了功能測試

def gen_a_testcase_row(testcase_dict):
case_module = gen_case_module(testcase_dict['suite'])
case_title = testcase_dict['name']
case_precontion = testcase_dict['preconditions']
case_step, case_expected_result = gen_case_step_and_expected_result(testcase_dict['steps'])
case_keyword = ''
case_priority = gen_case_priority(testcase_dict['importance'])
case_type = gen_case_type(testcase_dict['execution_type'])
case_apply_phase = '功能測試'
# case_apply_phase = gen_case_apply_phase(testcase_dict['summary'])
'''生成測試用例的欄位在這裡'''
row = [case_module, case_title, case_precontion, case_step, case_expected_result, case_keyword, case_priority, case_type, case_apply_phase]
return row

測試階段預設值轉換

def gen_case_apply_phase(case_apply_phase):
if case_apply_phase=='無':
return '功能測試階段'
else:
return case_apply_phase

2.把用例優先順序的高中低換了下

# 沒有定義用例優先順序則預設3
def gen_case_priority(priority):
# mapping = {1: '高', 2: '中', 3: '低'}
mapping = {1: 1, 2: 2, 3: 3,4:4}
if priority in mapping.keys():
return mapping[priority]
else:
return 3

parser模組

1.把原先的產品名(中心主題)改為功能模組名,輸出檔名字一致

def sheet_to_suite(root_topic):
"""convert a xmind sheet to a `TestSuite` instance"""
suite = TestSuite()
root_title = root_topic['title']
separator = root_title[-1]

if separator in config['valid_sep']:
logging.debug('find a valid separator for connecting testcase title: %s', separator)
config['sep'] = separator # set the separator for the testcase's title
root_title = root_title[:-1]
else:
config['sep'] = ' '

suite.name = root_title
# 直接用產品名字作為功能模組名
global my_title
my_title = root_title
suite.details = root_topic['note']
suite.sub_suites = []

for suite_dict in root_topic['topics']:
suite.sub_suites.append(parse_testsuite(suite_dict))

return suite
def parse_testsuite(suite_dict):
testsuite = TestSuite()
#直接用產品名字作為模組名,sheet_to_suite定義全域性變數my_title
testsuite.name = my_title
testsuite.details = suite_dict['note']
testsuite.testcase_list = []
logging.debug('start to parse a testsuite: %s', testsuite.name)

for cases_dict in suite_dict.get('topics', []):
for case in recurse_parse_testcase(cases_dict):
testsuite.testcase_list.append(case)

logging.debug('testsuite(%s) parsing complete: %s', testsuite.name, testsuite.to_dict())
return testsuite

3.用例型別和用例階段設定

def parse_a_testcase(case_dict, parent):
testcase = TestCase()
topics = parent + [case_dict] if parent else [case_dict]

testcase.name = gen_testcase_title(topics)

preconditions = gen_testcase_preconditions(topics)
testcase.preconditions = preconditions if preconditions else '無'

summary = gen_testcase_summary(topics)
'''testcase.summary:用例階段,配合gen_testcase_type使用'''
testcase.summary = summary if summary else '無'
execution_type = gen_testcase_type(topics)
'''testcase.execution_type:用例型別'''
testcase.execution_type = execution_type if execution_type else '無'
testcase.importance = get_priority(case_dict) or 2

step_dict_list = case_dict.get('topics', [])
if step_dict_list:
testcase.steps = parse_test_steps(step_dict_list)

# the result of the testcase take precedence over the result of the teststep
testcase.result = get_test_result(case_dict['markers'])

if testcase.result == 0 and testcase.steps:
for step in testcase.steps:
if step.result == 2:
testcase.result = 2
break
if step.result == 3:
testcase.result = 3
break

testcase.result = step.result # there is no need to judge where test step are ignored

logging.debug('finds a testcase: %s', testcase.to_dict())
return testcase

def gen_testcase_type(topics):
'''用例階段呼叫'''
labels = [topic['label'] for topic in topics]
labels = filter_empty_or_ignore_element(labels)
return config['type_sep'].join(labels)

我這裡需要改動的程式碼到這裡結束了

執行

API呼叫

這裡說下我這裡執行,官網有比較詳細的執行教程點這裡跳轉
這段程式碼加在zentao.py下執行即可

if __name__ == '__main__':
xmind_file = '/Users/xxx/Downloads/xMind2testCase示例.xmind'
zentao_csv_file = xmind_to_zentao_csv_file(xmind_file)
print('Conver the xmind file to a zentao csv file succssfully: %s', zentao_csv_file)

web介面

使用命令,埠可自定義

xmind2testcase webtool 8000

webtool

命令列

用法:

xmind2testcase [path_to_xmind_file] [-csv] [-xml] [-json]

示例:

xmind2testcase /path/to/testcase.xmind        => output testcase.csvtestcase.xmltestcase.json
xmind2testcase /path/to/testcase.xmind -csv => output testcase.csv
xmind2testcase /path/to/testcase.xmind -xml => output testcase.xml
xmind2testcase /path/to/testcase.xmind -json => output testcase.json

匯入禪道

1.將XMind用例檔案解析為禪道匯入檔案,用禪道的用例上傳功能,把xx.csv上傳即可

xmind2testcase XMind測試用例模板.xmind -csv  ==> XMind測試用例模板.csv

2.將XMind用例檔案轉成json資料,用禪道的介面post上去,我本地沒有環境,沒法給出示例,有環境的小夥伴幫忙補充一下。

結語

以上是根據我個人使用習慣來自定義,不一定適合各位小夥伴,有自定義需求的小夥伴可以看看原始碼或者留言評論私信。

最後的最後,各位的關注、點贊、收藏、碎銀子打賞是對我最大的支援,謝謝大家!
需要原始碼的小夥伴關注微信公眾號ID:gameTesterGz
或掃描二維碼關注回覆xmind用例即可
微信二維碼

相關文章