застрял в Go параллельное тестирование (тестирование автоматизации, связанное с микросервисами) - PullRequest
0 голосов
/ 12 апреля 2020

Я выполняю параллельный тест, используя go test. Это тестирование на основе сценариев и выполнение тестов на основе предоставленных JSON данных.

Пример JSON данных выглядит следующим образом

[
 {
   ID: 1,
   dependency: []
   ...
 },
 {
   ID: 2
   dependency: [1]
   ...
 },
 {
   ID: 3
   dependency: [2]
   ...
 },
 {
   ID: 4
   dependency: [1,2]
   ...
 }
]

Здесь ID - это идентификатор тестового случая, а зависимость - это ссылаясь на тестовые сценарии, которые должны выполняться перед тестовым набором.

Реализована проверка циклических зависимостей, и она проверяет, что циклическая зависимость не включена JSON.

Тестовый код выглядит следующим образом.

    t.Run(file, func(t *testing.T) {
        t.Parallel()
        var tcs []TestCase
        bytes := ReadFile(file, t)
        json.Unmarshal(bytes, &tcs)

        CheckCircularDependencies(tcs, t) // check circular dependency graph

        for idx, tc := range tcs {
            queues = append(queues, queitem{
                idx:             idx
                stepID:          step.ID,
                status:          NotStarted,
                ....
            })
        }
        for idx, tc := range tcs {
            UpdateWorkQueStatus(tc, InProgress, t)
            ProcessQueItem(tc, t)
        }
    })

func ProcessQueItem(tc TestCase, t *testing.T) {
        WaitForDependencies(tc, t) // this waits for all the dependency test cases to be finished

        ...
        // DO TEST code which takes about 2-3s
        // Provide a command to microservices
        // Wait for 1-2s for the command to be processed
        // If not processed within 1-2s then wait again for 1-2s
        // Once command is processed, just check the result and finish test case

        UpdateWorkQueStatus(tc, Done, t)
    })
}

func WaitForDependencies(tc TestCase, t *testing.T) {
    if !GoodToGoForTestCase(tc, t) {
        SleepForAWhile()
        WaitForDependencies(tc, t)
    }
}

func SleepForAWhile() {
    time.Sleep(100 * time.Millisecond)
}

Параллельное тестирование Поведение: Это работает, как и ожидалось, на моем персональном компьютере с несколькими процессорами. Но когда он работает в Google Cloud (может быть, 1 процессор), он зависает и не go вперед на 10 минут.

Текущее решение: Выполнение тестов без параллелизма и выполнение с помощью порядок идентификаторов. (только что удален t.Parallel() вызов функции, чтобы избежать параллелизма)

Проблема: Это последовательное решение требует более чем в 3 раза больше, чем параллельное решение, так как большая часть времени тестирования основана на времени ожидания. Сам тестовый код также содержит вызов функции ожидания.

Мой вопрос
1. Правильна ли эта архитектура и может ли она корректно работать на процессоре с 1 процессором?
2. Если эта архитектура может работать, в чем будет проблема застрять?

...