Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
kt-keystone
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Matrix
kt-keystone
Commits
f545760e
提交
f545760e
authored
1月 06, 2022
作者:
mry
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
swagger接口数据获取,testNg以及报告生成
上级
646eb910
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
503 行增加
和
0 行删除
+503
-0
pom.xml
kt-base/pom.xml
+102
-0
SwaggerController.java
...c/main/java/org/matrix/swaggerData/SwaggerController.java
+100
-0
DataProvider_forDB.java
...e/src/main/java/org/matrix/testNg/DataProvider_forDB.java
+68
-0
TestConfig.java
kt-base/src/main/java/org/matrix/testNg/TestConfig.java
+9
-0
TestPigeon.java
kt-base/src/main/java/org/matrix/testNg/TestPigeon.java
+39
-0
ExtentTestNGIReporterListener.java
...x/testNg/extentsreport/ExtentTestNGIReporterListener.java
+185
-0
没有找到文件。
kt-base/pom.xml
浏览文件 @
f545760e
...
...
@@ -16,6 +16,107 @@
<groupId>
org.matrix
</groupId>
<artifactId>
kt-kit
</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
<version>
1.18.22
</version>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-data-jpa
</artifactId>
</dependency>
<dependency>
<groupId>
mysql
</groupId>
<artifactId>
mysql-connector-java
</artifactId>
<version>
5.1.47
</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>
io.springfox
</groupId>
<artifactId>
springfox-swagger2
</artifactId>
<version>
2.9.2
</version>
</dependency>
<!--swagger ui-->
<dependency>
<groupId>
io.springfox
</groupId>
<artifactId>
springfox-swagger-ui
</artifactId>
<version>
2.9.2
</version>
</dependency>
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.47
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
<version>
1.18.22
</version>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
com.relevantcodes
</groupId>
<artifactId>
extentreports
</artifactId>
<version>
2.41.1
</version>
</dependency>
<dependency>
<groupId>
com.vimalselvam
</groupId>
<artifactId>
testng-extentsreport
</artifactId>
<version>
1.3.1
</version>
</dependency>
<dependency>
<groupId>
com.aventstack
</groupId>
<artifactId>
extentreports
</artifactId>
<version>
3.0.6
</version>
</dependency>
<dependency>
<groupId>
org.testng
</groupId>
<artifactId>
testng
</artifactId>
<version>
6.10
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.uncommons/reportng -->
<dependency>
<groupId>
org.uncommons
</groupId>
<artifactId>
reportng
</artifactId>
<version>
1.1.4
</version>
</dependency>
<dependency>
<groupId>
com.google.inject
</groupId>
<artifactId>
guice
</artifactId>
<version>
3.0
</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
kt-base/src/main/java/org/matrix/swaggerData/SwaggerController.java
0 → 100644
浏览文件 @
f545760e
package
org
.
matrix
.
swaggerData
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.web.bind.annotation.CrossOrigin
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.io.BufferedReader
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStreamReader
;
import
java.net.MalformedURLException
;
import
java.net.URL
;
import
java.net.URLConnection
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
@RestController
@RequestMapping
(
"/swaggers"
)
@CrossOrigin
public
class
SwaggerController
{
public
String
loadJson
(
String
url
)
{
BufferedReader
reader
=
null
;
StringBuilder
json
=
new
StringBuilder
();
try
{
URL
urlObject
=
new
URL
(
url
);
URLConnection
uc
=
urlObject
.
openConnection
();
InputStream
inputStream
=
uc
.
getInputStream
();
reader
=
new
BufferedReader
(
new
InputStreamReader
(
inputStream
,
"utf-8"
));
String
inputLine
=
null
;
while
((
inputLine
=
reader
.
readLine
())
!=
null
)
{
json
.
append
(
inputLine
);
}
reader
.
close
();
}
catch
(
MalformedURLException
e
)
{
e
.
printStackTrace
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
json
.
toString
();
}
@GetMapping
public
Object
parameter
(
String
url
)
{
List
<
String
>
list
=
new
ArrayList
();
String
json
=
loadJson
(
url
);
//获得json字符串
JSONObject
swaggerJson
=
JSONObject
.
parseObject
(
json
);
Object
host
=
swaggerJson
.
get
(
"host"
);
//localhost:8765
Object
basePath
=
swaggerJson
.
get
(
"basePath"
);
//"/"
Object
paths
=
swaggerJson
.
get
(
"paths"
);
//将paths转成map集合
Map
<
String
,
String
>
pathsMaps
=
(
Map
<
String
,
String
>)
paths
;
//获取key
Set
<
String
>
methodUrls
=
pathsMaps
.
keySet
();
//循环获取每个methodUrl
for
(
String
methodUrl
:
methodUrls
)
{
//将paths转成JSON
JSONObject
objPaths
=
(
JSONObject
)
paths
;
//通过JSON获取到methodUrl,用来获取methodUrl内部的信息
Object
objMethodUrls
=
objPaths
.
get
(
methodUrl
);
JSONObject
objUrlsJson
=
(
JSONObject
)
objMethodUrls
;
Map
<
String
,
String
>
objMethodUrlsMaps
=
(
Map
<
String
,
String
>)
objMethodUrls
;
Set
<
String
>
requests
=
objMethodUrlsMaps
.
keySet
();
for
(
String
request
:
requests
)
{
Object
objRequest
=
objUrlsJson
.
get
(
request
);
//拿到请求内部的信息
Map
<
String
,
String
>
objRequestMaps
=
(
Map
<
String
,
String
>)
objRequest
;
Object
parameters
=
objRequestMaps
.
get
(
"parameters"
);
List
<
String
>
parameterAllList
=
new
ArrayList
<>();
if
(
parameters
!=
null
)
{
List
<
String
>
parameterLists
=
(
List
<
String
>)
parameters
;
for
(
Object
parameterList
:
parameterLists
)
{
Map
<
String
,
String
>
parameterMaps
=
(
Map
<
String
,
String
>)
parameterList
;
String
name
=
parameterMaps
.
get
(
"name"
);
String
type
=
parameterMaps
.
get
(
"type"
);
String
in
=
parameterMaps
.
get
(
"in"
);
if
(
name
==
null
)
{
name
=
""
;
}
if
(
type
==
null
)
{
type
=
""
;
}
if
(
in
==
null
)
{
in
=
""
;
}
parameterAllList
.
add
(
"name="
+
name
+
" type="
+
type
+
" in="
+
in
);
}
}
list
.
add
(
"{host="
+
host
+
", basePath="
+
basePath
+
", request="
+
request
+
", methodUrl="
+
methodUrl
+
", parameters="
+
parameterAllList
+
"}"
);
}
}
Object
swagger
=
JSON
.
toJSON
(
list
);
return
swagger
;
}
}
kt-base/src/main/java/org/matrix/testNg/DataProvider_forDB.java
0 → 100644
浏览文件 @
f545760e
package
org
.
matrix
.
testNg
;
import
java.sql.*
;
import
java.util.*
;
public
class
DataProvider_forDB
{
static
Connection
connection
;
static
ResultSet
resultSet
;
static
Statement
statement
;
public
static
Object
[][]
getDb
(
String
ip
,
String
port
,
String
baseName
,
String
userName
,
String
password
,
String
sql
)
{
List
<
Object
[]>
list
=
new
ArrayList
<
Object
[]>();
String
url
=
String
.
format
(
"jdbc:mysql://%s:%s/%s"
,
ip
,
port
,
baseName
);
try
{
Class
.
forName
(
"com.mysql.jdbc.Driver"
);
connection
=
DriverManager
.
getConnection
(
url
,
userName
,
password
);
statement
=
connection
.
createStatement
();
resultSet
=
statement
.
executeQuery
(
sql
);
//声明存放泛型string数组的list对象
int
colNum
=
resultSet
.
getMetaData
().
getColumnCount
();
while
(
resultSet
.
next
())
{
String
[]
strings
=
new
String
[
colNum
];
for
(
int
i
=
0
;
i
<
strings
.
length
;
i
++)
{
strings
[
i
]
=
resultSet
.
getString
(
i
+
1
);
}
list
.
add
(
strings
);
}
}
catch
(
ClassNotFoundException
|
SQLException
e
)
{
e
.
printStackTrace
();
}
finally
{
remove
();
}
//将list对象转换成二维数组
Object
[][]
results
=
new
Object
[
list
.
size
()][];
for
(
int
i
=
0
;
i
<
list
.
size
();
i
++)
{
results
[
i
]
=
list
.
get
(
i
);
}
return
results
;
}
public
static
void
remove
()
{
try
{
if
(
resultSet
!=
null
)
{
resultSet
.
close
();
}
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
try
{
if
(
statement
!=
null
)
{
statement
.
close
();
}
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
try
{
if
(
connection
!=
null
)
{
connection
.
close
();
}
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
}
\ No newline at end of file
kt-base/src/main/java/org/matrix/testNg/TestConfig.java
0 → 100644
浏览文件 @
f545760e
package
org
.
matrix
.
testNg
;
public
class
TestConfig
{
public
static
final
String
DB_IP
=
"localhost"
;
public
static
final
String
DB_PORT
=
"3306"
;
public
static
final
String
DB_BASE_NAME
=
"user"
;
public
static
final
String
DB_USERNAME
=
"root"
;
public
static
final
String
DB_PASSWORD
=
"root"
;
}
kt-base/src/main/java/org/matrix/testNg/TestPigeon.java
0 → 100644
浏览文件 @
f545760e
package
org
.
matrix
.
testNg
;
import
org.testng.ITestResult
;
import
org.testng.annotations.*
;
public
class
TestPigeon
{
String
sql
;
String
env
;
@Parameters
({
"sql"
,
"env"
})
@BeforeClass
public
void
beforeClass
(
String
sql
,
String
env
)
{
this
.
sql
=
sql
;
this
.
env
=
env
;
}
/**
* XML中的SQL决定了执行什么用例, 执行多少条用例, SQL的搜索结果为需要测试的测试用例
* @DataProvider 返回值二维数组
*/
@DataProvider
(
name
=
"testData"
)
private
Object
[][]
getData
()
{
return
DataProvider_forDB
.
getDb
(
TestConfig
.
DB_IP
,
TestConfig
.
DB_PORT
,
TestConfig
.
DB_BASE_NAME
,
TestConfig
.
DB_USERNAME
,
TestConfig
.
DB_PASSWORD
,
sql
);
}
@Test
(
dataProvider
=
"testData"
)
public
void
test
(
String
s1
,
String
s2
,
String
s3
)
{
// System.out.println(env);
// System.out.println(s1 + ":" + s2 + ":" + s3);
}
@AfterMethod
public
void
afterMethod
(
ITestResult
result
,
Object
[]
objs
)
{
System
.
out
.
println
(
"正在运行的方法:"
+
result
.
getName
());
}
}
kt-base/src/main/java/org/matrix/testNg/extentsreport/ExtentTestNGIReporterListener.java
0 → 100644
浏览文件 @
f545760e
package
org
.
matrix
.
testNg
.
extentsreport
;
import
com.aventstack.extentreports.ExtentReports
;
import
com.aventstack.extentreports.ExtentTest
;
import
com.aventstack.extentreports.ResourceCDN
;
import
com.aventstack.extentreports.Status
;
import
com.aventstack.extentreports.model.TestAttribute
;
import
com.aventstack.extentreports.reporter.ExtentHtmlReporter
;
import
com.aventstack.extentreports.reporter.configuration.ChartLocation
;
import
com.aventstack.extentreports.reporter.configuration.Theme
;
import
org.testng.*
;
import
org.testng.xml.XmlSuite
;
import
java.io.File
;
import
java.util.*
;
public
class
ExtentTestNGIReporterListener
implements
IReporter
{
//生成的路径以及文件名
private
static
final
String
OUTPUT_FOLDER
=
"/reportNg/reports/"
;
private
static
final
String
FILE_NAME
=
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
)
+
".html"
;
private
ExtentReports
extent
;
@Override
public
void
generateReport
(
List
<
XmlSuite
>
xmlSuites
,
List
<
ISuite
>
suites
,
String
outputDirectory
)
{
init
();
boolean
createSuiteNode
=
false
;
if
(
suites
.
size
()
>
1
)
{
createSuiteNode
=
true
;
}
for
(
ISuite
suite
:
suites
)
{
Map
<
String
,
ISuiteResult
>
result
=
suite
.
getResults
();
//如果suite里面没有任何用例,直接跳过,不在报告里生成
if
(
result
.
size
()
==
0
)
{
continue
;
}
//统计suite下的成功、失败、跳过的总用例数
int
suiteFailSize
=
0
;
int
suitePassSize
=
0
;
int
suiteSkipSize
=
0
;
ExtentTest
suiteTest
=
null
;
//存在多个suite的情况下,在报告中将同一个一个suite的测试结果归为一类,创建一级节点。
if
(
createSuiteNode
)
{
suiteTest
=
extent
.
createTest
(
suite
.
getName
()).
assignCategory
(
suite
.
getName
());
}
boolean
createSuiteResultNode
=
false
;
if
(
result
.
size
()
>
1
)
{
createSuiteResultNode
=
true
;
}
for
(
ISuiteResult
r
:
result
.
values
())
{
ExtentTest
resultNode
;
ITestContext
context
=
r
.
getTestContext
();
if
(
createSuiteResultNode
)
{
//没有创建suite的情况下,将在SuiteResult的创建为一级节点,否则创建为suite的一个子节点。
if
(
null
==
suiteTest
)
{
resultNode
=
extent
.
createTest
(
r
.
getTestContext
().
getName
());
}
else
{
resultNode
=
suiteTest
.
createNode
(
r
.
getTestContext
().
getName
());
}
}
else
{
resultNode
=
suiteTest
;
}
if
(
resultNode
!=
null
)
{
resultNode
.
getModel
().
setName
(
suite
.
getName
()
+
" : "
+
r
.
getTestContext
().
getName
());
if
(
resultNode
.
getModel
().
hasCategory
())
{
resultNode
.
assignCategory
(
r
.
getTestContext
().
getName
());
}
else
{
resultNode
.
assignCategory
(
suite
.
getName
(),
r
.
getTestContext
().
getName
());
}
resultNode
.
getModel
().
setStartTime
(
r
.
getTestContext
().
getStartDate
());
resultNode
.
getModel
().
setEndTime
(
r
.
getTestContext
().
getEndDate
());
//统计SuiteResult下的数据
int
passSize
=
r
.
getTestContext
().
getPassedTests
().
size
();
int
failSize
=
r
.
getTestContext
().
getFailedTests
().
size
();
int
skipSize
=
r
.
getTestContext
().
getSkippedTests
().
size
();
suitePassSize
+=
passSize
;
suiteFailSize
+=
failSize
;
suiteSkipSize
+=
skipSize
;
if
(
failSize
>
0
)
{
resultNode
.
getModel
().
setStatus
(
Status
.
FAIL
);
}
resultNode
.
getModel
().
setDescription
(
String
.
format
(
"Pass: %s ; Fail: %s ; Skip: %s ;"
,
passSize
,
failSize
,
skipSize
));
}
buildTestNodes
(
resultNode
,
context
.
getFailedTests
(),
Status
.
FAIL
);
buildTestNodes
(
resultNode
,
context
.
getSkippedTests
(),
Status
.
SKIP
);
buildTestNodes
(
resultNode
,
context
.
getPassedTests
(),
Status
.
PASS
);
}
if
(
suiteTest
!=
null
)
{
suiteTest
.
getModel
().
setDescription
(
String
.
format
(
"Pass: %s ; Fail: %s ; Skip: %s ;"
,
suitePassSize
,
suiteFailSize
,
suiteSkipSize
));
if
(
suiteFailSize
>
0
)
{
suiteTest
.
getModel
().
setStatus
(
Status
.
FAIL
);
}
}
}
extent
.
flush
();
}
private
void
init
()
{
//文件夹不存在的话进行创建
File
reportDir
=
new
File
(
OUTPUT_FOLDER
);
if
(!
reportDir
.
exists
()
&&
!
reportDir
.
isDirectory
())
{
reportDir
.
mkdir
();
}
ExtentHtmlReporter
htmlReporter
=
new
ExtentHtmlReporter
(
OUTPUT_FOLDER
+
FILE_NAME
);
// 设置静态文件的DNS
//怎么样解决cdn.rawgit.com访问不了的情况
htmlReporter
.
config
().
setResourceCDN
(
ResourceCDN
.
EXTENTREPORTS
);
htmlReporter
.
config
().
setDocumentTitle
(
"test report"
);
htmlReporter
.
config
().
setReportName
(
"test report"
);
htmlReporter
.
config
().
setChartVisibilityOnOpen
(
true
);
htmlReporter
.
config
().
setTestViewChartLocation
(
ChartLocation
.
TOP
);
htmlReporter
.
config
().
setTheme
(
Theme
.
STANDARD
);
htmlReporter
.
config
().
setCSS
(
".node.level-1 ul{ display:none;} .node.level-1.active ul{display:block;}"
);
extent
=
new
ExtentReports
();
extent
.
attachReporter
(
htmlReporter
);
extent
.
setReportUsesManualConfiguration
(
true
);
}
private
void
buildTestNodes
(
ExtentTest
extenttest
,
IResultMap
tests
,
Status
status
)
{
//存在父节点时,获取父节点的标签
String
[]
categories
=
new
String
[
0
];
if
(
extenttest
!=
null
)
{
List
<
TestAttribute
>
categoryList
=
extenttest
.
getModel
().
getCategoryContext
().
getAll
();
categories
=
new
String
[
categoryList
.
size
()];
for
(
int
index
=
0
;
index
<
categoryList
.
size
();
index
++)
{
categories
[
index
]
=
categoryList
.
get
(
index
).
getName
();
}
}
ExtentTest
test
;
if
(
tests
.
size
()
>
0
)
{
//调整用例排序,按时间排序
Set
<
ITestResult
>
treeSet
=
new
TreeSet
<
ITestResult
>(
new
Comparator
<
ITestResult
>()
{
@Override
public
int
compare
(
ITestResult
o1
,
ITestResult
o2
)
{
return
o1
.
getStartMillis
()
<
o2
.
getStartMillis
()
?
-
1
:
1
;
}
});
treeSet
.
addAll
(
tests
.
getAllResults
());
for
(
ITestResult
result
:
treeSet
)
{
Object
[]
parameters
=
result
.
getParameters
();
String
name
=
""
;
//如果有参数,则使用参数的toString组合代替报告中的name
for
(
Object
param
:
parameters
)
{
name
+=
param
.
toString
();
}
if
(
name
.
length
()
>
0
)
{
if
(
name
.
length
()
>
50
)
{
name
=
name
.
substring
(
0
,
49
)
+
"..."
;
}
}
else
{
name
=
result
.
getMethod
().
getDescription
();
}
if
(
extenttest
==
null
)
{
test
=
extent
.
createTest
(
name
);
}
else
{
//作为子节点进行创建时,设置同父节点的标签一致,便于报告检索。
test
=
extenttest
.
createNode
(
name
).
assignCategory
(
categories
);
}
for
(
String
group
:
result
.
getMethod
().
getGroups
())
test
.
assignCategory
(
group
);
List
<
String
>
outputList
=
Reporter
.
getOutput
(
result
);
for
(
String
output
:
outputList
)
{
//将用例的log输出报告中
test
.
debug
(
output
);
}
if
(
result
.
getThrowable
()
!=
null
)
{
test
.
log
(
status
,
result
.
getThrowable
());
}
else
{
test
.
log
(
status
,
"Test "
+
status
.
toString
().
toLowerCase
()
+
"ed"
);
}
test
.
getModel
().
setStartTime
(
getTime
(
result
.
getStartMillis
()));
test
.
getModel
().
setEndTime
(
getTime
(
result
.
getEndMillis
()));
}
}
}
private
Date
getTime
(
long
millis
)
{
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTimeInMillis
(
millis
);
return
calendar
.
getTime
();
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论