From 30573be8d5fcdc7f230356946d76f8292840909b Mon Sep 17 00:00:00 2001 From: wanshan Date: Wed, 5 Nov 2025 15:05:54 +0800 Subject: [PATCH 1/2] + [task#152042,doing,3h] add ui test for user module profile --- module/user/test/lib/ui/profile.ui.class.php | 72 ++++++++++++++++++++ module/user/test/ui/page/profile.php | 38 +++++++++++ module/user/test/ui/profile.php | 70 +++++++++++++++++++ 3 files changed, 180 insertions(+) create mode 100644 module/user/test/lib/ui/profile.ui.class.php create mode 100644 module/user/test/ui/page/profile.php create mode 100755 module/user/test/ui/profile.php diff --git a/module/user/test/lib/ui/profile.ui.class.php b/module/user/test/lib/ui/profile.ui.class.php new file mode 100644 index 0000000000..9a4548c51c --- /dev/null +++ b/module/user/test/lib/ui/profile.ui.class.php @@ -0,0 +1,72 @@ +failed('用户对象或ID不能为空'); + + $this->login(); + $form = $this->initForm('user', 'profile', array('userID' => $users['admin']->id), 'appIframe-system'); + $form->wait(2); + + foreach($users as $account => $user) + { + if($account != 'admin') + { + $form->dom->userPicker->picker($user->realname); + $form->wait(2); + if($form->dom->userPicker->getText() != $user->realname) return $this->failed("档案页面切换用户{$user->realname}显示失败"); + } + else + { + //对于admin用户,我们需要获取最新的last/ip/visits喜喜,因为它测试登录的时候,改变了这些字段 + global $uiTester; + $adminUpdate = $uiTester->dao->select('last,ip,visits')->from(TABLE_USER)->where('account')->eq('admin')->fetch(); + } + foreach(PROFILE_ITEMS as $item) + { + $itemName = isset($this->lang->user->{$item}) ? $this->lang->user->{$item} : $item; + switch($item) + { + case 'gender': + $expected = $this->lang->user->genderList->{$user->gender} ?? $user->gender; + break; + case 'role': + $expected = $this->lang->user->roleList->{$user->role} ?? ''; + break; + case 'visits': + $expected = ($user->account == 'admin') ? $adminUpdate->visits : $user->visits; + break; + case 'last': + if($user->account == 'admin') $expected = date('Y-m-d H:i:s', $adminUpdate->last); + else $expected = date('Y-m-d H:i:s', $user->last); + break; + case 'ip': + $expected = ($user->account == 'admin') ? $adminUpdate->ip : $user->ip; + break; + default: + $expected = $user->{$item}; + break; + } + $displayed = $form->dom->{$item}->getText(); + if($displayed != $expected) return $this->failed("档案页面'{$itemName}'显示失败,期望:{$expected},实际:{$displayed}"); + } + } + + return $this->success('开源版m=user&f=profile测试成功'); + } +} \ No newline at end of file diff --git a/module/user/test/ui/page/profile.php b/module/user/test/ui/page/profile.php new file mode 100644 index 0000000000..1af78c3692 --- /dev/null +++ b/module/user/test/ui/page/profile.php @@ -0,0 +1,38 @@ +xpath = array( + // 顶部用户选择器 + 'userPicker' => '//div[contains(@class, "picker-select-single")]', + //详情字段 + 'realname' => '//*[@id="mainContent"]/div/table[1]/tbody/tr[1]/td[1]', + 'gender' => '//*[@id="mainContent"]/div/table[1]/tbody/tr[1]/td[2]', + 'account' => '//*[@id="mainContent"]/div/table[1]/tbody/tr[2]/td[1]', + 'email' => '//*[@id="mainContent"]/div/table[1]/tbody/tr[2]/td[2]/a', + 'dept' => '//*[@id="mainContent"]/div/table[1]/tbody/tr[3]/td[1]', + 'role' => '//*[@id="mainContent"]/div/table[1]/tbody/tr[3]/td[2]', + 'join' => '//*[@id="mainContent"]/div/table[1]/tbody/tr[4]/td[1]', + 'group' => '//*[@id="mainContent"]/div/table[1]/tbody/tr[4]/td[2]', + 'mobile' => '//*[@id="mainContent"]/div/table[2]/tbody/tr[1]/td[1]', + 'weixin' => '//*[@id="mainContent"]/div/table[2]/tbody/tr[1]/td[2]', + 'phone' => '//*[@id="mainContent"]/div/table[2]/tbody/tr[2]/td[1]', + 'qq' => '//*[@id="mainContent"]/div/table[2]/tbody/tr[2]/td[2]', + 'zipcode' => '//*[@id="mainContent"]/div/table[2]/tbody/tr[3]/td[1]', + 'address' => '//*[@id="mainContent"]/div/table[2]/tbody/tr[3]/td[2]', + 'commiter' => '//*[@id="mainContent"]/div/table[3]/tbody/tr[1]/td[1]', + 'skype' => '//*[@id="mainContent"]/div/table[3]/tbody/tr[1]/td[2]/a', + 'visits' => '//*[@id="mainContent"]/div/table[3]/tbody/tr[2]/td[1]', + 'whatsapp' => '//*[@id="mainContent"]/div/table[3]/tbody/tr[2]/td[2]', + 'last' => '//*[@id="mainContent"]/div/table[3]/tbody/tr[3]/td[1]', + 'slack' => '//*[@id="mainContent"]/div/table[3]/tbody/tr[3]/td[2]', + 'ip' => '//*[@id="mainContent"]/div/table[3]/tbody/tr[4]/td[1]', + 'dingding' => '//*[@id="mainContent"]/div/table[3]/tbody/tr[4]/td[2]' + ); + + $this->dom->xpath = array_merge($this->dom->xpath, $this->xpath); + } +} \ No newline at end of file diff --git a/module/user/test/ui/profile.php b/module/user/test/ui/profile.php new file mode 100755 index 0000000000..3396725f1e --- /dev/null +++ b/module/user/test/ui/profile.php @@ -0,0 +1,70 @@ +#!/usr/bin/env php +id->range('1-3'); +$group->name->range('ADMIN,DEV,QA'); +$group->role->range('admin,dev,qa'); +$group->gen(3); + +$userGroup = zenData('usergroup'); +$userGroup->account->range('admin,user1,user2'); +$userGroup->group->range('1-3'); +$userGroup->gen(3); + +$dept = zenData('dept'); +$dept->id->range('1-3'); +$dept->name->range('总办,开发部,测试部'); +$dept->gen(3); + +$user = zenData('user'); +$user->id->range('1-3'); +$user->account->range('admin,user1,user2'); +$user->password->range($config->uitest->defaultPassword)->format('md5'); +$user->realname->range('管理员,用户1,用户2'); +$user->gender->range('f,m'); +$user->email->range('admin,user1,user2')->postfix('@chandao.com'); +$user->dept->range('1-3'); +$user->role->range('admin,dev,qa'); +$user->mobile->range('13988888888'); +$user->weixin->range('admin,user1,user2')->postfix('@chandao.com'); +$user->zipcode->range('610041'); +$user->address->range('CD/SC/CHINA'); +$user->commiter->range('admin,user1,user2')->postfix('@chandao.com'); +$user->skype->range('admin,user1,user2')->postfix('@chandao.com'); +$user->slack->range('admin,user1,user2')->postfix('@chandao.com'); +$user->whatsapp->range('admin,user1,user2')->postfix('@chandao.com'); +$user->dingding->range('admin,user1,user2')->postfix('@chandao.com'); +$user->ip->range('10.0.0.1','10.0.0.2','10.0.0.3'); +$user->gen(3); + +global $uiTester; +$users = array(); +foreach(['admin','user1','user2'] as $account) +{ + $users[$account] = $uiTester->dao->select('u.*, g.name as `group`, d.name as dept') + ->from(TABLE_USER)->alias('u') + ->leftJoin(TABLE_USERGROUP)->alias('ug')->on('u.account = ug.account') + ->leftJoin(TABLE_GROUP)->alias('g')->on('ug.group = g.id') + ->leftJoin(TABLE_DEPT)->alias('d')->on('u.dept = d.id') + ->where('u.account')->eq($account) + ->fetch(); +} +$tester = new profileTester(); + +r($tester->verifyUserProfile($users)) && p('status,message') && e('SUCCESS,开源版m=user&f=profile测试成功'); //开源版m=user&f=profile测试 + +$tester->closeBrowser(); \ No newline at end of file From 49fe47f5624c8c55ae5d6404cf6908233a45ebb8 Mon Sep 17 00:00:00 2001 From: wanshan Date: Wed, 5 Nov 2025 16:27:14 +0800 Subject: [PATCH 2/2] * [task#152042,doing,0.5h] add ui test for user module profile --- module/user/test/lib/ui/profile.ui.class.php | 47 +++++++++++--------- module/user/test/ui/profile.php | 16 +------ 2 files changed, 28 insertions(+), 35 deletions(-) diff --git a/module/user/test/lib/ui/profile.ui.class.php b/module/user/test/lib/ui/profile.ui.class.php index 9a4548c51c..212b5d5af6 100644 --- a/module/user/test/lib/ui/profile.ui.class.php +++ b/module/user/test/lib/ui/profile.ui.class.php @@ -7,23 +7,41 @@ define('PROFILE_ITEMS', ['realname', 'gender', 'account', 'email', 'dept', 'role class profileTester extends tester { + public $users; + + public function __construct() + { + parent::__construct(); + $this->login(); + global $uiTester; + $records = $uiTester->dao->select('u.*, g.name as `group`, d.name as dept') + ->from(TABLE_USER)->alias('u') + ->leftJoin(TABLE_USERGROUP)->alias('ug')->on('u.account = ug.account') + ->leftJoin(TABLE_GROUP)->alias('g')->on('ug.group = g.id') + ->leftJoin(TABLE_DEPT)->alias('d')->on('u.dept = d.id') + ->fetchAll(); + $this->users = array(); + foreach($records as $record) + { + $this->users[$record->account] = $record; + } + } + /** * 校验user模块profile视图的基本信息展示 * Verify user profile basic info display * - * @param object $user 用户对象(包含id/account/realname/role/gender等) * @access public * @return object 成功或失败对象 */ - public function verifyUserProfile($users) + public function verifyUserProfile() { - if(empty($users) || empty($users['admin'])) return $this->failed('用户对象或ID不能为空'); + if(empty($this->users) || empty($this->users['admin'])) return $this->failed('用户对象或ID不能为空'); - $this->login(); - $form = $this->initForm('user', 'profile', array('userID' => $users['admin']->id), 'appIframe-system'); + $form = $this->initForm('user', 'profile', array('userID' => $this->users['admin']->id), 'appIframe-system'); $form->wait(2); - foreach($users as $account => $user) + foreach($this->users as $account => $user) { if($account != 'admin') { @@ -31,12 +49,6 @@ class profileTester extends tester $form->wait(2); if($form->dom->userPicker->getText() != $user->realname) return $this->failed("档案页面切换用户{$user->realname}显示失败"); } - else - { - //对于admin用户,我们需要获取最新的last/ip/visits喜喜,因为它测试登录的时候,改变了这些字段 - global $uiTester; - $adminUpdate = $uiTester->dao->select('last,ip,visits')->from(TABLE_USER)->where('account')->eq('admin')->fetch(); - } foreach(PROFILE_ITEMS as $item) { $itemName = isset($this->lang->user->{$item}) ? $this->lang->user->{$item} : $item; @@ -48,15 +60,8 @@ class profileTester extends tester case 'role': $expected = $this->lang->user->roleList->{$user->role} ?? ''; break; - case 'visits': - $expected = ($user->account == 'admin') ? $adminUpdate->visits : $user->visits; - break; case 'last': - if($user->account == 'admin') $expected = date('Y-m-d H:i:s', $adminUpdate->last); - else $expected = date('Y-m-d H:i:s', $user->last); - break; - case 'ip': - $expected = ($user->account == 'admin') ? $adminUpdate->ip : $user->ip; + $expected = date('Y-m-d H:i:s', $user->last); break; default: $expected = $user->{$item}; @@ -69,4 +74,4 @@ class profileTester extends tester return $this->success('开源版m=user&f=profile测试成功'); } -} \ No newline at end of file +} diff --git a/module/user/test/ui/profile.php b/module/user/test/ui/profile.php index 3396725f1e..a42b7fb67c 100755 --- a/module/user/test/ui/profile.php +++ b/module/user/test/ui/profile.php @@ -48,23 +48,11 @@ $user->skype->range('admin,user1,user2')->postfix('@chandao.com'); $user->slack->range('admin,user1,user2')->postfix('@chandao.com'); $user->whatsapp->range('admin,user1,user2')->postfix('@chandao.com'); $user->dingding->range('admin,user1,user2')->postfix('@chandao.com'); -$user->ip->range('10.0.0.1','10.0.0.2','10.0.0.3'); +$user->ip->range('10.0.0.1'); $user->gen(3); -global $uiTester; -$users = array(); -foreach(['admin','user1','user2'] as $account) -{ - $users[$account] = $uiTester->dao->select('u.*, g.name as `group`, d.name as dept') - ->from(TABLE_USER)->alias('u') - ->leftJoin(TABLE_USERGROUP)->alias('ug')->on('u.account = ug.account') - ->leftJoin(TABLE_GROUP)->alias('g')->on('ug.group = g.id') - ->leftJoin(TABLE_DEPT)->alias('d')->on('u.dept = d.id') - ->where('u.account')->eq($account) - ->fetch(); -} $tester = new profileTester(); -r($tester->verifyUserProfile($users)) && p('status,message') && e('SUCCESS,开源版m=user&f=profile测试成功'); //开源版m=user&f=profile测试 +r($tester->verifyUserProfile()) && p('status,message') && e('SUCCESS,开源版m=user&f=profile测试成功'); //开源版m=user&f=profile测试 $tester->closeBrowser(); \ No newline at end of file