Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
易企天创
zentaoatf
提交
9b5eaf0d
Z
zentaoatf
项目概览
易企天创
/
zentaoatf
大约 1 年 前同步成功
通知
11
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
3
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Z
zentaoatf
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
3
Issue
3
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9b5eaf0d
编写于
5月 30, 2023
作者:
Z
zhaoke
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
format code
上级
d6e54a21
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
190 addition
and
76 deletion
+190
-76
.gitignore
.gitignore
+2
-0
internal/pkg/helper/zentao/bug.go
internal/pkg/helper/zentao/bug.go
+0
-1
pkg/lib/shell/terminal-win.go
pkg/lib/shell/terminal-win.go
+0
-2
test/cli/cli_set_test.go
test/cli/cli_set_test.go
+2
-2
test/cli/main.go
test/cli/main.go
+3
-0
test/helper/common/docker.go
test/helper/common/docker.go
+17
-5
test/helper/common/test.go
test/helper/common/test.go
+26
-1
test/helper/common/ztf.go
test/helper/common/ztf.go
+10
-0
test/helper/conf/variable.go
test/helper/conf/variable.go
+2
-0
test/helper/zentao/ui/zentao.go
test/helper/zentao/ui/zentao.go
+61
-40
test/helper/ztf/ztf.go
test/helper/ztf/ztf.go
+2
-2
test/restapi/main.go
test/restapi/main.go
+9
-5
test/ui/helper/action.go
test/ui/helper/action.go
+16
-0
test/ui/main.go
test/ui/main.go
+36
-14
test/ui/ui_site_test.go
test/ui/ui_site_test.go
+4
-4
未找到文件。
.gitignore
浏览文件 @
9b5eaf0d
...
...
@@ -40,6 +40,7 @@ logs/
#test
/test/conf
/test/log
/test/screenshot
/test/cli/product1
/test/ui/docker
/test/ui/log
...
...
@@ -67,3 +68,4 @@ node_modules
/internal/pkg/plugin/zap-plugin
/zap_key
/test/restapi/allure-results/
zentaoatf.exe~
internal/pkg/helper/zentao/bug.go
浏览文件 @
9b5eaf0d
...
...
@@ -210,7 +210,6 @@ func GenBugStepText(step commDomain.StepLog) string {
stepResults
:=
make
([]
string
,
0
)
stepId
,
_
:=
strconv
.
Atoi
(
step
.
Id
)
stepId
+=
1
stepTxt
:=
fmt
.
Sprintf
(
"%s%d: %s %s
\n
"
,
i118Utils
.
Sprintf
(
"step"
),
stepId
,
step
.
Name
,
step
.
Status
)
for
_
,
checkpoint
:=
range
step
.
CheckPoints
{
text
:=
fmt
.
Sprintf
(
...
...
pkg/lib/shell/terminal-win.go
浏览文件 @
9b5eaf0d
...
...
@@ -4,7 +4,6 @@
package
shellUtils
import
(
"fmt"
"os/exec"
"regexp"
"strconv"
...
...
@@ -44,7 +43,6 @@ func WindowSize() window {
}
func
getWindowSizeFromLine
(
line
string
,
win
*
window
)
{
fmt
.
Println
(
line
)
if
strings
.
Contains
(
line
,
"行"
)
||
strings
.
Contains
(
line
,
"Lines"
)
{
re
:=
regexp
.
MustCompile
(
`\d+`
)
rs
:=
re
.
FindAllString
(
line
,
-
1
)
...
...
test/cli/cli_set_test.go
浏览文件 @
9b5eaf0d
...
...
@@ -92,14 +92,14 @@ func testSet(language string) (ret string) {
if
_
,
err
=
child
.
Expect
(
accountRe
,
time
.
Second
*
5
);
err
!=
nil
{
return
fmt
.
Sprintf
(
"expect %s, actual %s"
,
accountRe
,
err
.
Error
())
}
if
err
=
child
.
Send
(
"admin"
+
constTestHelper
.
NewLine
);
err
!=
nil
{
if
err
=
child
.
Send
(
constTestHelper
.
ZentaoUsername
+
constTestHelper
.
NewLine
);
err
!=
nil
{
return
err
.
Error
()
}
if
_
,
err
=
child
.
Expect
(
passwordRe
,
time
.
Second
*
5
);
err
!=
nil
{
return
fmt
.
Sprintf
(
"expect %s, actual %s"
,
passwordRe
,
err
.
Error
())
}
if
err
=
child
.
Send
(
"Test123456."
+
constTestHelper
.
NewLine
);
err
!=
nil
{
if
err
=
child
.
Send
(
constTestHelper
.
ZentaoPassword
+
constTestHelper
.
NewLine
);
err
!=
nil
{
return
err
.
Error
()
}
if
runtime
.
GOOS
==
"windows"
{
...
...
test/cli/main.go
浏览文件 @
9b5eaf0d
...
...
@@ -3,6 +3,7 @@ package main
import
(
"flag"
"fmt"
"strings"
"testing"
commConsts
"github.com/easysoft/zentaoatf/internal/pkg/consts"
...
...
@@ -30,6 +31,8 @@ func main() {
uiTest
.
Close
()
}()
if
*
runFrom
==
"jenkins"
{
constTestHelper
.
ZentaoSiteUrl
=
constTestHelper
.
ZentaoSiteUrl
[
:
strings
.
LastIndex
(
constTestHelper
.
ZentaoSiteUrl
,
":"
)]
err
:=
commonTestHelper
.
InitZentaoData
()
if
err
!=
nil
{
fmt
.
Println
(
"Init zentao data fail "
,
err
)
...
...
test/helper/common/docker.go
浏览文件 @
9b5eaf0d
...
...
@@ -15,14 +15,12 @@ import (
func
Run
(
version
string
,
codeDir
string
)
(
err
error
)
{
versionNumber
:=
strings
.
ReplaceAll
(
version
,
"."
,
"_"
)
// codeDir = "/www/zentaopms" + versionNumber
_
,
err
=
os
.
Stat
(
codeDir
)
if
os
.
IsExist
(
err
)
{
os
.
RemoveAll
(
codeDir
)
}
// cmd := exec.Command("docker", "run", "--name", "zentao"+versionNumber, "-p", "8081:80", "-v", codeDir+":/www/zentaopms", "-d", "easysoft/zentao:"+version)
cmd
:=
exec
.
Command
(
"docker"
,
"run"
,
"--name"
,
"zentao"
+
versionNumber
,
"-p"
,
fmt
.
Sprintf
(
"%d:80"
,
constTestHelper
.
ZentaoPort
),
"-d"
,
"easysoft/zentao:"
+
version
)
fmt
.
Println
(
cmd
.
String
())
...
...
@@ -34,6 +32,7 @@ func Run(version string, codeDir string) (err error) {
if
strings
.
Contains
(
string
(
output
),
"exit"
)
{
return
errors
.
New
(
"Run docker fail"
)
}
return
err
}
...
...
@@ -43,6 +42,7 @@ func IsExistContainer(name string) bool {
if
err
!=
nil
{
return
false
}
return
strings
.
Contains
(
string
(
output
),
name
)
}
...
...
@@ -52,6 +52,7 @@ func IsRunning(name string) bool {
if
err
!=
nil
{
return
false
}
return
strings
.
Contains
(
string
(
output
),
name
)
}
...
...
@@ -61,12 +62,14 @@ func List() []string {
if
err
!=
nil
{
return
nil
}
dockers
:=
strings
.
Split
(
string
(
output
),
"
\n
"
)
for
index
,
dockerName
:=
range
dockers
{
dockerName
=
strings
.
TrimSpace
(
dockerName
)
dockerName
=
strings
.
Trim
(
dockerName
,
"'"
)
dockers
[
index
]
=
dockerName
}
return
dockers
}
...
...
@@ -77,26 +80,31 @@ func Start(name string) bool {
if
err
!=
nil
{
return
false
}
return
strings
.
Contains
(
string
(
output
),
name
)
}
func
StopAll
()
bool
{
dockers
:=
List
()
for
_
,
dockerName
:=
range
dockers
{
if
strings
.
Contains
(
dockerName
,
"zentao"
)
{
Stop
(
dockerName
)
}
}
return
true
}
func
Stop
(
name
string
)
bool
{
cmd
:=
exec
.
Command
(
"docker"
,
"kill"
,
name
)
fmt
.
Println
(
cmd
.
String
())
_
,
err
:=
cmd
.
CombinedOutput
()
if
err
!=
nil
{
return
false
}
return
true
}
...
...
@@ -104,17 +112,18 @@ func InitZentao(version string) (err error) {
versionNumber
:=
strings
.
ReplaceAll
(
version
,
"."
,
"_"
)
containerName
:=
"zentao"
+
versionNumber
isExist
:=
IsExistContainer
(
containerName
)
apath
,
_
:=
os
.
Getwd
()
codeDir
:=
apath
+
"/docker/www/zentao"
+
versionNumber
pwd
,
_
:=
os
.
Getwd
()
codeDir
:=
pwd
+
"/docker/www/zentao"
+
versionNumber
if
runtime
.
GOOS
==
"windows"
{
codeDir
=
apath
+
`\docker\www\zentao`
+
versionNumber
codeDir
=
pwd
+
`\docker\www\zentao`
+
versionNumber
}
if
isExist
{
if
!
IsRunning
(
containerName
)
{
StopAll
()
Start
(
containerName
)
waitZentaoAccessed
()
}
}
else
{
...
...
@@ -123,8 +132,10 @@ func InitZentao(version string) (err error) {
if
err
!=
nil
{
return
}
waitZentaoAccessed
()
}
err
=
uiTest
.
InitZentaoData
(
version
,
codeDir
)
return
}
...
...
@@ -139,6 +150,7 @@ func waitZentaoAccessed() {
time
.
AfterFunc
(
20
*
time
.
Second
,
func
()
{
isTimeout
=
true
})
for
{
status
:=
uiTest
.
GetStatus
(
constTestHelper
.
ZentaoSiteUrl
)
if
isTimeout
||
status
{
...
...
test/helper/common/test.go
浏览文件 @
9b5eaf0d
...
...
@@ -31,7 +31,7 @@ func TestCli() (err error) {
fmt
.
Println
(
testPath
,
req
.
Cmd
)
report
:=
ExecUnit
(
req
,
"cli"
)
config
:=
commDomain
.
WorkspaceConf
{
Url
:
constTestHelper
.
ZentaoSiteUrl
+
"/"
,
Password
:
"Test123456."
,
Username
:
"admin"
}
config
:=
commDomain
.
WorkspaceConf
{
Url
:
constTestHelper
.
ZentaoSiteUrl
+
"/"
,
Password
:
constTestHelper
.
ZentaoPassword
,
Username
:
constTestHelper
.
ZentaoUsername
}
err
=
zentaoHelper
.
CommitResult
(
report
,
1
,
0
,
config
,
nil
)
...
...
@@ -42,6 +42,31 @@ func TestCli() (err error) {
return
}
func
TestUi
()
(
err
error
)
{
var
screenshotPath
=
fmt
.
Sprintf
(
"%stest/screenshot"
,
constTestHelper
.
RootPath
)
os
.
RemoveAll
(
screenshotPath
)
fileUtils
.
MkDirIfNeeded
(
screenshotPath
)
testPath
:=
fmt
.
Sprintf
(
`%stest`
,
constTestHelper
.
RootPath
)
if
runtime
.
GOOS
==
"windows"
{
testPath
=
fmt
.
Sprintf
(
`%stest`
,
constTestHelper
.
RootPath
)
}
req
:=
serverDomain
.
TestSet
{
WorkspacePath
:
testPath
,
Cmd
:
"go test ./ui -v -timeout 10m"
,
TestTool
:
commConsts
.
GoTest
,
}
report
:=
ExecUnit
(
req
,
"ui"
)
config
:=
commDomain
.
WorkspaceConf
{
Url
:
constTestHelper
.
ZentaoSiteUrl
+
"/"
,
Password
:
constTestHelper
.
ZentaoPassword
,
Username
:
constTestHelper
.
ZentaoUsername
}
err
=
zentaoHelper
.
CommitResult
(
report
,
1
,
0
,
config
,
nil
)
if
report
.
Fail
>
0
{
os
.
Exit
(
1
)
}
return
}
func
ExecUnit
(
req
serverDomain
.
TestSet
,
unitType
string
)
(
report
commDomain
.
ZtfReport
)
{
if
unitType
==
"ui"
{
commConsts
.
AllureReportDir
=
"ui/allure-results"
...
...
test/helper/common/ztf.go
浏览文件 @
9b5eaf0d
...
...
@@ -42,14 +42,17 @@ func BuildCli() (err error) {
func
RunServer
()
(
err
error
)
{
ztfPath
:=
GetZtfPath
()
var
cmd
*
exec
.
Cmd
cmd
=
exec
.
Command
(
ztfPath
,
"-P"
,
"8085"
,
"-uuid=ui_auto_test"
)
cmd
.
Dir
=
constTestHelper
.
RootPath
fmt
.
Println
(
cmd
.
String
())
err
=
cmd
.
Start
()
if
err
!=
nil
{
return
}
return
}
...
...
@@ -57,15 +60,18 @@ func RunUi() (err error) {
var
cmd
*
exec
.
Cmd
cmd
=
exec
.
Command
(
"npm"
,
"run"
,
"serve"
,
"-uuid=ui_auto_test"
)
cmd
.
Dir
=
constTestHelper
.
RootPath
+
constTestHelper
.
FilePthSep
+
"ui"
fmt
.
Println
(
cmd
.
String
())
stdout
,
err
:=
cmd
.
StdoutPipe
()
if
err
!=
nil
{
return
}
err
=
cmd
.
Start
()
if
err
!=
nil
{
return
}
reader1
:=
bufio
.
NewReader
(
stdout
)
go
func
()
{
for
{
...
...
@@ -75,11 +81,13 @@ func RunUi() (err error) {
if
err2
!=
nil
{
return
}
if
err
!=
nil
||
io
.
EOF
==
err
{
break
}
}
}()
WaitZtfAccessed
()
return
}
...
...
@@ -105,11 +113,13 @@ func WaitZtfAccessed() {
time
.
AfterFunc
(
120
*
time
.
Second
,
func
()
{
isTimeout
=
true
})
for
{
status
:=
uiTest
.
GetStatus
(
constTestHelper
.
ZtfUrl
)
if
isTimeout
||
status
{
return
}
time
.
Sleep
(
time
.
Second
)
}
}
test/helper/conf/variable.go
浏览文件 @
9b5eaf0d
...
...
@@ -21,6 +21,8 @@ var (
ZtfUrl
=
"http://127.0.0.1:8000/"
ZentaoUsername
=
"admin"
ZentaoPassword
=
"Test123456."
ZentaoExtUrl
=
"https://www.zentao.net/file-download-22700.html"
)
func
init
()
{
...
...
test/helper/zentao/ui/zentao.go
浏览文件 @
9b5eaf0d
...
...
@@ -23,6 +23,7 @@ func GetStatus(url string) bool {
WaitUntil
:
playwright
.
WaitUntilStateDomcontentloaded
});
err
!=
nil
{
return
false
}
return
true
}
...
...
@@ -31,15 +32,17 @@ func Login(url string) (err error) {
WaitUntil
:
playwright
.
WaitUntilStateDomcontentloaded
});
err
!=
nil
{
return
}
title
,
_
:=
page
.
Title
()
if
!
strings
.
Contains
(
title
,
"用户登录"
)
{
return
}
err
=
page
.
Fill
(
`input[name="account"]`
,
"admin"
)
err
=
page
.
Fill
(
`input[name="account"]`
,
constTestHelper
.
ZentaoUsername
)
if
err
!=
nil
{
return
}
err
=
page
.
Fill
(
`input[name="password"]`
,
"Test123456."
)
err
=
page
.
Fill
(
`input[name="password"]`
,
constTestHelper
.
ZentaoPassword
)
if
err
!=
nil
{
return
}
...
...
@@ -55,6 +58,7 @@ func Login(url string) (err error) {
if
err
!=
nil
{
return
}
if
title
==
"流程 - 禅道"
||
title
==
"地盘-个性化设置 - 禅道"
{
err
=
page
.
Click
(
`button:has-text("保存")`
)
if
err
!=
nil
{
...
...
@@ -62,6 +66,7 @@ func Login(url string) (err error) {
}
}
page
.
WaitForTimeout
(
1000
)
for
{
page
.
WaitForTimeout
(
100
)
isVisible
,
err
:=
page
.
IsVisible
(
"#triggerModal"
)
...
...
@@ -71,10 +76,12 @@ func Login(url string) (err error) {
if
!
isVisible
{
break
}
isVisible
,
_
=
page
.
IsVisible
(
"#iframe-triggerModal"
)
if
!
isVisible
{
continue
}
iframeName
:=
"iframe-triggerModal"
iframe
:=
page
.
Frame
(
playwright
.
PageFrameOptions
{
Name
:
&
iframeName
})
isVisible
,
_
=
iframe
.
IsVisible
(
"footer>>text=下一步"
)
...
...
@@ -82,13 +89,16 @@ func Login(url string) (err error) {
err
=
iframe
.
Click
(
"footer>>text=下一步"
)
continue
}
isVisible
,
_
=
iframe
.
IsVisible
(
"footer>>text=关闭"
)
if
isVisible
{
err
=
iframe
.
Click
(
"footer>>text=关闭"
)
continue
}
return
errors
.
New
(
"Find close features fail"
)
}
page
.
WaitForTimeout
(
1000
)
return
}
...
...
@@ -98,12 +108,16 @@ func createModule() (err error) {
WaitUntil
:
playwright
.
WaitUntilStateDomcontentloaded
});
err
!=
nil
{
return
}
page
.
Click
(
".nav>>li>>text=测试"
)
iframeName
:=
"app-qa"
iframe
:=
page
.
Frame
(
playwright
.
PageFrameOptions
{
Name
:
&
iframeName
})
if
iframe
!=
nil
{
iframe
.
Click
(
".nav>>li>>text=用例"
)
iframe
.
Click
(
"#mainContent>>a>>text=维护模块"
)
err
=
iframe
.
Fill
(
`input[name="modules\[\]"]>>nth=0`
,
"module1"
)
if
err
!=
nil
{
return
...
...
@@ -122,6 +136,7 @@ func createModule() (err error) {
page
.
WaitForSelector
(
"#dropMenu>>.list-group"
,
playwright
.
PageWaitForSelectorOptions
{
State
:
playwright
.
WaitForSelectorStateVisible
})
page
.
Click
(
"#dropMenu>>a:has-text('企业网站建设')"
)
page
.
Click
(
"#mainContent>>a>>text=维护模块"
)
err
=
page
.
Fill
(
`input[name="modules\[\]"]>>nth=0`
,
"module1"
)
if
err
!=
nil
{
return
...
...
@@ -145,9 +160,11 @@ func createSuite() (err error) {
WaitUntil
:
playwright
.
WaitUntilStateDomcontentloaded
});
err
!=
nil
{
return
}
page
.
Click
(
".nav>>li>>text=测试"
)
iframeName
:=
"app-qa"
iframe
:=
page
.
Frame
(
playwright
.
PageFrameOptions
{
Name
:
&
iframeName
})
if
iframe
!=
nil
{
iframe
.
Click
(
".nav>>li>>text=套件"
)
iframe
.
Click
(
"#mainMenu>>text=建套件"
)
...
...
@@ -159,16 +176,19 @@ func createSuite() (err error) {
if
err
!=
nil
{
return
}
_
,
err
=
iframe
.
WaitForSelector
(
"#submit"
,
playwright
.
PageWaitForSelectorOptions
{
State
:
playwright
.
WaitForSelectorStateDetached
})
if
err
!=
nil
{
return
}
iframe
.
Click
(
"#mainContent>>a[title=
\"
关联用例
\"
]"
)
iframe
.
Click
(
`input[name="cases\[\]"]>>nth=-1`
)
iframe
.
Click
(
"#submit:has-text('保存')"
)
}
else
{
page
.
Click
(
".nav>>li>>text=套件"
)
page
.
Click
(
"#mainMenu>>text=建套件"
)
err
=
page
.
Fill
(
`#name`
,
"test_suite"
)
if
err
!=
nil
{
return
...
...
@@ -177,10 +197,12 @@ func createSuite() (err error) {
if
err
!=
nil
{
return
}
_
,
err
=
page
.
WaitForSelector
(
"#submit"
,
playwright
.
PageWaitForSelectorOptions
{
State
:
playwright
.
WaitForSelectorStateDetached
})
if
err
!=
nil
{
return
}
page
.
Click
(
"#mainContent>>a[title=
\"
关联用例
\"
]"
)
page
.
Click
(
`input[name="cases\[\]"]>>nth=-1`
)
page
.
Click
(
"#submit:has-text('保存')"
)
...
...
@@ -193,10 +215,12 @@ func getLastUnitTestResult() (results []map[string]string, err error) {
WaitUntil
:
playwright
.
WaitUntilStateDomcontentloaded
});
err
!=
nil
{
return
}
page
.
Click
(
".nav>>li>>text=测试"
)
iframeName
:=
"app-qa"
iframe
:=
page
.
Frame
(
playwright
.
PageFrameOptions
{
Name
:
&
iframeName
})
results
=
[]
map
[
string
]
string
{}
if
iframe
!=
nil
{
iframe
.
Click
(
".nav>>li>>text=用例"
)
navbarHtml
,
_
:=
iframe
.
InnerHTML
(
"#navbar"
)
...
...
@@ -206,10 +230,12 @@ func getLastUnitTestResult() (results []map[string]string, err error) {
iframe
.
Click
(
"#mainMenu>>a>>text=单元测试"
)
iframe
.
Click
(
"#taskList>>tr>>nth=1>>td>>nth=1>>a"
)
iframe
.
WaitForSelector
(
"#taskList"
,
playwright
.
PageWaitForSelectorOptions
{
State
:
playwright
.
WaitForSelectorStateDetached
})
tds
,
err
:=
iframe
.
QuerySelectorAll
(
"table>>tr"
)
if
err
!=
nil
{
return
results
,
err
}
for
index
:=
1
;
index
<
len
(
tds
);
index
++
{
titleNth
:=
"2"
statusNth
:=
"5"
...
...
@@ -221,6 +247,7 @@ func getLastUnitTestResult() (results []map[string]string, err error) {
if
err
!=
nil
||
titleSelector
==
nil
{
continue
}
title
,
err
:=
titleSelector
.
InnerText
()
if
err
!=
nil
{
continue
...
...
@@ -233,6 +260,7 @@ func getLastUnitTestResult() (results []map[string]string, err error) {
if
err
!=
nil
{
continue
}
results
=
append
(
results
,
map
[
string
]
string
{
"title"
:
title
,
"status"
:
status
,
...
...
@@ -244,7 +272,9 @@ func getLastUnitTestResult() (results []map[string]string, err error) {
page
.
Click
(
"#currentItem"
)
page
.
Click
(
"#dropMenu>>a>>text=公司企业网站建设"
)
page
.
Click
(
"#taskList>>tr>>nth=1>>td>>nth=1>>a"
)
page
.
WaitForSelector
(
"#taskList"
,
playwright
.
PageWaitForSelectorOptions
{
State
:
playwright
.
WaitForSelectorStateDetached
})
tds
,
err
:=
page
.
QuerySelectorAll
(
"table>>tr"
)
if
err
!=
nil
{
return
results
,
err
...
...
@@ -264,6 +294,7 @@ func getLastUnitTestResult() (results []map[string]string, err error) {
if
err
!=
nil
{
continue
}
statusSelector
,
err
:=
page
.
QuerySelector
(
"table>>tr>>nth="
+
strconv
.
Itoa
(
index
)
+
">>td>>nth="
+
statusNth
)
if
err
!=
nil
{
continue
...
...
@@ -272,6 +303,7 @@ func getLastUnitTestResult() (results []map[string]string, err error) {
if
err
!=
nil
{
continue
}
results
=
append
(
results
,
map
[
string
]
string
{
"title"
:
title
,
"status"
:
status
,
...
...
@@ -286,6 +318,7 @@ func CheckUnitTestResult() bool {
if
err
!=
nil
{
return
false
}
titleExist
:=
map
[
string
]
bool
{}
for
_
,
result
:=
range
results
{
titleExist
[
result
[
"title"
]]
=
true
...
...
@@ -296,6 +329,7 @@ func CheckUnitTestResult() bool {
return
false
}
}
return
titleExist
[
"loginFail"
]
==
true
&&
titleExist
[
"loginSuccess"
]
==
true
}
...
...
@@ -309,54 +343,21 @@ func InstallExt(version, codeDir string) error {
}
func
downloadExt
(
codeDir
string
)
(
err
error
)
{
if
_
,
err
=
page
.
Goto
(
"https://www.zentao.net/extension-browseRelease-186-front.html"
,
playwright
.
PageGotoOptions
{
WaitUntil
:
playwright
.
WaitUntilStateDomcontentloaded
});
err
!=
nil
{
return
}
err
=
page
.
Click
(
"#siteNav>>a:has-text('登录')"
)
err
=
fileUtils
.
Download
(
constTestHelper
.
ZentaoExtUrl
,
"restful.zip"
)
if
err
!=
nil
{
return
}
err
=
page
.
Click
(
"#loginModal>>a>>text=密码登录"
)
if
err
!=
nil
{
return
}
err
=
page
.
Fill
(
"#loginModal>>#account"
,
"wx_62ba567413304"
)
if
err
!=
nil
{
return
}
err
=
page
.
Fill
(
"#loginModal>>#password"
,
"zhaoke@easycorp.ltd"
)
if
err
!=
nil
{
return
}
err
=
page
.
Click
(
"#loginModal>>.login-form>>#submit"
)
if
err
!=
nil
{
return
}
downloadInfo
,
err
:=
page
.
ExpectDownload
(
func
()
error
{
err
=
page
.
Click
(
"td>>a>>text=下载"
)
return
err
})
if
err
!=
nil
{
return
}
filePath
,
err
:=
downloadInfo
.
Path
()
if
err
!=
nil
{
return
}
_
,
err
=
fileUtils
.
CopyFile
(
filePath
,
"restful.zip"
)
if
err
!=
nil
{
return
}
err
=
fileUtils
.
Unzip
(
"restful.zip"
,
""
)
if
err
!=
nil
{
return
}
err
=
fileUtils
.
CopyDir
(
"restful"
+
commConsts
.
PthSep
,
codeDir
)
if
err
!=
nil
{
return
}
os
.
RemoveAll
(
"restful"
)
os
.
Remove
(
"restful.zip"
)
return
...
...
@@ -368,11 +369,13 @@ func InitZentaoData(version string, codeDir string) (err error) {
WaitUntil
:
playwright
.
WaitUntilStateDomcontentloaded
});
err
!=
nil
{
return
}
title
,
err
:=
page
.
Title
()
fmt
.
Println
(
title
)
if
err
!=
nil
{
return
}
if
strings
.
Contains
(
title
,
"欢迎使用禅道"
)
{
err
=
page
.
Click
(
"text=开始安装"
)
if
err
!=
nil
{
...
...
@@ -384,12 +387,14 @@ func InitZentaoData(version string, codeDir string) (err error) {
if
err
!=
nil
{
return
}
title
,
err
=
page
.
Title
()
fmt
.
Println
(
title
)
err
=
page
.
Click
(
"text=下一步"
)
if
err
!=
nil
{
return
}
title
,
err
=
page
.
Title
()
fmt
.
Println
(
title
)
err
=
page
.
Fill
(
`input[name="dbPassword"]`
,
"123456"
)
...
...
@@ -408,16 +413,20 @@ func InitZentaoData(version string, codeDir string) (err error) {
if
err
!=
nil
{
return
}
title
,
err
=
page
.
Title
()
fmt
.
Println
(
title
)
retryCount
:=
0
for
{
title
,
err
=
page
.
Title
()
fmt
.
Println
(
title
)
retryCount
++
if
retryCount
>
20
{
break
}
locator
,
_
:=
page
.
Locator
(
"text=数据库连接失败"
)
c
,
_
:=
locator
.
Count
()
if
c
>
0
{
...
...
@@ -425,6 +434,7 @@ func InitZentaoData(version string, codeDir string) (err error) {
}
else
{
break
}
page
.
WaitForTimeout
(
1000
)
err
=
page
.
Fill
(
`input[name="dbPassword"]`
,
"123456"
)
if
err
!=
nil
{
...
...
@@ -441,6 +451,7 @@ func InitZentaoData(version string, codeDir string) (err error) {
if
err
!=
nil
{
return
}
title
,
err
=
page
.
Title
()
fmt
.
Println
(
title
)
_
,
err
=
page
.
WaitForSelector
(
".modal-header>>:has-text('保存配置文件')"
,
playwright
.
PageWaitForSelectorOptions
{
State
:
playwright
.
WaitForSelectorStateDetached
})
...
...
@@ -458,6 +469,7 @@ func InitZentaoData(version string, codeDir string) (err error) {
if
strings
.
Contains
(
title
,
"使用模式"
)
{
page
.
Click
(
"text=使用全生命周期管理模式"
)
}
title
,
err
=
page
.
Title
()
fmt
.
Println
(
title
)
if
strings
.
Contains
(
title
,
"功能介绍"
)
{
...
...
@@ -471,11 +483,11 @@ func InitZentaoData(version string, codeDir string) (err error) {
if
err
!=
nil
{
return
}
err
=
page
.
Fill
(
`input[name="account"]`
,
"admin"
)
err
=
page
.
Fill
(
`input[name="account"]`
,
constTestHelper
.
ZentaoUsername
)
if
err
!=
nil
{
return
}
err
=
page
.
Fill
(
`input[name="password"]`
,
"Test123456."
)
err
=
page
.
Fill
(
`input[name="password"]`
,
constTestHelper
.
ZentaoPassword
)
if
err
!=
nil
{
return
}
...
...
@@ -491,15 +503,19 @@ func InitZentaoData(version string, codeDir string) (err error) {
if
err
!=
nil
{
return
}
err
=
Login
(
constTestHelper
.
ZentaoSiteUrl
)
if
err
!=
nil
{
return
}
err
=
createModule
()
if
err
!=
nil
{
return
}
err
=
createSuite
()
title
,
err
=
page
.
Title
()
fmt
.
Println
(
title
)
if
err
!=
nil
{
...
...
@@ -508,6 +524,7 @@ func InitZentaoData(version string, codeDir string) (err error) {
if
codeDir
==
""
{
return
}
err
=
InstallExt
(
version
,
codeDir
)
if
err
!=
nil
{
return
...
...
@@ -528,6 +545,7 @@ func init() {
if
page
!=
nil
{
return
}
var
err
error
pw
,
err
=
playwright
.
Run
(
&
playwright
.
RunOptions
{
SkipInstallBrowsers
:
true
,
...
...
@@ -536,6 +554,7 @@ func init() {
fmt
.
Println
(
err
)
return
}
headless
:=
conf
.
Headless
var
slowMo
float64
=
100
browser
,
err
:=
pw
.
Chromium
.
Launch
(
playwright
.
BrowserTypeLaunchOptions
{
Headless
:
&
headless
,
SlowMo
:
&
slowMo
})
...
...
@@ -543,10 +562,12 @@ func init() {
fmt
.
Println
(
err
)
return
}
page
,
err
=
browser
.
NewPage
(
playwright
.
BrowserNewContextOptions
{
Locale
:
&
conf
.
Locale
})
if
err
!=
nil
{
fmt
.
Println
(
err
)
return
}
Login
(
constTestHelper
.
ZentaoSiteUrl
)
}
test/helper/ztf/ztf.go
浏览文件 @
9b5eaf0d
...
...
@@ -90,8 +90,8 @@ func CreateSite(webpage plwHelper.Webpage) {
locator
:=
webpage
.
Locator
(
"#siteFormModal input"
)
locator
.
FillNth
(
0
,
"单元测试站点"
)
locator
.
FillNth
(
1
,
constTestHelper
.
ZentaoSiteUrl
)
locator
.
FillNth
(
2
,
"admin"
)
locator
.
FillNth
(
3
,
"Test123456."
)
locator
.
FillNth
(
2
,
constTestHelper
.
ZentaoUsername
)
locator
.
FillNth
(
3
,
constTestHelper
.
ZentaoPassword
)
webpage
.
Click
(
"text=确定"
)
webpage
.
WaitForSelector
(
".list-item-content span:has-text('单元测试站点')"
)
locator
=
webpage
.
Locator
(
".list-item-content span"
,
playwright
.
PageLocatorOptions
{
HasText
:
"单元测试站点"
})
...
...
test/restapi/main.go
浏览文件 @
9b5eaf0d
...
...
@@ -3,16 +3,18 @@ package main
import
(
"flag"
"fmt"
commDomain
"github.com/easysoft/zentaoatf/internal/pkg/domain"
zentaoHelper
"github.com/easysoft/zentaoatf/internal/pkg/helper/zentao"
serverDomain
"github.com/easysoft/zentaoatf/internal/server/modules/v1/domain"
fileUtils
"github.com/easysoft/zentaoatf/pkg/lib/file"
"os"
"path/filepath"
"runtime"
"strings"
"testing"
"time"
commDomain
"github.com/easysoft/zentaoatf/internal/pkg/domain"
zentaoHelper
"github.com/easysoft/zentaoatf/internal/pkg/helper/zentao"
serverDomain
"github.com/easysoft/zentaoatf/internal/server/modules/v1/domain"
fileUtils
"github.com/easysoft/zentaoatf/pkg/lib/file"
commConsts
"github.com/easysoft/zentaoatf/internal/pkg/consts"
execHelper
"github.com/easysoft/zentaoatf/internal/pkg/helper/exec"
serverConfig
"github.com/easysoft/zentaoatf/internal/server/config"
...
...
@@ -67,6 +69,8 @@ func initTest(version string) (err error) {
func
initZentao
(
runFrom
,
version
string
)
(
err
error
)
{
if
runFrom
==
"jenkins"
{
constTestHelper
.
ZentaoSiteUrl
=
constTestHelper
.
ZentaoSiteUrl
[
:
strings
.
LastIndex
(
constTestHelper
.
ZentaoSiteUrl
,
":"
)]
err
:=
commonTestHelper
.
InitZentaoData
()
if
err
!=
nil
{
fmt
.
Println
(
"Init zentao data fail "
,
err
)
...
...
@@ -102,7 +106,7 @@ func doTest(testToRun string) (err error) {
report
:=
execSuite
(
req
,
"api"
)
// submit result
config
:=
commDomain
.
WorkspaceConf
{
Url
:
constTestHelper
.
ZentaoSiteUrl
+
"/"
,
Password
:
"Test123456."
,
Username
:
"admin"
}
config
:=
commDomain
.
WorkspaceConf
{
Url
:
constTestHelper
.
ZentaoSiteUrl
+
"/"
,
Password
:
constTestHelper
.
ZentaoPassword
,
Username
:
constTestHelper
.
ZentaoUsername
}
err
=
zentaoHelper
.
CommitResult
(
report
,
1
,
0
,
config
,
nil
)
return
...
...
test/ui/helper/action.go
浏览文件 @
9b5eaf0d
...
...
@@ -67,6 +67,16 @@ func (p *Webpage) Close() {
return
}
func
(
p
*
Webpage
)
Goto
(
url
string
,
options
...
playwright
.
PageGotoOptions
)
(
ret
playwright
.
Response
,
err
error
)
{
t
:=
p
.
T
ret
,
err
=
p
.
Page
.
Goto
(
url
,
options
...
)
if
err
!=
nil
{
utils
.
PrintErrOrNot
(
err
,
t
)
}
return
}
func
(
p
*
Webpage
)
Locator
(
selector
string
,
options
...
playwright
.
PageLocatorOptions
)
(
ret
MyLocator
)
{
t
:=
p
.
T
locator
,
err
:=
p
.
Page
.
Locator
(
selector
,
options
...
)
...
...
@@ -137,6 +147,12 @@ func (p *Webpage) WaitForTimeout(timeout float64) {
return
}
func
(
p
*
Webpage
)
Title
()
string
{
title
,
_
:=
p
.
Page
.
Title
()
return
title
}
func
(
p
*
Webpage
)
Click
(
selector
string
)
{
t
:=
p
.
T
err
:=
p
.
Page
.
Click
(
selector
,
playwright
.
PageClickOptions
{
Timeout
:
&
conf
.
Timeout
})
...
...
test/ui/main.go
浏览文件 @
9b5eaf0d
...
...
@@ -3,6 +3,8 @@ package main
import
(
"flag"
"fmt"
"os"
"strings"
"testing"
commConsts
"github.com/easysoft/zentaoatf/internal/pkg/consts"
...
...
@@ -14,42 +16,62 @@ import (
uiTest
"github.com/easysoft/zentaoatf/test/helper/zentao/ui"
)
var
(
runFrom
,
version
,
testToRun
string
flagSet
*
flag
.
FlagSet
)
func
main
()
{
commConsts
.
ExecFrom
=
commConsts
.
FromCmd
serverConfig
.
InitLog
()
serverConfig
.
InitExecLog
(
constTestHelper
.
RootPath
)
commConsts
.
ZtfDir
=
constTestHelper
.
RootPath
i118Utils
.
Init
(
"zh-CN"
,
commConsts
.
AppServer
)
var
version
=
flag
.
String
(
"zentaoVersion"
,
""
,
"latest"
)
var
runFrom
=
flag
.
String
(
"runFrom"
,
""
,
"cmd"
)
testing
.
Init
()
flag
.
Parse
()
fmt
.
Println
(
*
version
)
defer
func
()
{
execHelper
.
KillProcessByUUID
(
"ui_auto_test"
)
uiTest
.
Close
()
}()
if
*
runFrom
==
"jenkins"
{
fmt
.
Println
(
"Init zentao data start "
)
flagSet
=
flag
.
NewFlagSet
(
"restapi"
,
flag
.
ContinueOnError
)
flagSet
.
StringVar
(
&
runFrom
,
"runFrom"
,
"cmd"
,
""
)
flagSet
.
StringVar
(
&
runFrom
,
"f"
,
"cmd"
,
""
)
flagSet
.
StringVar
(
&
version
,
"version"
,
"latest"
,
""
)
flagSet
.
StringVar
(
&
version
,
"v"
,
"latest"
,
""
)
flagSet
.
StringVar
(
&
testToRun
,
"testToRun"
,
""
,
""
)
flagSet
.
StringVar
(
&
testToRun
,
"t"
,
""
,
""
)
testing
.
Init
()
flagSet
.
Parse
(
os
.
Args
[
1
:
])
fmt
.
Println
(
version
)
commConsts
.
ExecFrom
=
commConsts
.
FromCmd
commConsts
.
ZtfDir
=
constTestHelper
.
RootPath
serverConfig
.
InitLog
()
serverConfig
.
InitExecLog
(
constTestHelper
.
RootPath
)
i118Utils
.
Init
(
"zh-CN"
,
commConsts
.
AppServer
)
if
runFrom
==
"jenkins"
{
constTestHelper
.
ZentaoSiteUrl
=
constTestHelper
.
ZentaoSiteUrl
[
:
strings
.
LastIndex
(
constTestHelper
.
ZentaoSiteUrl
,
":"
)]
err
:=
commonTestHelper
.
InitZentaoData
()
if
err
!=
nil
{
fmt
.
Println
(
"Init zentao data fail "
,
err
)
}
fmt
.
Println
(
"Init zentao data end "
)
}
else
{
err
:=
commonTestHelper
.
InitZentao
(
*
version
)
err
:=
commonTestHelper
.
InitZentao
(
version
)
if
err
!=
nil
{
fmt
.
Println
(
"Init zentao data fail "
,
err
)
}
err
=
commonTestHelper
.
BuildCli
()
if
err
!=
nil
{
fmt
.
Println
(
"Build cli fail "
,
err
)
}
err
=
commonTestHelper
.
RunServer
()
if
err
!=
nil
{
fmt
.
Println
(
"Build server fail "
)
}
err
=
commonTestHelper
.
RunUi
()
if
err
!=
nil
{
fmt
.
Println
(
"Build server fail "
)
...
...
test/ui/ui_site_test.go
浏览文件 @
9b5eaf0d
...
...
@@ -24,8 +24,8 @@ func CreateSite(t provider.T) {
locator
=
webpage
.
Locator
(
"#siteFormModal input"
)
locator
.
FillNth
(
0
,
"单元测试站点"
)
locator
.
FillNth
(
1
,
constTestHelper
.
ZentaoSiteUrl
)
locator
.
FillNth
(
2
,
"admin"
)
locator
.
FillNth
(
3
,
"Test123456."
)
locator
.
FillNth
(
2
,
constTestHelper
.
ZentaoUsername
)
locator
.
FillNth
(
3
,
constTestHelper
.
ZentaoPassword
)
webpage
.
Click
(
"text=确定"
)
webpage
.
WaitForSelector
(
".list-item-content span:has-text('单元测试站点')"
)
locator
=
webpage
.
Locator
(
".list-item-content span"
,
playwright
.
PageLocatorOptions
{
HasText
:
"单元测试站点"
})
...
...
@@ -54,8 +54,8 @@ func EditSite(t provider.T) {
locator
=
webpage
.
Locator
(
"#siteFormModal input"
)
locator
.
FillNth
(
0
,
"单元测试站点-update"
)
locator
.
FillNth
(
1
,
constTestHelper
.
ZentaoSiteUrl
)
locator
.
FillNth
(
2
,
"admin"
)
locator
.
FillNth
(
3
,
"Test123456."
)
locator
.
FillNth
(
2
,
constTestHelper
.
ZentaoUsername
)
locator
.
FillNth
(
3
,
constTestHelper
.
ZentaoPassword
)
webpage
.
Click
(
"#siteFormModal>>.modal-action>>span:has-text(
\"
确定
\"
)"
)
webpage
.
WaitForSelector
(
".list-item-content span:has-text('单元测试站点-update')"
)
locator
=
webpage
.
Locator
(
".list-item-content span"
,
playwright
.
PageLocatorOptions
{
HasText
:
"单元测试站点-update"
})
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录