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:
2026-06-08 01:58:04 +05:00
parent b4574f9df1
commit d1e45c7686
12 changed files with 346 additions and 118 deletions
@@ -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)