【问题标题】:How to set up unit tests in Unity and fix missing assembly reference error?如何在 Unity 中设置单元测试并修复缺少的程序集引用错误?
【发布时间】:2018-10-17 19:55:24
【问题描述】:

我创建了以下结构:

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

现在,当我在 Unity 的 Test Runner 窗口中单击 Run All 时,出现以下错误:

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 能够无错误地构建解决方案。

有人知道如何为 Unity 项目正确设置 UnitTest 回归吗?

这是 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
    {


    }
}

【问题讨论】:

  • 您使用的是哪个版本的 Unity?以防万一,您的 Tests.asmdef 文件是否引用了仅作为编辑器的测试程序集?否则,请注意 Unity 单元测试需要位于 Editor 文件夹中。
  • @sonny 我用文件 Tests.asmdef 更新了问题。 Unity 版本 2018.1.0f2
  • 在Visual Studio中添加引用似乎在Unity中无效。当我关闭并重新打开时,不再设置参考

标签: c# unit-testing unity3d


【解决方案1】:

尝试使用内置的 Test Runner UI 设置您的测试程序集文件夹和第一个测试脚本。

使用Window -> Test Runner -> EditMode -> "Create Test Assembly Folder",导航到新的测试程序集文件夹后,使用Create Test Script in current folder 按钮。

特别是,与默认设置(在 Unity 2018.1 中)相比,您的 Tests.asmdef 缺少“编辑器”包含。

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

您不必为了设置测试而在 Visual Studio 项目中手动执行任何操作。

请注意,当我的程序集文件设置为“任何平台”时,如下所示(如您的问题):

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

我的测试没有显示在 Test Runner 窗口中。

当我的程序集文件明确设置为仅包含“编辑器”平台时(根据我之前的示例),我的测试会正确显示在“测试运行器”窗口中。

(这种行为对我来说似乎有点违反直觉。)


您还需要为您的脚本设置一个程序集定义。在您的Scripts 文件夹下,创建一个程序集定义文件MyScriptAssembly.asmdef(使用Unity 菜单Assets -> Create -> Assembly Definition 或手动):

{
    "name": "MyScriptAssembly"
}

然后,确保您的 Tests.asmdef 引用您的脚本程序集:

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

您也可以在 Unity Editor 检查器窗口中进行设置。选择 .asmdef 文件时,请参阅检查器中的“参考”:

(详情请见Unity's documentation on assembly definition files

【讨论】:

  • 感谢您的帮助。我按照您的过程创建了一个新的 Tests 文件夹:我仍然有相同的编译错误。空测试工作正常,但我不能使用我的示例类
  • 也许这是您的 MyExample.cs 和 MyExampleTest.cs 所特有的。你能用这些文件的代码更新你的问题吗?
  • 我认为问题在于 Unity 如何创建项目引用。我更新了问题
  • 我遇到了其他一些奇怪的错误。我按照您的建议重新创建了该项目,最后,它正在工作。我真的很感谢你 :) 问题在于缺少大会定义。
  • 感谢您的精彩回答!
【解决方案2】:

终于找到了正确的解决方案。一切都是通过编辑器完成的。

所以我们的目标是让测试程序集引用真实代码程序集。为此,您需要定义两个程序集,然后统一设置引用。

  1. 照常在 Unity 内部创建测试。随着程序集的生成。
  2. 转到您的脚本文件夹(通常是 Assets/Scripts)并右键单击 -> 创建程序集定义这也会在其中创建一个程序集文件。
  3. 转到您的测试程序集信息在 Unity 中并添加参考到您的真实程序集,并确保它仅标记为 编辑器 平台。

你准备好了。您的测试应该在 Unity 中可见和可运行,并且它们可以引用任何其他脚本。


请记住,您可以安全地删除根文件夹中的所有 .csproj 和 .sln 文件,Unity 会重新创建它们(它们也不应该在源代码管理中)。

因此,您要进行此类更改的测试应该始终是

  1. 删除文件夹中所有与 Visual Studio 相关的文件。
  2. 选择资产 -> 打开 C# 项目。让它做它的事。
  3. 如果一切都可以编译和运行,并且您的测试也能正常运行,那么您的设置就很好了。

奖励:我们的项目中还有几个调试项目,它们位于 Assets/DebugScenes/DebugScripts。通过为它们创建一个单独的程序集并让它引用真实的脚本程序集(如果需要)并将其标记为 Editor 平台,我们确保这些脚本永远不会包含在我们的构建中,而在构建过程中没有任何额外的步骤。


额外阅读。您可能会认为您不想为所有脚本创建程序集,因为您只想测试其中的一些。的确,您可以为子文件夹创建程序集,但这会给您带来麻烦,因为您必须创建从一个真实脚本程序集到另一个的引用。所以请确保一切都很好,整洁并且有意义......


【讨论】:

  • 当我将程序集定义添加到我的脚本时,它会抱怨在当前上下文中不存在“OVRInput”(这是一个 Oculus 裂痕类)。如何强制 Unity 添加对相关 OVR dll 的引用并不明显。
  • 在新的统一 (2019.1) 中,程序集定义中有一个额外的标志,即“包含在默认程序集中”或类似的东西。它没有显示在上面的图片中,因为它当时不存在。尝试在您的 OV 程序集定义上启用它。
  • 如果 Script 文件夹中有 Editor 子文件夹,这似乎不起作用。我想我必须创建 2 个程序集定义,1 个用于引擎,1 个用于编辑器。但是改变我所有的层次结构来做到这一点是非常痛苦的,有什么解决方案吗?
【解决方案3】:

Lite,“零组件”,替代设置:

Assets
├── Scenes
├── Scripts
│   └── MyGameScript.cs
├── Editor
│   └── MyGameScriptTests.cs

Editor 目录中的所有脚本都可以引用NUnit.Framework 命名空间,这些测试将显示在Test Runner 窗口中。

它的主要优点是简单。我确信某处存在缺点,但对于日常项目,这是一种祝福;零麻烦设置它,只是工作。

【讨论】:

  • 哦,开枪!是的,这很好用。我的一个抱怨是您似乎无法运行 PlayMode 测试,这是一个令人沮丧的缺点。
  • 而测试最终可能会与其他代码捆绑在最终构建中。
  • @ŠtefanSchindler 幸运的是“编辑器”目录脚本被排除在构建之外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2015-04-09
  • 2021-09-06
  • 2015-03-30
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多