Я выполняю параллельный тест, используя 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. Если эта архитектура может работать, в чем будет проблема застрять?