On branch main
modified: main_dc/yalarba/api_yal/cmd/testrunner/main.go modified: main_dc/yalarba/api_yal/cmd/testrunner/runner.go modified: main_dc/yalarba/api_yal/tests/integration/account_test.go modified: main_dc/yalarba/api_yal/tests/integration/appeal_test.go modified: main_dc/yalarba/api_yal/tests/integration/auth_test.go modified: main_dc/yalarba/api_yal/tests/integration/comment_test.go modified: main_dc/yalarba/api_yal/tests/integration/feedback_test.go modified: main_dc/yalarba/api_yal/tests/integration/object_test.go modified: main_dc/yalarba/api_yal/tests/integration/rating_test.go deleted: main_dc/yalarba/api_yal/tests/testutils/client.go modified: main_dc/yalarba/api_yal/tests/testutils/fixtures.go modified: main_dc/yalarba/api_yal/tests/testutils/setup.go write comments for and into test's functions
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// cmd/testrunner/runner.go - Дополнительные утилиты
|
||||
// cmd/testrunner/runner.go - Дополнительные утилиты для тестового раннера
|
||||
|
||||
package main
|
||||
|
||||
@@ -12,16 +12,20 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// Сохранение результатов в JSON
|
||||
// saveResultsToJSON сохраняет результаты тестов в JSON файл
|
||||
// Параметры:
|
||||
// - results: массив результатов тестов
|
||||
// - filename: имя файла для сохранения
|
||||
// Возвращает: ошибку при сохранении
|
||||
func saveResultsToJSON(results []TestResult, filename string) error {
|
||||
type JSONResult struct {
|
||||
Timestamp string `json:"timestamp"`
|
||||
Results []TestResult `json:"results"`
|
||||
Timestamp string `json:"timestamp"` // Время сохранения отчета
|
||||
Results []TestResult `json:"results"` // Результаты тестов
|
||||
Summary struct {
|
||||
Total int `json:"total"`
|
||||
Passed int `json:"passed"`
|
||||
Failed int `json:"failed"`
|
||||
PassRate float64 `json:"pass_rate"`
|
||||
Total int `json:"total"` // Общее количество тестов
|
||||
Passed int `json:"passed"` // Количество пройденных
|
||||
Failed int `json:"failed"` // Количество проваленных
|
||||
PassRate float64 `json:"pass_rate"` // Процент прохождения
|
||||
} `json:"summary"`
|
||||
}
|
||||
|
||||
@@ -29,6 +33,7 @@ func saveResultsToJSON(results []TestResult, filename string) error {
|
||||
jsonResult.Timestamp = time.Now().Format(time.RFC3339)
|
||||
jsonResult.Results = results
|
||||
|
||||
// Подсчет статистики
|
||||
for _, r := range results {
|
||||
jsonResult.Summary.Total++
|
||||
if r.Passed {
|
||||
@@ -38,6 +43,7 @@ func saveResultsToJSON(results []TestResult, filename string) error {
|
||||
}
|
||||
}
|
||||
|
||||
// Расчет процента прохождения
|
||||
if jsonResult.Summary.Total > 0 {
|
||||
jsonResult.Summary.PassRate = float64(jsonResult.Summary.Passed) / float64(jsonResult.Summary.Total) * 100
|
||||
}
|
||||
@@ -50,30 +56,38 @@ func saveResultsToJSON(results []TestResult, filename string) error {
|
||||
return os.WriteFile(filename, data, 0644)
|
||||
}
|
||||
|
||||
// Создание отчета в формате JUnit XML (для CI/CD)
|
||||
// generateJUnitReport создает отчет в формате JUnit XML для CI/CD систем
|
||||
// Параметры:
|
||||
// - results: массив результатов тестов
|
||||
// - filename: имя файла для сохранения
|
||||
// Возвращает: ошибку при сохранении
|
||||
func generateJUnitReport(results []TestResult, filename string) error {
|
||||
// TestCase представляет один тестовый случай в JUnit формате
|
||||
type TestCase struct {
|
||||
Name string `xml:"name,attr"`
|
||||
Classname string `xml:"classname,attr"`
|
||||
Time float64 `xml:"time,attr"`
|
||||
Failure *string `xml:"failure,omitempty"`
|
||||
Name string `xml:"name,attr"` // Название теста
|
||||
Classname string `xml:"classname,attr"` // Класс теста
|
||||
Time float64 `xml:"time,attr"` // Время выполнения
|
||||
Failure *string `xml:"failure,omitempty"` // Информация об ошибке (опционально)
|
||||
}
|
||||
|
||||
// TestSuite представляет набор тестов в JUnit формате
|
||||
type TestSuite struct {
|
||||
Name string `xml:"name,attr"`
|
||||
Tests int `xml:"tests,attr"`
|
||||
Failures int `xml:"failures,attr"`
|
||||
Time float64 `xml:"time,attr"`
|
||||
TestCases []TestCase `xml:"testcase"`
|
||||
Name string `xml:"name,attr"` // Название набора
|
||||
Tests int `xml:"tests,attr"` // Количество тестов
|
||||
Failures int `xml:"failures,attr"` // Количество провалов
|
||||
Time float64 `xml:"time,attr"` // Общее время
|
||||
TestCases []TestCase `xml:"testcase"` // Список тестов
|
||||
}
|
||||
|
||||
// TestSuites корневой элемент JUnit отчета
|
||||
type TestSuites struct {
|
||||
XMLName string `xml:"testsuites"`
|
||||
TestSuites []TestSuite `xml:"testsuite"`
|
||||
XMLName string `xml:"testsuites"` // Имя корневого элемента
|
||||
TestSuites []TestSuite `xml:"testsuite"` // Список наборов тестов
|
||||
}
|
||||
|
||||
var suites TestSuites
|
||||
|
||||
// Конвертируем результаты в JUnit формат
|
||||
for _, result := range results {
|
||||
suite := TestSuite{
|
||||
Name: result.Suite,
|
||||
@@ -87,6 +101,7 @@ func generateJUnitReport(results []TestResult, filename string) error {
|
||||
Time: result.Duration.Seconds(),
|
||||
}
|
||||
|
||||
// Добавляем информацию об ошибке если тест провален
|
||||
if !result.Passed {
|
||||
suite.Failures = 1
|
||||
failureMsg := result.Error.Error()
|
||||
@@ -97,6 +112,7 @@ func generateJUnitReport(results []TestResult, filename string) error {
|
||||
suites.TestSuites = append(suites.TestSuites, suite)
|
||||
}
|
||||
|
||||
// Маршалинг в XML и сохранение
|
||||
xmlData, err := xml.MarshalIndent(suites, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -105,7 +121,12 @@ func generateJUnitReport(results []TestResult, filename string) error {
|
||||
return os.WriteFile(filename, append([]byte(xml.Header), xmlData...), 0644)
|
||||
}
|
||||
|
||||
// Функция для запуска определенных тестов по тегам
|
||||
// runTestsByTag запускает тесты с определенным тегом (build tag)
|
||||
// Позволяет фильтровать тесты по тегам
|
||||
// Параметры:
|
||||
// - tag: тег для фильтрации тестов
|
||||
// - config: конфигурация запуска
|
||||
// Возвращает: массив результатов тестов
|
||||
func runTestsByTag(tag string, config *Config) []TestResult {
|
||||
fmt.Printf("%s🏷️ Running tests with tag: %s%s\n", colors.Yellow, tag, colors.Reset)
|
||||
|
||||
@@ -128,7 +149,8 @@ func runTestsByTag(tag string, config *Config) []TestResult {
|
||||
return []TestResult{result}
|
||||
}
|
||||
|
||||
// Создание скрипта для CI/CD
|
||||
// generateCIScript создает bash скрипт для запуска тестов в CI/CD
|
||||
// Скрипт автоматически запускает сервер, выполняет тесты и останавливает сервер
|
||||
func generateCIScript() {
|
||||
ciScript := `#!/bin/bash
|
||||
# CI/CD script for API tests
|
||||
@@ -153,16 +175,28 @@ kill $SERVER_PID
|
||||
echo "Tests completed"
|
||||
`
|
||||
|
||||
// Создаем директорию scripts если ее нет
|
||||
if err := os.MkdirAll("scripts", 0755); err != nil {
|
||||
fmt.Printf("Failed to create scripts directory: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Сохраняем скрипт и делаем его исполняемым
|
||||
if err := os.WriteFile("scripts/ci_test.sh", []byte(ciScript), 0755); err != nil {
|
||||
fmt.Printf("Failed to generate CI script: %v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Функция для сравнения результатов тестов
|
||||
// compareResults сравнивает результаты текущего запуска с предыдущим
|
||||
// Показывает изменения в прохождении тестов и времени выполнения
|
||||
// Параметры:
|
||||
// - current: текущие результаты тестов
|
||||
// - previous: предыдущие результаты для сравнения
|
||||
func compareResults(current, previous []TestResult) {
|
||||
fmt.Printf("%s📊 Test Result Comparison%s\n", colors.Cyan, colors.Reset)
|
||||
fmt.Println(strings.Repeat("-", 50))
|
||||
|
||||
// Создаем карты для быстрого доступа к результатам
|
||||
currentMap := make(map[string]TestResult)
|
||||
for _, r := range current {
|
||||
currentMap[r.Suite] = r
|
||||
@@ -173,13 +207,16 @@ func compareResults(current, previous []TestResult) {
|
||||
prevMap[r.Suite] = r
|
||||
}
|
||||
|
||||
// Сравниваем каждый набор тестов
|
||||
for name, currentResult := range currentMap {
|
||||
prevResult, exists := prevMap[name]
|
||||
if !exists {
|
||||
// Новый набор тестов
|
||||
fmt.Printf("%s➕ New test suite: %s%s\n", colors.Green, name, colors.Reset)
|
||||
continue
|
||||
}
|
||||
|
||||
// Сравниваем статус прохождения
|
||||
if currentResult.Passed != prevResult.Passed {
|
||||
if currentResult.Passed {
|
||||
fmt.Printf("%s✅ Fixed: %s (was failing)%s\n", colors.Green, name, colors.Reset)
|
||||
@@ -187,7 +224,7 @@ func compareResults(current, previous []TestResult) {
|
||||
fmt.Printf("%s❌ Regression: %s (was passing)%s\n", colors.Red, name, colors.Reset)
|
||||
}
|
||||
} else if currentResult.Passed {
|
||||
// Сравнение времени выполнения
|
||||
// Сравнение времени выполнения для успешных тестов
|
||||
diff := currentResult.Duration - prevResult.Duration
|
||||
if diff > 0 {
|
||||
fmt.Printf("%s⚠️ Slower: %s (+%v)%s\n", colors.Yellow, name, diff.Round(time.Millisecond), colors.Reset)
|
||||
|
||||
Reference in New Issue
Block a user