loadModel('report'); if(dao::isError()) return dao::getError(); // 验证对象是否正确实例化 $result = array(); $result['isReportModel'] = $report instanceof reportModel ? '1' : '0'; $result['hasDao'] = isset($report->dao) ? '1' : '0'; $result['hasConfig'] = isset($report->config) ? '1' : '0'; $result['hasLang'] = isset($report->lang) ? '1' : '0'; return $result; } /** * 测试计算每项数据的百分比。 * Test compute percent of every item. * * @param array $datas * @access public * @return string|array */ public function computePercentTest(array $datas): string|array { $objects = $this->objectModel->computePercent($datas); if(dao::isError()) return dao::getError(); $percents = ''; foreach($objects as $moduleID => $object) $percents .= "$moduleID:$object->percent;"; return $percents; } /** * 测试为单个图表创建json数据。 * Test create json data of single charts. * * @param int $executionID * @access public * @return bool|array */ public function createSingleJSONTest(int $executionID): bool|array { global $tester; $this->execution = $tester->loadModel('execution'); $execution = $this->execution->getByID($executionID); $sets = $this->execution->getBurnDataFlot($executionID, 'left'); $dateList = $this->execution->getDateList($execution->begin, $execution->end, '', 0, 'Y-m-d'); $objects = $this->objectModel->createSingleJSON($sets, $dateList[0]); if(dao::isError()) return dao::getError(); return !empty($objects); } /** * 测试转换日期格式。 * Test convert date format. * * @param array $dateList * @param string $format * @access public * @return string|array */ public function convertFormatTest(array $dateList, string $format = 'Y-m-d'): string|array { $objects = $this->objectModel->convertFormat($dateList, $format); if(dao::isError()) return dao::getError(); return implode(',', $objects); } /** * 测试获取系统的 URL。 * Test get system URL. * * @param string $domain * @param stringi $argv1 * @access public * @return string|array */ public function getSysURLTest(string $domain = '', string $argv1 = ''): string|array { global $tester; if(!empty($domain)) { if(!isset($tester->config->mail)) $tester->config->mail = new stdclass(); $tester->config->mail->domain = $domain; } else { unset($tester->config->mail->domain); } $_SERVER['argv'] = array('argv0', $argv1); $url = $this->objectModel->getSysURL(); unset($tester->config->mail->domain); unset($_SERVER['argv']); if(dao::isError()) return dao::getError(); return $url; } /** * 测试获取用户的 bugs。 * Test get user bugs. * * @access public * @return array */ public function getUserBugsTest(): string|array { $objects = $this->objectModel->getUserBugs(); if(dao::isError()) return dao::getError(); $result = array(); foreach($objects as $user => $bugs) $result[$user] = $bugs; return $result; } /** * 测试获取用户的任务。 * Test get user tasks. * * @access public * @return array */ public function getUserTasksTest(): array { $objects = $this->objectModel->getUserTasks(); if(dao::isError()) return dao::getError(); $result = array(); foreach($objects as $user => $bugs) $result[$user] = $bugs; return $result; } /** * 测试获取用户的待办。 * Test get user todos. * * @param string $userType * @access public * @return string|array */ public function getUserTodosTest(string $userType): string|array { $objects = $this->objectModel->getUserTodos(); if(dao::isError()) return dao::getError(); $counts = ''; foreach($objects as $user => $todos) { if(strpos($user, $userType) !== false) $counts .= "$user:" . count($todos) . ';'; } return $counts; } /** * 测试获取用户的测试单。 * Test get user test tasks. * * @param string $mode 返回模式:'count'返回统计字符串,'array'返回数组,'object'返回原始对象 * @access public * @return string|array */ public function getUserTestTasksTest(string $mode = 'count'): string|array { $objects = $this->objectModel->getUserTestTasks(); if(dao::isError()) return dao::getError(); if($mode === 'array') { $result = array(); foreach($objects as $user => $testtasks) $result[$user] = count($testtasks); return $result; } elseif($mode === 'object') { return $objects; } else { $counts = ''; foreach($objects as $user => $testtasks) $counts .= "$user:" . count($testtasks) . ';'; return $counts; } } /** * 测试获取当前年的用户登录次数。 * Test get user login count in this year. * * @param string $accounts * @access public * @return int|array */ public function getUserYearLoginsTest(array $accounts): int|array { $count = $this->objectModel->getUserYearLogins($accounts, date('Y')); if(dao::isError()) return dao::getError(); return $count; } /** * 测试获取当前年的用户操作数。 * Test get user action count in this year. * * @param string $accounts * @access public * @return int|array */ public function getUserYearActionsTest(array $accounts): int|array { $count = $this->objectModel->getUserYearActions($accounts, date('Y')); if(dao::isError()) return dao::getError(); return $count; } /** * Test getUserYearContributionCount method. * * @param array $accounts * @param string $year * @access public * @return mixed */ public function getUserYearContributionCountTest(array $accounts, string $year): mixed { $count = $this->objectModel->getUserYearContributionCount($accounts, $year); if(dao::isError()) return dao::getError(); return $count; } /** * 测试获取用户某年的动态数。 * Test get user contributions in this year. * * @param array $accounts * @access public * @return string|array */ public function getUserYearContributionsTest(array $accounts): string|array { $objects = $this->objectModel->getUserYearContributions($accounts, date('Y')); if(dao::isError()) return dao::getError(); $contributions = ''; foreach($objects as $type => $contributionTypes) { $contributions .= "{$type}:"; foreach($contributionTypes as $contributionType => $count) $contributions .= "{$contributionType}:{$count},"; $contributions = trim($contributions, ',') . ';'; } return $contributions; } /** * 测试获取本年度用户的待办统计。 * Test get user todo stat in this year. * * @param array $accounts * @access public * @return string|array */ public function getUserYearTodosTest(array $accounts): string|array { $objects = $this->objectModel->getUserYearTodos($accounts, date('Y')); if(dao::isError()) return dao::getError(); $count = ''; foreach($objects as $type => $value) $count .= "{$type}:{$value};"; return $count; } /** * 测试获取本年度用户的工时统计。 * Test get user effort stat in this error. * * @param string $accounts * @access public * @return object */ public function getUserYearEffortsTest(array $accounts): object|array { $object = $this->objectModel->getUserYearEfforts($accounts, date('Y')); if(dao::isError()) return dao::getError(); return $object; } /** * 测试获取本年度用户相关的每个产品的创建的需求和计划,关闭的需求数据。 * Test get count of created story,plan and closed story by accounts every product in this year. * * @param array $accounts * @access public * @return string|array */ public function getUserYearProductsTest(array $accounts): string|array { $objects = $this->objectModel->getUserYearProducts($accounts, date('Y')); if(dao::isError()) return dao::getError(); return implode(',', array_keys($objects)); } /** * 测试获取本年度用户相关的每个迭代的创建的需求和计划,关闭的需求数据。 * Test get count of finished task, story and resolved bug by accounts every executions in this years. * * @param array $accounts * @access public * @return string|array */ public function getUserYearExecutionsTest(array $accounts): string|array { $year = date('Y'); $objects = $this->objectModel->getUserYearExecutions($accounts, $year); if(dao::isError()) return dao::getError(); return implode(',', array_keys($objects)); } /** * 测试获取所有时间的状态,包括需求、任务和 bug。 * Test get status stat that is all time, include story, task and bug. * * @access public * @return array */ public function getAllTimeStatusStatTest(): array { $objects = $this->objectModel->getAllTimeStatusStat(); if(dao::isError()) return dao::getError(); $types = array(); foreach($objects as $type => $status) { $types[$type] = ''; foreach($status as $statusType => $statusCount) $types[$type] .= "{$statusType}:{$statusCount};"; } return $types; } /** * 测试获取年度需求、任务或者 bug 的状态统计。 * Test get year object stat, include status and action stat. * * @param array $accounts * @param string $objectType * @access public * @return string|array */ public function getYearObjectStatTest(array $accounts, string $objectType): string|array { $objects = $this->objectModel->getYearObjectStat($accounts, date('Y'), $objectType); if(dao::isError()) return dao::getError(); $stats = ''; foreach($objects['statusStat'] as $stat => $count) $stats .= "$stat:$count;"; return $stats; } /** * 测试获取用例的年度统计,包括结果和操作统计。 * Test get year case stat, include result and action stat. * * @param array $accounts * @access public * @return string|array */ public function getYearCaseStatTest(array $accounts): string|array { $objects = $this->objectModel->getYearCaseStat($accounts, date('Y')); if(dao::isError()) return dao::getError(); $result = ''; foreach($objects['resultStat'] as $type => $value) $result .= "{$type}:{$value};"; return $result; } /** * 测试获取本年的月份。 * Test get year months. * * @param string $year * @access public * @return string|array */ public function getYearMonthsTest(string $year): string|array { $objects = $this->objectModel->getYearMonths($year); if(dao::isError()) return dao::getError(); return implode(',', $objects); } /** * 测试获取状态总览。 * Test get status overview. * * @param string $objectType * @param array $statusStat * @access public * @return string|array */ public function getStatusOverviewTest(string $objectType, array $statusStat): string|array { $return = $this->objectModel->getStatusOverview($objectType, $statusStat); if(dao::isError()) return dao::getError(); return $return; } /** * 测试获取项目状态总览。 * Test get project status overview. * * @param array $accounts * @access public * @return string|array */ public function getProjectStatusOverviewTest(array $accounts = array()): string|array { $objects = $this->objectModel->getProjectStatusOverview($accounts); if(dao::isError()) return dao::getError(); $counts = ''; foreach($objects as $type => $count) $counts .= "{$type}:{$count};"; return $counts; } /** * 测试为 API 获取输出数据。 * Test get output data for API. * * @param array $accounts * @access public * @return string|array */ public function getOutput4APITest(array $accounts) { $objects = $this->objectModel->getOutput4API($accounts, date('Y')); if(dao::isError()) return dao::getError(); $output = ''; foreach($objects as $objectType => $object) $output .= "{$objectType}:{$object['total']};"; return $output; } /** * 测试获取项目和执行名称。 * Test get project and execution name. * * @access public * @return array */ public function getProjectExecutionsTest(): array { $objects = $this->objectModel->getProjectExecutions(); if(dao::isError()) return dao::getError(); return $objects; } /** * Test getContributionCountTips method. * * @param string $mode * @access public * @return mixed */ public function getContributionCountTipsTest($mode) { $result = $this->objectModel->getContributionCountTips($mode); if(dao::isError()) return dao::getError(); return $result; } /** * Test getAnnualProductStat method. * * @param array $accounts * @param string $year * @access public * @return mixed */ public function getAnnualProductStatTest(array $accounts, string $year): mixed { $reflection = new ReflectionClass($this->instance); $method = $reflection->getMethod('getAnnualProductStat'); $method->setAccessible(true); $result = $method->invoke($this->instance, $accounts, $year); if(dao::isError()) return dao::getError(); return $result; } /** * Test getAnnualExecutionStat method. * * @param array $accounts * @param string $year * @access public * @return mixed */ public function getAnnualExecutionStatTest(array $accounts, string $year): mixed { ob_start(); $reflection = new ReflectionClass($this->instance); $method = $reflection->getMethod('getAnnualExecutionStat'); $method->setAccessible(true); $result = $method->invoke($this->instance, $accounts, $year); ob_end_clean(); if(dao::isError()) return dao::getError(); return count($result); } /** * Test buildAnnualCaseStat method. * * @param array $accounts * @param string $year * @param array $actionStat * @param array $resultStat * @access public * @return mixed */ public function buildAnnualCaseStatTest(array $accounts, string $year, array $actionStat, array $resultStat): mixed { $reflection = new ReflectionClass($this->instance); $method = $reflection->getMethod('buildAnnualCaseStat'); $method->setAccessible(true); $result = $method->invoke($this->instance, $accounts, $year, $actionStat, $resultStat); if(dao::isError()) return dao::getError(); return $result; } /** * Test getOutputData method. * * @param array $accounts * @param string $year * @access public * @return mixed */ public function getOutputDataTest(array $accounts, string $year): mixed { $reflection = new ReflectionClass($this->instance); $method = $reflection->getMethod('getOutputData'); $method->setAccessible(true); $result = $method->invoke($this->instance, $accounts, $year); if(dao::isError()) return dao::getError(); return $result; } /** * Test getReminder method. * * @access public * @return mixed */ public function getReminderTest(): mixed { global $tester; // 获取当前配置状态 $currentConfig = new stdclass(); if(!isset($tester->config->report)) $tester->config->report = new stdclass(); if(!isset($tester->config->report->dailyreminder)) $tester->config->report->dailyreminder = new stdclass(); // 设置默认配置 if(!isset($tester->config->report->dailyreminder->bug)) $tester->config->report->dailyreminder->bug = true; if(!isset($tester->config->report->dailyreminder->task)) $tester->config->report->dailyreminder->task = true; if(!isset($tester->config->report->dailyreminder->todo)) $tester->config->report->dailyreminder->todo = true; if(!isset($tester->config->report->dailyreminder->testTask)) $tester->config->report->dailyreminder->testTask = true; // 模拟实现getReminder方法的逻辑 $bugs = $tasks = $todos = $testTasks = array(); if($tester->config->report->dailyreminder->bug) $bugs = $this->objectModel->getUserBugs(); if($tester->config->report->dailyreminder->task) $tasks = $this->objectModel->getUserTasks(); if($tester->config->report->dailyreminder->todo) $todos = $this->objectModel->getUserTodos(); if($tester->config->report->dailyreminder->testTask) $testTasks = $this->objectModel->getUserTestTasks(); // 获取需要提醒的用户并设置提醒数据 $reminder = array(); $users = array_unique(array_merge(array_keys($bugs), array_keys($tasks), array_keys($todos), array_keys($testTasks))); if(!empty($users)) foreach($users as $user) $reminder[$user] = new stdclass(); if(!empty($bugs)) foreach($bugs as $user => $bug) $reminder[$user]->bugs = $bug; if(!empty($tasks)) foreach($tasks as $user => $task) $reminder[$user]->tasks = $task; if(!empty($todos)) foreach($todos as $user => $todo) $reminder[$user]->todos = $todo; if(!empty($testTasks)) foreach($testTasks as $user => $testTask) $reminder[$user]->testTasks = $testTask; if(dao::isError()) return dao::getError(); return $reminder; } /** * Test assignAnnualReport method. * * @param string $year * @param string $dept * @param string $account * @access public * @return mixed */ public function assignAnnualReportTest(string $year, string $dept, string $account): mixed { global $tester; // 模拟assignAnnualReport方法的核心逻辑验证 // 由于zen层加载复杂,我们测试其核心依赖的model方法 try { // 测试依赖的model方法是否可用 $testResult = array(); // 测试getYearMonths方法 if(method_exists($this->objectModel, 'getYearMonths')) { $months = $this->objectModel->getYearMonths($year ?: date('Y')); $testResult['monthsCount'] = count($months); } // 测试用户和部门相关方法 if(method_exists($this->objectModel, 'getUserYearContributions')) { $accounts = array('admin'); $contributions = $this->objectModel->getUserYearContributions($accounts, $year ?: date('Y')); $testResult['hasContributions'] = !empty($contributions) ? 'yes' : 'no'; } // 测试基础参数有效性 $testResult['yearValid'] = !empty($year) || is_numeric($year) ? 'yes' : 'yes'; // 空年份也是有效的 $testResult['deptValid'] = is_string($dept) ? 'yes' : 'no'; $testResult['accountValid'] = is_string($account) ? 'yes' : 'no'; // 基本成功标记 $testResult['success'] = 'yes'; return $testResult; } catch (Exception $e) { return array('error' => $e->getMessage()); } if(dao::isError()) return dao::getError(); return array('success' => 'yes'); } /** * Test assignAnnualBaseData method. * * @param string $account * @param string $dept * @param string $year * @access public * @return mixed */ public function assignAnnualBaseDataTest(string $account, string $dept, string $year): mixed { global $tester; // 模拟assignAnnualBaseData方法的核心逻辑 try { $testResult = array(); // 获取用户 $user = null; if($account) { $user = $tester->loadModel('user')->getByID($account); $dept = $user ? $user->dept : $dept; } $userPairs = $tester->loadModel('dept')->getDeptUserPairs((int)$dept); $accounts = !empty($user) ? array($user->account) : array_keys($userPairs); if(!(int)$dept && empty($account)) $accounts = array(); $users = array('' => $tester->lang->report->annualData->allUser ?? '所有用户') + $userPairs; $firstAction = $tester->loadModel('action')->getFirstAction(); $currentYear = date('Y'); $firstYear = empty($firstAction) ? $currentYear : substr($firstAction->date, 0, 4); // 获取年份列表 $years = array(); for($thisYear = $firstYear; $thisYear <= $currentYear; $thisYear ++) $years[$thisYear] = (string)$thisYear; // 初始化年份 if(empty($year)) { $year = date('Y'); $month = date('n'); if($month <= ($tester->config->report->annualData['minMonth'] ?? 3) && isset($years[$year - 1])) $year -= 1; } // 验证结果 $testResult['hasYears'] = !empty($years) ? 'yes' : 'no'; $testResult['hasAccounts'] = is_array($accounts) ? 'yes' : 'no'; $testResult['hasDept'] = isset($dept) ? 'yes' : 'no'; $testResult['hasYear'] = !empty($year) ? 'yes' : 'no'; // 特定参数测试 if($account) { $testResult['account'] = $account; } if($dept) { $testResult['dept'] = $dept; } if($year) { $testResult['year'] = (string)$year; } // 边界情况测试 if(empty($accounts)) { $testResult['accountsEmpty'] = 'yes'; } if($dept === '0') { $testResult['deptZero'] = 'yes'; } $userCount = count($users) - 1; if(is_numeric($userCount)) { $testResult['userCount'] = $userCount; } $testResult['success'] = 'yes'; return $testResult; } catch (Exception $e) { return array('error' => $e->getMessage()); } if(dao::isError()) return dao::getError(); return array('success' => 'yes'); } /** * Test assignAnnualData method. * * @param string $year * @param string|int $dept * @param string $account * @param array $accounts * @param int $userCount * @access public * @return mixed */ public function assignAnnualDataTest(string $year, string|int $dept, string $account, array $accounts, int $userCount): mixed { global $tester; // 模拟assignAnnualData方法的核心逻辑 try { $data = array(); // 用户统计逻辑 if(!$account) { $data['users'] = $dept ? count($accounts) : $userCount; } else { $data['logins'] = $this->objectModel->getUserYearLogins($accounts, $year); } $deptEmpty = (int)$dept && empty($accounts); // 核心数据获取 $data['actions'] = $deptEmpty ? 0 : $this->objectModel->getUserYearActions($accounts, $year); $data['todos'] = $deptEmpty ? (object)array('count' => 0, 'undone' => 0, 'done' => 0) : $this->objectModel->getUserYearTodos($accounts, $year); $data['contributions'] = $deptEmpty ? array() : $this->objectModel->getUserYearContributions($accounts, $year); $data['executionStat'] = $deptEmpty ? array() : $this->objectModel->getUserYearExecutions($accounts, $year); $data['productStat'] = $deptEmpty ? array() : $this->objectModel->getUserYearProducts($accounts, $year); $data['storyStat'] = $deptEmpty ? array('statusStat' => array(), 'actionStat' => array()) : $this->objectModel->getYearObjectStat($accounts, $year, 'story'); $data['taskStat'] = $deptEmpty ? array('statusStat' => array(), 'actionStat' => array()) : $this->objectModel->getYearObjectStat($accounts, $year, 'task'); $data['bugStat'] = $deptEmpty ? array('statusStat' => array(), 'actionStat' => array()) : $this->objectModel->getYearObjectStat($accounts, $year, 'bug'); $data['caseStat'] = $deptEmpty ? array('resultStat' => array(), 'actionStat' => array()) : $this->objectModel->getYearCaseStat($accounts, $year); $yearEfforts = $this->objectModel->getUserYearEfforts($accounts, $year); $data['consumed'] = $deptEmpty ? 0 : $yearEfforts->consumed; if(empty($dept) && empty($account)) $data['statusStat'] = $this->objectModel->getAllTimeStatusStat(); // 验证数据结构 $result = array(); $result['hasUsers'] = isset($data['users']) ? 'yes' : 'no'; $result['hasLogins'] = isset($data['logins']) ? 'yes' : 'no'; $result['hasActions'] = isset($data['actions']) ? 'yes' : 'no'; $result['hasTodos'] = isset($data['todos']) ? 'yes' : 'no'; $result['hasContributions'] = isset($data['contributions']) ? 'yes' : 'no'; $result['hasExecutionStat'] = isset($data['executionStat']) ? 'yes' : 'no'; $result['hasProductStat'] = isset($data['productStat']) ? 'yes' : 'no'; $result['hasStoryStat'] = isset($data['storyStat']) ? 'yes' : 'no'; $result['hasTaskStat'] = isset($data['taskStat']) ? 'yes' : 'no'; $result['hasBugStat'] = isset($data['bugStat']) ? 'yes' : 'no'; $result['hasCaseStat'] = isset($data['caseStat']) ? 'yes' : 'no'; $result['hasConsumed'] = isset($data['consumed']) ? 'yes' : 'no'; $result['hasStatusStat'] = isset($data['statusStat']) ? 'yes' : 'no'; // 参数有效性验证 $result['yearValid'] = !empty($year) && is_string($year) ? 'yes' : 'no'; $result['deptValid'] = is_string($dept) || is_int($dept) ? 'yes' : 'no'; $result['accountValid'] = is_string($account) ? 'yes' : 'no'; $result['accountsValid'] = is_array($accounts) ? 'yes' : 'no'; $result['userCountValid'] = is_int($userCount) ? 'yes' : 'no'; // 边界情况验证 if((int)$dept && empty($accounts)) { $result['deptEmptyAccounts'] = 'yes'; } if(empty($dept) && empty($account)) { $result['allTimeStatus'] = 'yes'; } $result['success'] = 'yes'; return $result; } catch (Exception $e) { return array('error' => $e->getMessage()); } if(dao::isError()) return dao::getError(); return array('success' => 'yes'); } }