【Python】Python實現Excel用例直接導入testlink-UI界面小工具


1.寫在前面

testlink上傳用例一種方法是excel轉換為xml,然后再用xml上傳,還有一種是調用api進行上傳。
最開始寫了個轉換工具,是將excel轉換為xml,然后在testlink里上傳,最后發現當模塊變多以后xml太多,一個一個上傳太麻煩,所以嘗試用調用api的方式來上傳用例,並且打包成exe小工具。

 

2.環境

python3.7.4
testlink1.9.14 ( 1.9.14和19都測試通過 )

 

3.用到的庫

tkinter :python自帶,用於編寫簡易的界面

xlrd:第三方庫,需要pip安裝,讀取excel的庫,也可以使用pandas代替

TestLink-API-Python-client:第三方庫,需要pip安裝,提供python和testlink交互的api

 

4.完成效果圖

4.1 用模板寫好用例

excel用例模板

4.2 選擇好上傳項目和根目錄導入或者子目錄導入(這里用的是testlink中文網的演示地址)

選擇項目

4.3 點擊導入后彈出導入進度條

上傳用例

4.4 導入成功,查看testlink里的用例

testlink上傳成功后的樣子
同上

 

5.部分代碼

5.1 testlink方法二次封裝

  1 @dataclass
  2 class ClientTestLink:
  3     """
  4     testlink二次封裝
  5     """
  6     user_api_pwd: str
  7     client_url: str = "http://你的testlink地址/testlink/lib/api/xmlrpc/v1/xmlrpc.php"
  8 
  9     def __post_init__(self):
 10         self.tlc = TestlinkAPIClient(self.client_url, self.user_api_pwd)
 11 
 12     def get_projects(self):
 13         """獲取testLink內所有項目"""
 14         project_list = []
 15         for project in self.tlc.getProjects():
 16             project_list.append([project.get("id"), project.get("name")])
 17         return project_list
 18 
 19     def get_project_id_by_name(self, project_name):
 20         """獲取項目id根據項目名稱"""
 21         return self.tlc.getProjectIDByName(project_name)
 22 
 23     def get_test_suites(self, project_id):
 24         """獲取指定項目里(需要項目id)的測試用例集"""
 25         test_suite_list = []
 26         test_suites = self.tlc.getFirstLevelTestSuitesForTestProject(project_id)
 27         for test_suite in test_suites:
 28             test_suite_list.append([test_suite.get("id"), test_suite.get("name")])
 29         return test_suite_list
 30 
 31     def get_test_suite_id(self, project_id, test_suite_name):
 32         """查詢一級目錄"""
 33         all_suites = self.get_test_suites(project_id)
 34         for i in all_suites:
 35             if i[1] == test_suite_name:
 36                 return i[0]
 37             else:
 38                 pass
 39         return False
 40 
 41     def get_test_suite_for_test_suite(self, test_suite_id):
 42         """查詢用例集下是否含有某用例集"""
 43         try:
 44             test_suite_id = self.tlc.getTestSuitesForTestSuite(test_suite_id)
 45             return test_suite_id
 46         except Exception:
 47             return False
 48 
 49     def create_test_suite(self, project_id: int, test_suite_name: str, parent_id: int = None):
 50         """判斷是否擁有測試用例集,如果沒有就創建測試用例集"""
 51         suite_data = self.tlc.createTestSuite(project_id, test_suite_name, test_suite_name, parentid=parent_id)
 52         cheak_bool = isinstance(suite_data, list)
 53         if cheak_bool:
 54             return suite_data[0].get("id")
 55         else:
 56             if parent_id is None:
 57                 return self.get_test_suite_id(project_id=project_id, test_suite_name=test_suite_name)
 58             else:
 59                 for k, v in self.get_test_suite_for_test_suite(parent_id).items():
 60                     if isinstance(v, dict):
 61                         if v.get("name") == test_suite_name:
 62                             return v.get("id")
 63                         else:
 64                             pass
 65                     else:
 66                         return self.get_test_suite_for_test_suite(parent_id).get("id")
 67 
 68     def create_test_case(self, project_id: int, test_suite_id: int, test_case_name, summary, preconditions,
 69                          step, result, author_login):
 70         """創建測試用例"""
 71         self.tlc.initStep(step, result, 1)
 72         return self.tlc.createTestCase(testprojectid=project_id,
 73                                        testsuiteid=test_suite_id,
 74                                        testcasename=test_case_name,
 75                                        summary=summary,
 76                                        preconditions=preconditions,
 77                                        authorlogin=author_login
 78                                        )
 79 
 80     def update_project_keywords(self, project_id, test_case_id, keyword_value):
 81         """加關鍵字"""
 82         test_case = self.tlc.getTestCase(testcaseid=test_case_id)[0]
 83         args = {
 84             'testprojectid': project_id,
 85             'testcaseexternalid': test_case['full_tc_external_id'],
 86             'version': int(test_case['version'])
 87         }
 88         keyword = self.tlc.addTestCaseKeywords({args['testcaseexternalid']: [keyword_value]})
 89         return keyword
 90 
 91     def update_custom_field(self, project_id, test_case_id, custom_fields: dict):
 92         """更新自定義字段"""
 93         test_case = self.tlc.getTestCase(testcaseid=test_case_id)[0]
 94         args = {
 95             'testprojectid': project_id,
 96             'testcaseexternalid': test_case['full_tc_external_id'],
 97             'version': int(test_case['version'])
 98         }
 99         custom = self.tlc.updateTestCaseCustomFieldDesignValue(
100             args['testcaseexternalid'], args['version'], args['testprojectid'], custom_fields)
101         return custom

5.2 從根目錄上傳用例

 1 def run_root(excel_file_name, project_id, username, api_token):
 2     """
 3     創建用例
 4     """
 5     case_num = get_all_case_num(excel_file_name)
 6     win2 = tk.Tk()
 7     # 設置標題
 8     win2.title("導入任務")
 9     # 設置大小和位置
10     win2.geometry("220x100")
11     # 禁止改變窗口大小
12     win2.resizable(0, 0)
13     mpb = ttk.Progressbar(win2, orient="horizontal", length=150, mode="determinate")
14     mpb.place(x="10", y="10")
15     mpb["maximum"] = case_num
16     mpb["value"] = 0
17     upload_label = tk.Label(win2, text='正在導入用例...(切勿關閉)', fg='red')
18     upload_label.place(x="10", y="40")
19     upload_label_text = tk.Label(win2, text='', fg='red')
20     upload_label_text.place(x="160", y="40")
21     upload_per_label = tk.Label(win2, text='', fg='red')
22     upload_per_label.place(x="160", y="10")
23     # 讀取excel,獲取數據
24     datacases = xlrd.open_workbook(excel_file_name)
25 
26     sheets = datacases.sheet_names()
27 
28     for sheet in sheets:
29         sheet_1 = datacases.sheet_by_name(sheet)
30 
31         # ====================測試用例功能模塊==============================
32 
33         row_num = sheet_1.nrows
34         for i in range(1, row_num):
35             # 定義默認步驟編號第一步
36             catalog_1 = sheet_1.cell_value(i, 0)  # 一級目錄
37             catalog_2 = sheet_1.cell_value(i, 1)  # 二級目錄
38             catalog_3 = sheet_1.cell_value(i, 2)  # 三級目錄
39             test_case_name = sheet_1.cell_value(i, 3)  # 用例名稱
40             summary = sheet_1.cell_value(i, 4)  # 摘要
41             key_words = sheet_1.cell_value(i, 5)  # 關鍵字
42             test_case_level = sheet_1.cell_value(i, 6)  # 用例級別
43             preconditions = sheet_1.cell_value(i, 7)  # 預置條件
44             step = sheet_1.cell_value(i, 8)  # 操作步驟
45             step_list = []
46             # 處理換行
47             for i_step in step.split('\n'):
48                 step_list.append("<p>" + i_step + "</p>")
49             step = ''.join(step_list)
50             expected_results = sheet_1.cell_value(i, 9)  # 預期結果
51             expected_results_list = []
52             # 處理換行
53             for i_expected_results in expected_results.split('\n'):
54                 expected_results_list.append("<p>" + i_expected_results + "</p>")
55             expected_results = ''.join(expected_results_list)
56 
57             # 創建一級目錄
58             test_suite_id = ClientTestLink(api_token).create_test_suite(project_id=project_id,
59                                                                         test_suite_name=catalog_1)
60             # 創建二級目錄
61             if catalog_2:
62                 test_suite_id = ClientTestLink(api_token).create_test_suite(project_id=project_id,
63                                                                             test_suite_name=catalog_2,
64                                                                             parent_id=test_suite_id)
65                 # 創建三級目錄
66                 if catalog_3:
67                     test_suite_id = ClientTestLink(api_token).create_test_suite(project_id=project_id,
68                                                                                 test_suite_name=catalog_3,
69                                                                                 parent_id=test_suite_id)
70             result = ClientTestLink(api_token).create_test_case(
71                 project_id=project_id,
72                 test_suite_id=test_suite_id,
73                 test_case_name=test_case_name,
74                 summary=summary,
75                 preconditions=preconditions,
76                 step=step,
77                 result=expected_results,
78                 author_login=username)
79 
80             test_case_id = result[0].get("id")
81             # 添加關鍵字
82             ClientTestLink(api_token).update_project_keywords(project_id=project_id,
83                                                               test_case_id=test_case_id,
84                                                               keyword_value=key_words)
85             # 添加自定義字段
86             ClientTestLink(api_token).update_custom_field(project_id=project_id,
87                                                           test_case_id=test_case_id,
88                                                           custom_fields={"優先級": test_case_level})
89             mpb["value"] = i
90             upload_label_text.config(text=f"<{i}/{case_num}>")
91             upload_per_label.config(text=f"{((i / case_num) * 100):.2f}%")
92             win.update()
93             print(f"{test_case_id}-上傳用例成功")
94     win2.destroy()

 

6.寫在最后

等稍后整理好后會把整個源碼放出來,因為寫的比較着急,很多代碼邏輯沒考慮到,歡迎指出,指出必改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM