Как настроить единичные тесты в 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 в качестве ссылки во втором проекте. 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
Наконец-то нашел правильное правильное решение для этого. И все это делается через редактор.
Поэтому наша цель - сделать так, чтобы тестовая сборка ссылалась на сборку реального кода. Для этого вам нужно определить обе сборки, а затем установить ссылку в единицу.
- Создавайте свои тесты как обычно изнутри Unity. С генерацией сборки.
- Перейдите в папку "Сценарии" (обычно "Активы/Сценарии") и щелкните правой кнопкой мыши → Создать определение сборки, там также будет создан файл сборки.
- Перейдите к информации о тестовой сборке в Unity и добавьте ссылку на вашу реальную сборку, а также убедитесь, что она помечена только для платформы Editor.
Вы установлены. Ваши тесты должны быть видимыми и запускаемыми в Unity, и они могут ссылаться на любой другой скрипт.
Имейте в виду, что вы можете безопасно удалить ВСЕ файлы .csproj и .sln в корневой папке, и Unity создаст их заново (также они не должны находиться под контролем исходного кода).
Таким образом, ваш тест на такие изменения всегда должен быть
- Удалите любой файл, связанный с Visual Studio, в папке.
- Выберите Активы → Открыть проект С#. Пусть это сделает свое дело.
- Если все скомпилировано и запущено, а ваши тесты так же хорошо работают, вы все настроите правильно.
Бонус: у нас также есть несколько отладочных проектов в нашем проекте, которые расположены в Assets/DebugScenes/DebugScripts. Создавая для них отдельную сборку и ссылаясь на реальную сборку сценариев (при необходимости) и помечая ее как платформу Editor, мы гарантируем, что эти сценарии никогда не будут включены в нашу сборку без каких-либо дополнительных шагов во время сборки.
Дополнительное чтение. Вы можете подумать, что не хотите создавать сборку для ВСЕХ ваших скриптов, поскольку вы хотите протестировать только некоторые из них. И действительно, вы можете создать сборку для подпапки, но это доставит вам неприятности, так как тогда вам придется создавать ссылку из одной реальной сборки сценариев в другую. Поэтому убедитесь, что все хорошо, аккуратно и имеет смысл...
![Our test and real script assembly infos side-by-side. Game Title has Planetary in it]()