testify (Golang), казалось бы, запускает тестовые наборы одновременно?
По сути, я создал новый тестовый файл в определенном пакете с некоторой базовой структурой теста - без реальных тестов... просто пустой тип структуры, который встраивает suite.Suite, и функцию, которая принимает объект *testing.T и вызывает suite.Run() в указанной структуре. Это сразу же привело к тому, что все остальные наши тесты начали проваливаться неопределенно.
Природа сбоев была связана с нарушениями целостности уникального ключа базы данных при вставках и удалениях в одну базу данных Postgres. Это наводит меня на мысль, что тесты выполнялись одновременно без вызова наших методов настройки для правильной подготовки среды между тестами.
Излишне говорить, что когда я перемещаю этот тестовый файл в другой пакет, все волшебным образом работает!
Кто-нибудь еще сталкивался с этой проблемой раньше и может дать какие-то идеи?
2 ответа
Как оказалось, эта проблема коренится в том, как работает go test, и не имеет никакого отношения к свидетельству. Наши тесты были запущены . /... Это заставляет подчеркивающий инструмент go test запускать тесты в каждом пакете параллельно, как указала Джастинас. После более подробного изучения Stackru ( здесь и здесь) и прочтения активной проблемы testify по этой проблеме, кажется, что лучшее немедленное решение - использовать флаг -p=1, чтобы ограничить количество пакетов, запускаемых параллельно.
Однако до сих пор не объяснено, почему тесты последовательно проходили до добавления этих новых пакетов. Смысл в том, что пакеты / тестовые файлы были отсортированы и запущены таким образом, что параллелизм не был проблемой до добавления новых пакетов / файлов.
Что я обнаружил из моего использования, так это то, что "go test" запускает тестовые случаи одного пакета последовательно (если t.Parallel()
называется), но если вы поставите несколько пакетов (go test ./foo ./bar ./baz
), тесты каждого пакета выполняются параллельно с другими пакетами. Определенно вызвал подобные головные боли с тестированием базы данных для меня.