#c# #unity3d #parallel-processing #nunit
#c# #unity3d #параллельная обработка #nunit
Вопрос:
Я использую Unity 2019.4.4f1 с NUnit 3.5.
Я настроил очень простой параллельный тест между методами, чтобы увидеть, действительно ли это работает, но они выполняются синхронно. Я уже несколько дней изучаю параллельное тестирование NUnit, но чувствую, что упускаю какую-то очень очевидную вещь.
using NUnit.Framework;
using System.Threading;
namespace NUnitTest
{
[TestFixture]
public class ParallelTest
{
[Test]
[Parallelizable]
public void Test01()
{
Debug.Log("Test 1 started");
Thread.Sleep(2000);
Debug.Log("Test 1 ended");
Assert.IsTrue(true);
}
[Test]
[Parallelizable]
public void Test02()
{
Debug.Log("Test 2 started");
Thread.Sleep(2000);
Debug.Log("Test 2 ended");
Assert.IsTrue(true);
}
}
}
В TestRunner я запускаю ParallelTest, чтобы запустить их оба одновременно. Я бы предположил, что общее время выполнения ParallelTest должно составлять около 2 секунд, но вместо этого это 4 секунды.
Мы будем признательны за любой совет.
Комментарии:
1. Что показывает результат теста? Они оба начинаются одновременно и заканчиваются одновременно, или один завершается до начала другого?
2. Кажется, что он простаивает, и они оба получают флажки одновременно.
Ответ №1:
Unity довольно сильно адаптировала фреймворк NUnit. Если и есть что-то, с чем приложения Unity никогда не ладили, так это асинхронный код.
Фреймворк NUnit запускает тесты параллельно, используя многопоточное выполнение тестов, которое, как я полагаю, является первым, что Unity удалила при создании своей адаптации программы запуска тестов.
Если ваш код можно перенести из Unity, а затем импортировать через DLL, я рекомендую вам это сделать. Таким образом, ваши модульные тесты могут использовать необработанный фреймворк NUnit! Это шаблон, который я принял для всех своих проектов.
Короче говоря, я не думаю, что вы сможете.
Комментарии:
1. Спасибо за предупреждение. Было не так много информации о Unity с возможностью параллелизации Nunit 3.5. Если я разделю код в библиотеку dll и импортирую его, вы хотите сказать, что я смогу работать параллельно?
2. Если вы выделите код в отдельную библиотеку DLL и будете выполнять свои тесты, НЕ используя Unity (т.Е. использовать программу запуска тестов Visual Studio), вы сможете запускать их асинхронно. Но это означает, что вы не можете запускать модульные тесты ни с чем, что предоставляет Unity, только с вашим собственным кодом.
Ответ №2:
По словам сотрудника Unity technology, это все еще не поддерживается даже в последней версии. Но ответ, который он дал, добавляет больше деталей.
В настоящее время верно, что мы не поддерживаем выполнение параллельных тестов внутри Unity, потому что в пользовательском раннере, который мы разработали (для поддержки таких вещей, как [UnityTest]), это не реализовано.
[…] API UnityEngine зависит от основного потока — вызов API Unity из фоновых потоков будет (почти) всегда приводить к сбою, поэтому поддержка этого не была приоритетом, поскольку его можно было бы использовать только для тестов, которые не вызывают API Unity. (Асинхронность не помогает, потому что контекст синхронизации в Unity выполняет только асинхронные задачи в главном потоке, в частности, из-за этого ограничения на API).