testing.go 13.3 KB
Newer Older
aaronchen2k2k's avatar
aaronchen2k2k 已提交
1
package commDomain
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
2 3

import (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
	"encoding/xml"
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
5
	"fmt"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
6 7
	commConsts "github.com/easysoft/zentaoatf/internal/pkg/consts"
	"github.com/easysoft/zentaoatf/pkg/consts"
8
	"time"
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
9 10
)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
11 12 13 14
type ZtfRespTestCases struct {
	Cases []ZtfCaseInModule `json:"testcases"`
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
15
type ZtfProduct struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
16 17 18
	Id int
	//Code string
	//Name string
aaronchen2k2k's avatar
aaronchen2k2k 已提交
19

aaronchen2k2k's avatar
aaronchen2k2k 已提交
20
	Cases map[int]ZtfCaseInModule `json:"testcases"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
21 22 23
}

type ZtfModule struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
24 25 26
	Id    int
	Code  string
	Title string
aaronchen2k2k's avatar
aaronchen2k2k 已提交
27 28 29 30

	Cases map[int]ZtfCaseInModule
}
type ZtfCaseInModule struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
31
	Id      int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
32
	Title   string
aaronchen2k2k's avatar
aaronchen2k2k 已提交
33 34
	Product int
	Module  int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
35
	Case    int // case id in task
aaronchen2k2k's avatar
aaronchen2k2k 已提交
36 37 38
}

type ZtfSuite struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
39
	Id      int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
40 41
	Code    string
	Name    string
aaronchen2k2k's avatar
aaronchen2k2k 已提交
42
	Product int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
43 44 45 46 47

	Cases map[int]ZtfCaseInSuite
}

type ZtfCaseInSuite struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48
	Id      int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
49
	Title   string
aaronchen2k2k's avatar
aaronchen2k2k 已提交
50 51 52
	Product int
	Suite   int
	Module  int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
53 54 55
}

type ZtfTask struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
56 57 58 59 60
	Id        int
	Code      string
	Name      string
	Product   int
	Workspace int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
61 62 63 64 65

	Runs map[int]ZtfCaseInTask
}

type ZtfCaseInTask struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
66
	Id      int // runId in task
aaronchen2k2k's avatar
aaronchen2k2k 已提交
67
	Title   string
aaronchen2k2k's avatar
aaronchen2k2k 已提交
68 69 70
	Case    int // real caseId
	Product int
	Module  int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
71 72 73
}

type ZtfCaseNoStepArr struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
74 75 76
	Id      int
	Product int
	Module  int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
77 78 79 80 81

	Title string
	Steps map[int]ZtfStep
}
type ZtfCase struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
82 83 84
	Id      int
	Product int
	Module  int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
85

aaronchen2k2k's avatar
aaronchen2k2k 已提交
86 87
	Title string
	Steps []ZtfStep `json:"steps"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
88

aaronchen2k2k's avatar
aaronchen2k2k 已提交
89
	ScriptPath string `json:"scriptPath"` // used for update exist script
aaronchen2k2k's avatar
aaronchen2k2k 已提交
90 91 92 93 94 95 96
}
type ZtfCaseWrapper struct {
	From string
	Case ZtfCase
}

type ZtfStep struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
97
	Id   int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
98 99 100 101
	Desc string

	Expect string
	Type   string
aaronchen2k2k's avatar
aaronchen2k2k 已提交
102
	Parent int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
103 104 105 106 107 108 109 110

	Children []ZtfStep
	Numb     string

	MultiLine bool
}

type ZtfBug struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
111 112 113 114
	Title string `json:"title"`
	Type  string `json:"type"`

	StepIds string `json:"ids"` // for to
aaronchen2k2k's avatar
aaronchen2k2k 已提交
115

aaronchen2k2k's avatar
aaronchen2k2k 已提交
116 117 118 119
	Product  int `json:"product"`
	Module   int `json:"module"`
	Severity int `json:"severity"`
	Pri      int `json:"pri"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
120

aaronchen2k2k's avatar
aaronchen2k2k 已提交
121
	Case  int    `json:"case"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
122
	Steps string `json:"steps"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
123

aaronchen2k2k's avatar
aaronchen2k2k 已提交
124 125 126 127
	Uid         string   `json:"uid"`
	OpenedBuild []string `json:"openedBuild"`
	CaseVersion string   `json:"caseVersion"`
	OldTaskID   string   `json:"oldTaskID"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
128
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
129

aaronchen2k2k's avatar
aaronchen2k2k 已提交
130 131 132 133
type ZentaoBug struct {
	Title string `json:"title"`
	Type  string `json:"type"`

aaronchen2k2k's avatar
aaronchen2k2k 已提交
134 135 136 137
	Product  int `json:"product"`
	Module   int `json:"module"`
	Severity int `json:"severity"`
	Pri      int `json:"pri"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
138

aaronchen2k2k's avatar
aaronchen2k2k 已提交
139
	Case  int    `json:"case"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
140 141
	Steps string `json:"steps"`

aaronchen2k2k's avatar
aaronchen2k2k 已提交
142 143 144 145
	Uid         string   `json:"uid"`
	OpenedBuild []string `json:"openedBuild"`
	CaseVersion string   `json:"caseVersion"`
	OldTaskID   string   `json:"oldTaskID"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
146 147 148
}

type ZtfReport struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
149 150
	Name string `json:"name"`

aaronchen2k2k's avatar
aaronchen2k2k 已提交
151 152 153 154 155 156 157 158 159 160 161
	TestEnv     commConsts.OsType    `json:"testEnv,omitempty"`
	TestType    commConsts.TestType  `json:"testType"`
	TestTool    commConsts.TestTool  `json:"testTool"`
	BuildTool   commConsts.BuildTool `json:"buildTool"`
	TestCommand string               `json:"testCommand"`

	WorkspaceId   int                 `json:"workspaceId,omitempty"`
	WorkspaceType commConsts.TestTool `json:"workspaceType"`
	WorkspacePath string              `json:"workspacePath"`
	Seq           string              `json:"seq,omitempty"`
	SubmitResult  bool                `json:"submitResult"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
162

163
	ProductId int               `json:"productId,omitempty"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
164
	TaskId    int               `json:"taskId,omitempty"`
165 166
	ExecBy    commConsts.ExecBy `json:"execBy,omitempty"`
	ExecById  int               `json:"execById,omitempty"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
167

aaronchen2k2k's avatar
aaronchen2k2k 已提交
168 169 170 171
	// run with ci tool
	ZentaoData string `json:"zentaoData"`
	BuildUrl   string `json:"buildUrl"`

aaronchen2k2k's avatar
aaronchen2k2k 已提交
172 173 174 175 176 177 178 179
	Pass      int   `json:"pass"`
	Fail      int   `json:"fail"`
	Skip      int   `json:"skip"`
	Total     int   `json:"total"`
	StartTime int64 `json:"startTime"`
	EndTime   int64 `json:"endTime"`
	Duration  int64 `json:"duration"`

aaronchen2k2k's avatar
aaronchen2k2k 已提交
180 181
	FuncResult []FuncResult `json:"funcResult,omitempty"`
	UnitResult []UnitResult `json:"unitResult,omitempty"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
182 183 184
}

type FuncResult struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
185 186 187 188
	Id          int    `json:"id"`
	WorkspaceId int    `json:"workspaceId"`
	Seq         string `json:"seq"`

189 190 191 192 193 194
	Key          string                  `json:"key"`
	ProductId    int                     `json:"productId"`
	Path         string                  `json:"path"`
	RelativePath string                  `json:"relativePath"`
	Status       commConsts.ResultStatus `json:"status"`
	Title        string                  `json:"title"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
195 196 197 198

	Steps []StepLog `json:"steps"`
}
type StepLog struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
199 200 201
	Id     string                  `json:"id"`
	Name   string                  `json:"name"`
	Status commConsts.ResultStatus `json:"status"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
202 203 204 205

	CheckPoints []CheckPointLog `json:"checkPoints"`
}
type CheckPointLog struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
206 207 208 209
	Numb   int                     `json:"numb"`
	Expect string                  `json:"expect"`
	Actual string                  `json:"actual"`
	Status commConsts.ResultStatus `json:"status"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
210 211 212 213 214 215 216 217 218 219 220
}

// 单元测试
type UnitTestSuite struct {
	XMLName xml.Name `xml:"testsuite"`

	Name     string
	Duration int64   `xml:"-"`
	Time     float32 `xml:"time,attr"`

	Properties Properties   `xml:"properties"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
221
	Cases      []UnitResult `xml:"testcase"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
222 223 224 225 226 227 228 229 230 231 232
}
type UnitResult struct {
	Title     string `json:"title" xml:"name,attr"`
	TestSuite string `json:"testSuite" xml:"classname,attr"`

	StartTime int64 `json:"startTime" xml:"startTime"`
	EndTime   int64 `json:"endTime" xml:"endTime"`

	Duration float32  `json:"duration" xml:"time,attr"`
	Failure  *Failure `json:"failure" xml:"failure,omitempty"`

233 234 235
	ErrorType    string `json:"errorType" xml:"type,attr,omitempty"`
	ErrorContent string `json:"errorContent" xml:"error,omitempty"`

aaronchen2k2k's avatar
aaronchen2k2k 已提交
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
	Id     int    `json:"id"`
	Status string `json:"status"`
}

type Failure struct {
	Type string `json:"type" xml:"type,attr"`
	Desc string `json:"desc" xml:",innerxml"`
}

type Properties struct {
	Property []Property `json:"property" xml:"property"`
}
type Property struct {
	Name  string `json:"name" xml:"name,attr"`
	Value string `json:"value" xml:"value,attr"`
}

// phpunit xml
type PhpUnitSuites struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
255 256
	XMLName xml.Name `xml:"tests"`
	Cases   []struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
		Title     string `xml:"prettifiedMethodName,attr"`
		TestSuite string `xml:"prettifiedClassName,attr"`
		Fail      string `xml:"exceptionMessage,attr"`

		Groups string  `xml:"groups,attr"`
		Status int     `xml:"status,attr"`
		Time   float32 `xml:"time,attr"`
	} `xml:"test"`

	Duration int
}

// pytest xml
type PyTestSuites struct {
	XMLName    xml.Name `xml:"testsuites"`
	TestSuites []struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
273 274
		Title string `xml:"name,attr"`
		Cases []struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
			Title     string  `xml:"name,attr"`
			TestSuite string  `xml:"classname,attr"`
			Duration  float32 `xml:"time,attr"`
			Failure   *struct {
				Type string `xml:"message,attr"`
				Desc string `xml:",innerxml"`
			} `xml:"failure,omitempty"`
			Error *struct {
				Text    string `xml:",chardata"`
				Message string `xml:"message,attr"`
			} `xml:"error"`

			Status string
		} `xml:"testcase"`

		Duration int
		Time     float32 `xml:"time,attr"`
	} `xml:"testsuite"`

	Duration int
}

// jest xml
type JestSuites struct {
	XMLName    xml.Name `xml:"testsuites"`
	Title      string   `xml:"name,attr"`
	TestSuites []struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
302 303
		Title string       `xml:"name,attr"`
		Cases []UnitResult `xml:"testcase"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
304 305 306 307 308 309 310 311 312 313 314 315

		Duration int
	} `xml:"testsuite"`

	Duration int
	Time     float32 `xml:"time,attr"`
}

// gtest xml
type GTestSuites struct {
	XMLName    xml.Name `xml:"testsuites"`
	TestSuites []struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
316 317
		Title string `xml:"name,attr"`
		Cases []struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
			Title     string  `xml:"name,attr"`
			TestSuite string  `xml:"classname,attr"`
			Duration  float32 `xml:"time,attr"`
			Failure   *struct {
				Type string `xml:"message,attr"`
				Desc string `xml:",innerxml"`
			} `xml:"failure,omitempty"`

			Status string `xml:"status,attr"`
		} `xml:"testcase"`

		Duration int
	} `xml:"testsuite"`

	Duration int
	Time     float32 `xml:"time,attr"`
}

// qtest xml
type QTestSuites struct {
	XMLName xml.Name `xml:"testsuite"`
	Name    string   `json:"name" xml:"name,attr"`

aaronchen2k2k's avatar
aaronchen2k2k 已提交
341
	Cases []struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
		Title  string `json:"name" xml:"name,attr"`
		Result string `json:"result" xml:"result,attr"`

		Failure *struct {
			Type string `json:"type" xml:"tag,attr"`
			Desc string `json:"desc" xml:"message,attr"`
		} `json:"failure" xml:"failure"`
	} `json:"testCases" xml:"testcase"`

	Properties Properties `json:"properties" xml:"properties"`
	Duration   int
}

// cppunit xml
type CppUnitSuites struct {
	XMLName xml.Name `xml:"TestRun"`

	SuccessfulTests struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
360
		Cases []CppUnitTest `json:"test" xml:"Tests"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
361 362 363
	} `json:"successfulTests" xml:"SuccessfulTests"`

	FailedTests struct {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
364
		Cases []CppUnitTest `json:"test" xml:"FailedTest"`
aaronchen2k2k's avatar
aaronchen2k2k 已提交
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
	} `json:"failedTests" xml:"FailedTests"`

	Duration int
}
type CppUnitTest struct {
	Id          int    `json:"id" xml:"Id,attr"`
	Title       string `json:"name" xml:"Name"`
	FailureType string `json:"failureType" xml:"FailureType"`
	Message     string `json:"message" xml:"Message"`
	Location    []struct {
		File string `json:"file" xml:"File"`
		Line string `json:"line" xml:"Line"`
	} `json:"location" xml:"Location"`

	Duration int
}

// RobotFramework xml
var RFResults = "results"

type RobotResult struct {
	XMLName    xml.Name        `xml:"robot"`
	Text       string          `xml:",chardata"`
	Generator  string          `xml:"generator,attr"`
	Generated  string          `xml:"generated,attr"`
	Rpa        string          `xml:"rpa,attr"`
	Suites     []RobotSuite    `xml:"suite"`
	Statistics RobotStatistics `xml:"statistics"`
	Errors     string          `xml:"errors"`
}

type RobotStatistics struct {
	Text  string `xml:",chardata"`
	Total struct {
		Text string `xml:",chardata"`
		Stat []struct {
			Text string `xml:",chardata"`
			Pass string `xml:"pass,attr"`
			Fail string `xml:"fail,attr"`
		} `xml:"stat"`
	} `xml:"total"`
	Tag   string `xml:"tag"`
	Suite struct {
		Text   string `xml:",chardata"`
		States []struct {
			Text string `xml:",chardata"`
			Pass string `xml:"pass,attr"`
			Fail string `xml:"fail,attr"`
			ID   string `xml:"id,attr"`
			Name string `xml:"name,attr"`
		} `xml:"stat"`
	} `xml:"suite"`
}

type RobotSuite struct {
	Text   string       `xml:",chardata"`
	ID     string       `xml:"id,attr"`
	Name   string       `xml:"name,attr"`
	Source string       `xml:"source,attr"`
	Suites []RobotSuite `xml:"suite"`
	Tests  []RobotTest  `xml:"test"`
	Status RobotStatus  `xml:"status"`
}

type RobotTest struct {
	Text string `xml:",chardata"`
	ID   string `xml:"id,attr"`
	Name string `xml:"name,attr"`
	Kw   []struct {
		Text      string `xml:",chardata"`
		Name      string `xml:"name,attr"`
		Library   string `xml:"library,attr"`
		Doc       string `xml:"doc"`
		Arguments struct {
			Text string   `xml:",chardata"`
			Arg  []string `xml:"arg"`
		} `xml:"arguments"`
		Msg struct {
			Text      string `xml:",chardata"`
			Timestamp string `xml:"timestamp,attr"`
			Level     string `xml:"level,attr"`
		} `xml:"msg"`
		Status RobotStatus `xml:"status"`
		Assign struct {
			Text string `xml:",chardata"`
			Var  string `xml:"var"`
		} `xml:"assign"`
	} `xml:"kw"`
	Doc    string      `xml:"doc"`
	Status RobotStatus `xml:"status"`
}

type RobotStatus struct {
	Text      string `xml:",chardata"`
	Status    string `xml:"status,attr"`
	StartTime string `xml:"starttime,attr"`
	EndTime   string `xml:"endtime,attr"`
}

// cypress
var CypressResults = "results"

type CypressTestsuites struct {
	XMLName    xml.Name           `xml:"testsuites"`
	Text       string             `xml:",chardata"`
	Name       string             `xml:"name,attr"`
	Time       string             `xml:"time,attr"`
	Tests      string             `xml:"tests,attr"`
	Failures   string             `xml:"failures,attr"`
	Testsuites []CypressTestsuite `xml:"testsuite"`
}

type CypressTestsuite struct {
	Text      string            `xml:",chardata"`
	Name      string            `xml:"name,attr"`
	Timestamp string            `xml:"timestamp,attr"`
	Tests     string            `xml:"tests,attr"`
	File      string            `xml:"file,attr"`
	Time      float64           `xml:"time,attr"`
	Failures  string            `xml:"failures,attr"`
	Testcases []CypressTestcase `xml:"testcase"`
}

type CypressTestcase struct {
	Text      string           `xml:",chardata"`
	Name      string           `xml:"name,attr"`
	Time      float64          `xml:"time,attr"`
	Classname string           `xml:"classname,attr"`
	Failures  []CypressFailure `xml:"failure"`
}

type CypressFailure struct {
	Text    string `xml:",chardata"`
	Message string `xml:"message,attr"`
	Type    string `xml:"type,attr"`
}

aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
type TestResult struct {
	TestSetId uint `json:"testSetId" yaml:"testSetId"`

	Version float64 `json:"version" yaml:"version"`
	Name    string  `json:"name" yaml:"name"`
	Code    int     `json:"code"`
	Msg     string  `json:"msg"`

	StartTime time.Time `json:"startTime" yaml:"startTime"`
	EndTime   time.Time `json:"endTime" yaml:"endTime"`
	Duration  int       `json:"duration" yaml:"duration"` // sec

	TotalNum  int `json:"totalNum" yaml:"totalNum"`
	PassNum   int `json:"passNum" yaml:"passNum"`
	FailNum   int `json:"failNum" yaml:"failNum"`
	MissedNum int `json:"missedNum" yaml:"missedNum"`

	Payload interface{} `json:"payload"`
}

func (result *TestResult) Pass(msg string) {
	result.Code = consts.ResultCodeSuccess.Int()
	result.Msg = msg
}
func (result *TestResult) Passf(str string, args ...interface{}) {
	result.Code = consts.ResultCodeSuccess.Int()
	result.Msg = fmt.Sprintf(str+"\n", args...)
}

func (result *TestResult) Fail(msg string) {
	result.Code = consts.ResultCodeFail.Int()
	result.Msg = msg
}

func (result *TestResult) Failf(str string, args ...interface{}) {
	result.Code = consts.ResultCodeFail.Int()
	result.Msg = fmt.Sprintf(str+"\n", args...)
}

func (result *TestResult) IsSuccess() bool {
	return result.Code == consts.ResultCodeSuccess.Int()
}