Unity / C #, NUnit распараллеливаемый атрибут

#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).