AutomatedTestCaseGroupDao.class.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. <?php
  2. /**
  3. * @name eolinker ams open source,eolinker开源版本
  4. * @link https://www.eolinker.com/
  5. * @package eolinker
  6. * @author www.eolinker.com 广州银云信息科技有限公司 ©2015-2018
  7. * eoLinker是目前全球领先、国内最大的在线API接口管理平台,提供自动生成API文档、API自动化测试、Mock测试、团队协作等功能,旨在解决由于前后端分离导致的开发效率低下问题。
  8. * 如在使用的过程中有任何问题,欢迎加入用户讨论群进行反馈,我们将会以最快的速度,最好的服务态度为您解决问题。
  9. *
  10. * eoLinker AMS开源版的开源协议遵循Apache License 2.0,如需获取最新的eolinker开源版以及相关资讯,请访问:https://www.eolinker.com/#/os/download
  11. *
  12. * 官方网站:https://www.eolinker.com/
  13. * 官方博客以及社区:http://blog.eolinker.com/
  14. * 使用教程以及帮助:http://help.eolinker.com/
  15. * 商务合作邮箱:market@eolinker.com
  16. * 用户讨论QQ群:284421832
  17. */
  18. class AutomatedTestCaseGroupDao
  19. {
  20. /**
  21. * 添加分组
  22. * @param $project_id
  23. * @param $group_name
  24. * @return bool
  25. */
  26. public function addGroup(&$project_id, &$group_name)
  27. {
  28. $db = getDatabase();
  29. $db->prepareExecute('INSERT INTO eo_project_test_case_group (eo_project_test_case_group.groupName,eo_project_test_case_group.projectID) VALUES (?,?);', array(
  30. $group_name,
  31. $project_id,
  32. ));
  33. if ($db->getAffectRow() > 0)
  34. return $db->getLastInsertID();
  35. else
  36. return FALSE;
  37. }
  38. /**
  39. * 添加子分组
  40. * @param $project_id
  41. * @param $group_name
  42. * @param $parent_group_id
  43. * @return bool
  44. */
  45. public function addChildGroup(&$project_id, &$group_name, &$parent_group_id)
  46. {
  47. $db = getDatabase();
  48. $db->prepareExecute('INSERT INTO eo_project_test_case_group (eo_project_test_case_group.groupName,eo_project_test_case_group.projectID,eo_project_test_case_group.parentGroupID,eo_project_test_case_group.isChild) VALUES (?,?,?,1);', array(
  49. $group_name,
  50. $project_id,
  51. $parent_group_id
  52. ));
  53. if ($db->getAffectRow() > 0)
  54. return $db->getLastInsertID();
  55. else
  56. return FALSE;
  57. }
  58. /**
  59. * 删除用例分组
  60. * @param $project_id
  61. * @param $group_id
  62. * @return bool
  63. */
  64. public function deleteGroup(&$project_id, &$group_id)
  65. {
  66. $db = getDatabase();
  67. try {
  68. $db->beginTransaction();
  69. $db->prepareExecuteAll('DELETE FROM eo_project_test_case_group WHERE eo_project_test_case_group.groupID = ? AND eo_project_test_case_group.projectID = ?;', array($group_id, $project_id));
  70. if ($db->getAffectRow() < 1)
  71. throw new \PDOException('delete error');
  72. $db->prepareExecuteAll('DELETE FROM eo_project_test_case_single WHERE eo_project_test_case_single.caseID IN (SELECT eo_project_test_case.caseID FROM eo_project_test_case WHERE eo_project_test_case.groupID = ?);', array(
  73. $group_id
  74. ));
  75. $db->prepareExecuteAll("DELETE FROM eo_project_test_case WHERE eo_project_test_case.groupID = ?;", array($group_id));
  76. $db->prepareExecuteAll('DELETE eo_project_test_case FROM eo_project_test_case INNER JOIN eo_project_test_case_group ON eo_project_test_case.groupID = eo_project_test_case_group.groupID WHERE eo_project_test_case_group.parentGroupID = ?;', array($group_id));
  77. $db->prepareExecuteAll('DELETE FROM eo_project_test_case_group WHERE eo_project_test_case_group.parentGroupID = ?;', array($group_id));
  78. $db->commit();
  79. return TRUE;
  80. } catch (\PDOException $e) {
  81. $db->rollback();
  82. return FALSE;
  83. }
  84. }
  85. /**
  86. * 获取用例分组
  87. * @param $project_id
  88. * @return bool|array
  89. */
  90. public function getGroupList(&$project_id)
  91. {
  92. $db = getDatabase();
  93. $result = array();
  94. $group_list = $db->prepareExecuteAll('SELECT eo_project_test_case_group.groupID,eo_project_test_case_group.groupName FROM eo_project_test_case_group WHERE eo_project_test_case_group.projectID = ? AND eo_project_test_case_group.isChild = 0 ORDER BY eo_project_test_case_group.groupName ASC;', array($project_id));
  95. //检查是否含有子分组
  96. if (is_array($group_list)) {
  97. foreach ($group_list as &$parentGroup) {
  98. $parentGroup['childGroupList'] = array();
  99. $childGroup = $db->prepareExecuteAll('SELECT eo_project_test_case_group.groupID,eo_project_test_case_group.groupName,eo_project_test_case_group.parentGroupID FROM eo_project_test_case_group WHERE eo_project_test_case_group.projectID = ? AND eo_project_test_case_group.isChild = 1 AND eo_project_test_case_group.parentGroupID = ? ORDER BY eo_project_test_case_group.groupName ASC;', array(
  100. $project_id,
  101. $parentGroup['groupID']
  102. ));
  103. //判断是否有子分组
  104. if (!empty($childGroup))
  105. $parentGroup['childGroupList'] = $childGroup;
  106. }
  107. }
  108. $result['groupList'] = $group_list;
  109. $group_order = $db->prepareExecute('SELECT eo_project_test_case_group_order.orderList FROM eo_project_test_case_group_order WHERE eo_project_test_case_group_order.projectID = ?;', array(
  110. $project_id
  111. ));
  112. $result['groupOrder'] = $group_order['orderList'];
  113. if (empty($group_list))
  114. return FALSE;
  115. else
  116. return $result;
  117. }
  118. /**
  119. * 修改用例分组
  120. * @param $project_id
  121. * @param $group_id
  122. * @param $group_name
  123. * @param $parent_group_id
  124. * @return bool
  125. */
  126. public function editGroup(&$project_id, &$group_id, &$group_name, &$parent_group_id)
  127. {
  128. $db = getDatabase();
  129. //如果没有父分组
  130. if ($parent_group_id <= 0) {
  131. $db->prepareExecute('UPDATE eo_project_test_case_group SET eo_project_test_case_group.groupName = ?,eo_project_test_case_group.parentGroupID = 0,eo_project_test_case_group.isChild = 0 WHERE eo_project_test_case_group.groupID = ? AND eo_project_test_case_group.projectID = ?;', array(
  132. $group_name,
  133. $group_id,
  134. $project_id
  135. ));
  136. } else {
  137. //有父分组
  138. $db->prepareExecute('UPDATE eo_project_test_case_group SET eo_project_test_case_group.groupName = ?,eo_project_test_case_group.parentGroupID = ?,eo_project_test_case_group.isChild = 1 WHERE eo_project_test_case_group.groupID = ? AND eo_project_test_case_group.projectID = ?;', array(
  139. $group_name,
  140. $parent_group_id,
  141. $group_id,
  142. $project_id
  143. ));
  144. }
  145. if ($db->getAffectRow() > 0)
  146. return TRUE;
  147. else
  148. return FALSE;
  149. }
  150. /**
  151. * 获取分组名称
  152. * @param $group_id
  153. * @return bool
  154. */
  155. public function getGroupName($group_id)
  156. {
  157. $db = getDatabase();
  158. $result = $db->prepareExecute("SELECT eo_project_test_case_group.groupName FROM eo_project_test_case_group WHERE eo_project_test_case_group.groupID = ?;", array($group_id));
  159. if (empty($result))
  160. return FALSE;
  161. else
  162. return $result['groupName'];
  163. }
  164. /**
  165. * 更新分组排序
  166. * @param $project_id
  167. * @param $order_list
  168. * @return bool
  169. */
  170. public function updateGroupOrder(&$project_id, &$order_list)
  171. {
  172. $db = getDatabase();
  173. $db->prepareExecute("REPLACE INTO eo_project_test_case_group_order(projectID,orderList)VALUES(?,?);", array($project_id, $order_list));
  174. if ($db->getAffectRow() > 0)
  175. return TRUE;
  176. else
  177. return FALSE;
  178. }
  179. /**
  180. * 检查分组权限
  181. * @param $group_id
  182. * @param $user_id
  183. * @return bool
  184. */
  185. public function checkAutomatedTestCaseGroupPermission(&$group_id, &$user_id)
  186. {
  187. $db = getDatabase();
  188. $result = $db->prepareExecute('SELECT eo_conn_project.projectID FROM eo_project_test_case_group INNER JOIN eo_conn_project ON eo_project_test_case_group.projectID = eo_conn_project.projectID WHERE eo_project_test_case_group.groupID = ? AND eo_conn_project.userID = ?;', array($group_id, $user_id));
  189. if (empty($result)) {
  190. return FALSE;
  191. } else {
  192. return $result['projectID'];
  193. }
  194. }
  195. /**
  196. * 获取用例分组数据
  197. * @param $group_id
  198. * @return array
  199. */
  200. public function getTestCaseGroupData(&$group_id)
  201. {
  202. $db = getDatabase();
  203. $result = array();
  204. $group_info = $db->prepareExecute('SELECT eo_project_test_case_group.groupName,eo_project_test_case_group.isChild FROM eo_project_test_case_group WHERE eo_project_test_case_group.groupID = ?;', array(
  205. $group_id
  206. ));
  207. $case_list = $db->prepareExecuteAll('SELECT eo_project_test_case.caseID,eo_project_test_case.caseName,eo_project_test_case.caseDesc,eo_project_test_case.caseType,eo_project_test_case.caseCode FROM eo_project_test_case WHERE eo_project_test_case.groupID = ?;', array(
  208. $group_id
  209. ));
  210. $result['groupName'] = $group_info['groupName'];
  211. if (is_array($case_list)) {
  212. foreach ($case_list as &$case) {
  213. $sing_case_list = $db->prepareExecuteAll('SELECT eo_project_test_case_single.connID,eo_project_test_case_single.caseData,eo_project_test_case_single.caseCode,eo_project_test_case_single.statusCode,eo_project_test_case_single.matchType,eo_project_test_case_single.matchRule,eo_project_test_case_single.apiName,eo_project_test_case_single.apiURI,eo_project_test_case_single.apiRequestType,eo_project_test_case_single.orderNumber FROM eo_project_test_case_single WHERE eo_project_test_case_single.caseID = ?;', array(
  214. $case['caseID']
  215. ));
  216. $case['caseSingleList'] = $sing_case_list;
  217. }
  218. $result['caseList'] = $case_list;
  219. } else {
  220. $result['caseList'] = array();
  221. }
  222. $child_group_list = array();
  223. if ($group_info['isChild'] == 0) {
  224. $child_group_list = $db->prepareExecuteAll('SELECT eo_project_test_case_group.groupID,eo_project_test_case_group.groupName FROM eo_project_test_case_group WHERE eo_project_test_case_group.parentGroupID = ?;', array(
  225. $group_id
  226. ));
  227. if (is_array($child_group_list)) {
  228. foreach ($child_group_list as &$child_group_info) {
  229. $child_case_list = $db->prepareExecuteAll('SELECT eo_project_test_case.caseID,eo_project_test_case.caseName,eo_project_test_case.caseDesc,eo_project_test_case.caseType,eo_project_test_case.caseCode FROM eo_project_test_case WHERE eo_project_test_case.groupID = ?;', array(
  230. $child_group_info['groupID']
  231. ));
  232. if (is_array($child_case_list)) {
  233. foreach ($child_case_list as &$child_case) {
  234. $child_single_case_list = $db->prepareExecuteAll('SELECT eo_project_test_case_single.connID,eo_project_test_case_single.caseData,eo_project_test_case_single.caseCode,eo_project_test_case_single.statusCode,eo_project_test_case_single.matchType,eo_project_test_case_single.matchRule,eo_project_test_case_single.apiName,eo_project_test_case_single.apiURI,eo_project_test_case_single.apiRequestType,eo_project_test_case_single.orderNumber FROM eo_project_test_case_single WHERE eo_project_test_case_single.caseID = ?;', array(
  235. $child_case['caseID']
  236. ));
  237. $child_case['caseSingleList'] = $child_single_case_list;
  238. }
  239. $child_group_info['caseList'] = $child_case_list;
  240. } else {
  241. $child_group_info['caseList'] = array();
  242. }
  243. }
  244. } else {
  245. $child_group_list = array();
  246. }
  247. }
  248. $result['childGroupList'] = $child_group_list;
  249. return $result;
  250. }
  251. /**
  252. * 导入测试用例分组数据
  253. * @param $project_id
  254. * @param $user_id
  255. * @param $data
  256. * @return bool
  257. */
  258. public function importTestCaseGroup(&$project_id, &$user_id, &$data)
  259. {
  260. $db = getDatabase();
  261. try {
  262. $db->beginTransaction();
  263. $db->prepareExecute('INSERT INTO eo_project_test_case_group (groupName,projectID) VALUES (?,?);', array(
  264. $data['groupName'],
  265. $project_id
  266. ));
  267. if ($db->getAffectRow() < 1) {
  268. throw new \PDOException('insert group error');
  269. }
  270. $group_id = $db->getLastInsertID();
  271. if ($data['caseList']) {
  272. foreach ($data['caseList'] as $case) {
  273. $db->prepareExecute('INSERT INTO eo_project_test_case(eo_project_test_case.projectID,eo_project_test_case.userID,eo_project_test_case.caseName,eo_project_test_case.caseDesc,eo_project_test_case.createTime,eo_project_test_case.updateTime,eo_project_test_case.caseType,eo_project_test_case.groupID,eo_project_test_case.caseCode)VALUES(?,?,?,?,?,?,?,?,?);', array(
  274. $project_id,
  275. $user_id,
  276. $case['caseName'],
  277. $case['caseDesc'],
  278. date('Y-m-d H:i:s', time()),
  279. date('Y-m-d H:i:s', time()),
  280. $case['caseType'],
  281. $group_id,
  282. $case['caseCode']
  283. ));
  284. if ($db->getAffectRow() < 1)
  285. throw new \PDOException("insert test case error");
  286. $case_id = $db->getLastInsertID();
  287. if ($case['caseSingleList']) {
  288. foreach ($case['caseSingleList'] as $single_case) {
  289. if ($single_case['matchType'] == 2) {
  290. $match = array();
  291. // 匹配<response[]>,当没有匹配结果的时候跳过
  292. if (preg_match_all('#<response\[(\d+)\]#', $single_case['caseData'], $match) > 0) {
  293. // 遍历匹配结果,对原字符串进行多次替换
  294. foreach ($match[1] as $response_id) {
  295. for ($i = 0; $i < count($case['caseSingleList']); $i++) {
  296. if ($case['caseSingleList'][$i]['connID'] == $response_id) {
  297. $result = $db->prepareExecute("SELECT eo_project_test_case_single.connID FROM eo_project_test_case_single.eo_project_test_case_single WHERE eo_project_test_case_single.apiName = ? AND eo_project_test_case_single.apiURI = ? AND eo_project_test_case_single.caseID = ?;", array(
  298. $case['caseSingleList'][$i]['apiName'],
  299. $case['caseSingleList'][$i]['apiURI'],
  300. $case_id
  301. ));
  302. $single_case['caseData'] = str_replace("<response[" . $response_id, "<response[" . $result['connID'], $single_case['caseData']);
  303. }
  304. }
  305. }
  306. }
  307. }
  308. $db->prepareExecute('INSERT INTO eo_project_test_case_single(eo_project_test_case_single.caseID,eo_project_test_case_single.caseData,eo_project_test_case_single.caseCode,eo_project_test_case_single.statusCode,eo_project_test_case_single.matchType,eo_project_test_case_single.matchRule, eo_project_test_case_single.apiName, eo_project_test_case_single.apiURI, eo_project_test_case_single.apiRequestType,eo_project_test_case_single.orderNumber) VALUES (?,?,?,?,?,?,?,?,?,?);', array(
  309. $case_id,
  310. $single_case['caseData'],
  311. $single_case['caseCode'],
  312. $single_case['statusCode'],
  313. $single_case['matchType'],
  314. $single_case['matchRule'],
  315. $single_case['apiName'],
  316. $single_case['apiURI'],
  317. $single_case['apiRequestType'],
  318. $single_case['orderNumber']
  319. ));
  320. if ($db->getAffectRow() < 1)
  321. throw new \PDOException('insert single test case error');
  322. }
  323. }
  324. }
  325. }
  326. if ($data['childGroupList']) {
  327. $group_id_parent = $group_id;
  328. foreach ($data['childGroupList'] as $child_group) {
  329. // 插入分组
  330. $db->prepareExecute('INSERT INTO eo_project_test_case_group (eo_project_test_case_group.projectID,eo_project_test_case_group.groupName,eo_project_test_case_group.parentGroupID,eo_project_test_case_group.isChild) VALUES (?,?,?,?);', array(
  331. $project_id,
  332. $child_group['groupName'],
  333. $group_id_parent,
  334. 1
  335. ));
  336. if ($db->getAffectRow() < 1) {
  337. throw new \PDOException("inset child group error");
  338. }
  339. $group_id = $db->getLastInsertID();
  340. if ($child_group['caseList']) {
  341. // 插入状态码
  342. foreach ($child_group['caseList'] as $case) {
  343. $db->prepareExecute('INSERT INTO eo_project_test_case(eo_project_test_case.projectID,eo_project_test_case.userID,eo_project_test_case.caseName,eo_project_test_case.caseDesc,eo_project_test_case.createTime,eo_project_test_case.updateTime,eo_project_test_case.caseType,eo_project_test_case.groupID,eo_project_test_case.caseCode)VALUES(?,?,?,?,?,?,?,?,?);', array(
  344. $project_id,
  345. $user_id,
  346. $case['caseName'],
  347. $case['caseDesc'],
  348. date('Y-m-d H:i:s', time()),
  349. date('Y-m-d H:i:s', time()),
  350. $case['caseType'],
  351. $group_id,
  352. $case['caseCode']
  353. ));
  354. if ($db->getAffectRow() < 1)
  355. throw new \PDOException("insert child test case error");
  356. $case_id = $db->getLastInsertID();
  357. if ($case['caseSingleList']) {
  358. foreach ($case['caseSingleList'] as $single_case) {
  359. if ($single_case['matchType'] == 2) {
  360. $match = array();
  361. // 匹配<response[]>,当没有匹配结果的时候跳过
  362. if (preg_match_all('#<response\[(\d+)\]#', $single_case['caseData'], $match) > 0) {
  363. // 遍历匹配结果,对原字符串进行多次替换
  364. foreach ($match[1] as $response_id) {
  365. for ($i = 0; $i < count($case['caseSingleList']); $i++) {
  366. if ($case['caseSingleList'][$i]['connID'] == $response_id) {
  367. $result = $db->prepareExecute("SELECT eo_project_test_case_single.connID FROM eo_project_test_case_single WHERE eo_project_test_case_single.apiName = ? AND eo_project_test_case_single.apiURI = ? AND eo_project_test_case_single.caseID = ?;", array(
  368. $case['caseSingleList'][$i]['apiName'],
  369. $case['caseSingleList'][$i]['apiURI'],
  370. $case_id
  371. ));
  372. $single_case['caseData'] = str_replace("<response[" . $response_id, "<response[" . $result['connID'], $single_case['caseData']);
  373. }
  374. }
  375. }
  376. }
  377. }
  378. $db->prepareExecute('INSERT INTO eo_project_test_case_single(eo_project_test_case_single.caseID,eo_project_test_case_single.caseData,eo_project_test_case_single.caseCode,eo_project_test_case_single.statusCode,eo_project_test_case_single.matchType,eo_project_test_case_single.matchRule, eo_project_test_case_single.apiName, eo_project_test_case_single.apiURI, eo_project_test_case_single.apiRequestType,eo_project_test_case_single.orderNumber) VALUES (?,?,?,?,?,?,?,?,?,?);', array(
  379. $case_id,
  380. $single_case['caseData'],
  381. $single_case['caseCode'],
  382. $single_case['statusCode'],
  383. $single_case['matchType'],
  384. $single_case['matchRule'],
  385. $single_case['apiName'],
  386. $single_case['apiURI'],
  387. $single_case['apiRequestType'],
  388. $single_case['orderNumber']
  389. ));
  390. if ($db->getAffectRow() < 1)
  391. throw new \PDOException('insert child single test case error');
  392. }
  393. }
  394. }
  395. }
  396. }
  397. }
  398. $db->commit();
  399. return TRUE;
  400. } catch (\PDOException $e) {
  401. $db->rollback();
  402. return FALSE;
  403. }
  404. }
  405. }