Как настроить единичные тесты в Unity и исправить ошибку сбоя сборки?

Я создал следующую структуру:

├── Assets
├── Scenes
├── Scripts
│   └── MyExample.cs
├── Tests
│   ├── MyExampleTest.cs
│   └── Tests.asmdef

Теперь, когда я нажимаю кнопку "Запустить все" в окне "Тест-Runner" в Unity, у меня есть следующая ошибка:

The type or namespace name `MyExample' could not be found. Are you missing an assembly reference?

В Visual Studio у меня есть два проекта:

  • Assembly-CSharp (содержащий src)

  • Тесты (содержащие тесты)

Я добавил Assembly-CSharp в качестве ссылки во втором проекте. Visual Studio может создавать решение без ошибок.

Кто-нибудь знает, как правильно настроить регрессию UnitTest для проекта Unity?

Это Tests.asmdef

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ]
}

MyExampleTest.cs

using UnityEngine;
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;
using abc;

public class MyExampleTest{

    [Test]
    public void NewTestScriptSimplePasses() {
        // Use the Assert class to test conditions.
    }

    [UnityTest]
    public IEnumerator NewTestScriptWithEnumeratorPasses() {
        abc.Example m;
        Assert.That(false);
        yield return null;
    }
}

MyExample.cs

namespace abc
{
    public class Example
    {


    }
}

Ответ 1

Попробуйте использовать встроенный пользовательский интерфейс Test Runner для настройки папки Test Assembly и первого сценария тестирования.

Используйте Window → Test Runner → EditMode → "Create Test Assembly Folder", и, как только вы перейдете к новой папке с тестовой сборкой, используйте кнопку " Create Test Script in current folder.

В частности, в вашем Tests.asmdef отсутствует "Редактор", Tests.asmdef по сравнению с настройкой по умолчанию (в Unity 2018.1).

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ],
    "includePlatforms": [
        "Editor"
    ]
}

Вам не нужно ничего делать вручную в проекте Visual Studio для настройки ваших тестов.

Обратите внимание, что когда мой файл сборки установлен на "Любая платформа", как показано ниже (как в вашем вопросе):

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ]
}

Мои тесты не отображаются в окне Test Runner.

Когда мой файл сборки явно настроен на включение только платформы "Редактор" (в соответствии с моим предыдущим примером), мои тесты правильно отображаются в окне "Средство выполнения тестов".

(Это поведение кажется мне немного нелогичным.)


Вам также необходимо настроить определение сборки для ваших сценариев. В папке " Scripts " создайте файл определения сборки MyScriptAssembly.asmdef (используя меню "Unity" " MyScriptAssembly.asmdef Assets → Create → Assembly Definition или вручную):

{
    "name": "MyScriptAssembly"
}

Затем убедитесь, что ваш Tests.asmdef ссылается на Tests.asmdef скрипта:

{
    "name": "Tests",
    "references": [
        "MyScriptAssembly"
    ],
    "optionalUnityReferences": [
        "TestAssemblies"
    ],
    "includePlatforms": [
        "Editor"
    ],
    "excludePlatforms": [],
    "allowUnsafeCode": false
}

Вы также можете настроить это в окне инспектора Unity Editor. Смотрите "Ссылки" в Инспекторе при выборе файла .asmdef:

assembly definition inspector window

(Для получения дополнительной информации см. Документацию Unity по файлам определений сборки)

Ответ 2

Наконец-то нашел правильное правильное решение для этого. И все это делается через редактор.

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

  1. Создавайте свои тесты как обычно изнутри Unity. С генерацией сборки.
  2. Перейдите в папку "Сценарии" (обычно "Активы/Сценарии") и щелкните правой кнопкой мыши → Создать определение сборки, там также будет создан файл сборки.
  3. Перейдите к информации о тестовой сборке в Unity и добавьте ссылку на вашу реальную сборку, а также убедитесь, что она помечена только для платформы Editor.

Вы установлены. Ваши тесты должны быть видимыми и запускаемыми в Unity, и они могут ссылаться на любой другой скрипт.


Имейте в виду, что вы можете безопасно удалить ВСЕ файлы .csproj и .sln в корневой папке, и Unity создаст их заново (также они не должны находиться под контролем исходного кода).

Таким образом, ваш тест на такие изменения всегда должен быть

  1. Удалите любой файл, связанный с Visual Studio, в папке.
  2. Выберите Активы → Открыть проект С#. Пусть это сделает свое дело.
  3. Если все скомпилировано и запущено, а ваши тесты так же хорошо работают, вы все настроите правильно.

Бонус: у нас также есть несколько отладочных проектов в нашем проекте, которые расположены в Assets/DebugScenes/DebugScripts. Создавая для них отдельную сборку и ссылаясь на реальную сборку сценариев (при необходимости) и помечая ее как платформу Editor, мы гарантируем, что эти сценарии никогда не будут включены в нашу сборку без каких-либо дополнительных шагов во время сборки.


Дополнительное чтение. Вы можете подумать, что не хотите создавать сборку для ВСЕХ ваших скриптов, поскольку вы хотите протестировать только некоторые из них. И действительно, вы можете создать сборку для подпапки, но это доставит вам неприятности, так как тогда вам придется создавать ссылку из одной реальной сборки сценариев в другую. Поэтому убедитесь, что все хорошо, аккуратно и имеет смысл...


Our test and real script assembly infos side-by-side. Game Title has Planetary in it